欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RedisAPI原子性操作及原理解析

 更新時間:2020年12月11日 09:21:14   作者:ノGHJ  
這篇文章主要介紹了RedisAPI原子性操作及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

在學(xué)習(xí)Redis的常用操作時,經(jīng)??吹浇榻B說,Redis的set、get以及hset等等命令的執(zhí)行都是原子性的,但是令自己百思不得其解的是,為什么這些操作是原子性的?

原子性

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

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

Redis操作原子性的原因

Redis的操作之所以是原子性的,是因為Redis是單線程的。

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

進(jìn)程與線程

進(jìn)程

計算機中已執(zhí)行程序的實體。【維基百科】。比如,一個啟動了的php-fpm,就是一個進(jìn)程。

線程

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

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

  • 資源(如打開文件):進(jìn)程間的資源相互獨立,同一進(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ù)一個一個地做,必須做完一個任務(wù)后,才會去做另一個任務(wù)。

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

Redis的API是原子性的操作,那么多個命令在并發(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);
  }

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

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

總結(jié)

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    這篇文章主要為大家詳細(xì)介紹了Redis中的BigKey如何發(fā)現(xiàn)和處理,文中給大家詳細(xì)講解了BigKey危害和如何解決這些問題,文章通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 利用redis實現(xiàn)聊天記錄轉(zhuǎn)存功能的全過程

    利用redis實現(xiàn)聊天記錄轉(zhuǎn)存功能的全過程

    社交類軟件聊天功能必不可少,聊天記錄存儲的方式也比較多,比如文本,數(shù)據(jù)庫,云等等,但是最好的選擇還是redis進(jìn)行存儲,這篇文章主要給大家介紹了關(guān)于如何利用redis實現(xiàn)聊天記錄轉(zhuǎn)存功能的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Redis類型type與編碼encoding原理及使用示例

    Redis類型type與編碼encoding原理及使用示例

    這篇文章主要為大家介紹了Redis類型type與編碼encoding原理及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Redis Lua腳本的使用教程

    Redis Lua腳本的使用教程

    在Redis的學(xué)習(xí)中,Lua腳本是一項強大的高級特性,它允許用戶在Redis中執(zhí)行復(fù)雜的操作,本文就來介紹一下Redis Lua,腳本的使用教程,感興趣的可以了解一下
    2024-03-03
  • Redis?哨兵模式的實現(xiàn)詳解

    Redis?哨兵模式的實現(xiàn)詳解

    本文主要介紹了Redis?哨兵模式的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 控制Redis的hash的field中的過期時間

    控制Redis的hash的field中的過期時間

    這篇文章主要介紹了控制Redis的hash的field中的過期時間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Redis的4種緩存模式分享

    Redis的4種緩存模式分享

    這篇文章主要介紹了Redis的4種緩存模式分享,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-07-07
  • Redis鎖完美解決高并發(fā)秒殺問題

    Redis鎖完美解決高并發(fā)秒殺問題

    本文主要介紹了Redis鎖完美解決高并發(fā)秒殺問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 淺談Redis常見延遲問題定位與分析

    淺談Redis常見延遲問題定位與分析

    大部分時候,redis延遲很低,但是在某些時刻,有些redis實例會出現(xiàn)很高的響應(yīng)延時,本文主要介紹了淺談Redis常見延遲問題定位與分析,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • redis模糊批量刪除key的方法

    redis模糊批量刪除key的方法

    這篇文章主要介紹了redis模糊批量清除key的操作方法,包括命令行刪除和golang代碼刪除,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12

最新評論