溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Redis數(shù)據(jù)庫實(shí)現(xiàn)API原子性

發(fā)布時(shí)間:2020-12-11 14:06:08 來源:億速云 閱讀:292 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在Redis數(shù)據(jù)庫實(shí)現(xiàn)API原子性,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

原子性

原子性是數(shù)據(jù)庫的事務(wù)中的特性。在數(shù)據(jù)庫事務(wù)的情景下,原子性指的是:一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)?!揪S基百科】

對(duì)于Redis而言,命令的原子性指的是:一個(gè)操作的不可以再分,操作要么執(zhí)行,要么不執(zhí)行。

Redis操作原子性的原因

Redis的操作之所以是原子性的,是因?yàn)镽edis是單線程的。

由于對(duì)操作系統(tǒng)相關(guān)的知識(shí)不是很熟悉,從上面這句話并不能真正理解Redis操作是原子性的原因,進(jìn)一步查閱進(jìn)程與線程的概念及其區(qū)別。

進(jìn)程與線程

進(jìn)程

計(jì)算機(jī)中已執(zhí)行程序的實(shí)體?!揪S基百科】。比如,一個(gè)啟動(dòng)了的php-fpm,就是一個(gè)進(jìn)程。

線程

操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單元。它被包含在進(jìn)程之中,是進(jìn)程的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)?!揪S基百科】。比如,mysql運(yùn)行時(shí),mysql啟動(dòng)后,該mysql服務(wù)就是一個(gè)進(jìn)程,而mysql的連接、查詢的操作,就是線程。

進(jìn)程與線程的區(qū)別

  • 資源(如打開文件):進(jìn)程間的資源相互獨(dú)立,同一進(jìn)程的各線程間共享資源。某進(jìn)程的線程在其他進(jìn)程不可見。

  • 通信:進(jìn)程間通信:消息傳遞、同步、共享內(nèi)存、遠(yuǎn)程過程調(diào)用、管道。線程間通信:直接讀寫進(jìn)程數(shù)據(jù)段(需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性)。

  • 調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。

線程,是操作系統(tǒng)最小的執(zhí)行單元,在單線程程序中,任務(wù)一個(gè)一個(gè)地做,必須做完一個(gè)任務(wù)后,才會(huì)去做另一個(gè)任務(wù)。

Redis在并發(fā)中的表現(xiàn)

Redis的API是原子性的操作,那么多個(gè)命令在并發(fā)中也是原子性的嗎?

看看下面這段代碼:

  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);
  for($i = 0; $i < 1000; $i++) {
      $num = (int) $redis->get('val');
      $num++;
      $redis->set('val', $num);
      usleep(10000);
  }

用兩個(gè)終端執(zhí)行上面的程序,發(fā)現(xiàn)val的結(jié)果是小于2000的值,那么可以知道,在程序中執(zhí)行多個(gè)Redis命令并非是原子性的,這也和普通數(shù)據(jù)庫的表現(xiàn)是一樣的。

如果想在上面的程序中實(shí)現(xiàn)原子性,可以將get和set改成單命令操作,比如incr,或者使用Redis的事務(wù),或者使用Redis+Lua的方式實(shí)現(xiàn)。

總結(jié)

綜上所述,對(duì)Redis來說,執(zhí)行g(shù)et、set以及eval等API,都是一個(gè)一個(gè)的任務(wù),這些任務(wù)都會(huì)由Redis的線程去負(fù)責(zé)執(zhí)行,任務(wù)要么執(zhí)行成功,要么執(zhí)行失敗,這就是Redis的命令是原子性的原因。

Redis本身提供的所有API都是原子操作,Redis中的事務(wù)其實(shí)是要保證批量操作的原子性。

上述就是小編為大家分享的如何在Redis數(shù)據(jù)庫實(shí)現(xiàn)API原子性了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI