最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RedisAPI原子性操作及原理解析

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

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

原子性

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

對(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的連接、查詢(xún)的操作,就是線程。

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

  • 資源(如打開(kāi)文件):進(jìn)程間的資源相互獨(dú)立,同一進(jìn)程的各線程間共享資源。某進(jìn)程的線程在其他進(jìn)程不可見(jiàn)。
  • 通信:進(jìn)程間通信:消息傳遞、同步、共享內(nèi)存、遠(yuǎn)程過(guò)程調(diào)用、管道。線程間通信:直接讀寫(xiě)進(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ù)庫(kù)的表現(xiàn)是一樣的。

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

總結(jié)

綜上所述,對(duì)Redis來(lái)說(shuō),執(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í)是要保證批量操作的原子性。

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

相關(guān)文章

  • Redis入門(mén)教程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Redis入門(mén)教程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Redis是一款開(kāi)源的、高性能的鍵-值存儲(chǔ)(key-value store)。下面通過(guò)本文大家分享Redis入門(mén)教程,感興趣的朋友參考下吧
    2017-08-08
  • redis中hiredis-API函數(shù)的調(diào)用方法

    redis中hiredis-API函數(shù)的調(diào)用方法

    這篇文章主要介紹了redis中hiredis-API函數(shù)的調(diào)用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-09-09
  • 使用Docker部署Redis并配置持久化與密碼保護(hù)的詳細(xì)步驟

    使用Docker部署Redis并配置持久化與密碼保護(hù)的詳細(xì)步驟

    本文將詳細(xì)介紹如何使用 Docker 部署 Redis,并通過(guò) redis.conf 配置文件實(shí)現(xiàn)數(shù)據(jù)持久化和密碼保護(hù),適合在生產(chǎn)環(huán)境中使用,文章通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Redis實(shí)現(xiàn)訂單過(guò)期刪除的方法步驟

    Redis實(shí)現(xiàn)訂單過(guò)期刪除的方法步驟

    本文主要介紹了Redis實(shí)現(xiàn)訂單過(guò)期刪除的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis6.2.6生產(chǎn)環(huán)境redis.conf單機(jī)配置

    Redis6.2.6生產(chǎn)環(huán)境redis.conf單機(jī)配置

    在實(shí)際生產(chǎn)環(huán)境中,為了保障 Redis 的穩(wěn)定性和高性能,我們往往需要對(duì)默認(rèn)配置進(jìn)行一系列優(yōu)化,本文主要介紹了Redis6.2.6生產(chǎn)環(huán)境redis.conf單機(jī)配置,感興趣的可以了解一下
    2025-04-04
  • Redis特殊數(shù)據(jù)類(lèi)型Geospatial地理空間

    Redis特殊數(shù)據(jù)類(lèi)型Geospatial地理空間

    這篇文章主要為大家介紹了Redis特殊數(shù)據(jù)類(lèi)型Geospatial地理空間,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • redis使用skiplist跳表的原因解析

    redis使用skiplist跳表的原因解析

    經(jīng)常會(huì)有人問(wèn)這個(gè)問(wèn)題,redis中為什么要使用跳表?這個(gè)問(wèn)題,redis作者已經(jīng)給出過(guò)明確答案,今天通過(guò)本文再給大家講解下這個(gè)問(wèn)題,對(duì)redis?skiplist跳表知識(shí)感興趣的朋友一起看看吧
    2022-10-10
  • Docker + Redis 部署集群的實(shí)現(xiàn)步驟

    Docker + Redis 部署集群的實(shí)現(xiàn)步驟

    本文詳細(xì)介紹了在三臺(tái)服務(wù)器上部署高可用Redis集群的完整流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 基于redis樂(lè)觀鎖實(shí)現(xiàn)并發(fā)排隊(duì)

    基于redis樂(lè)觀鎖實(shí)現(xiàn)并發(fā)排隊(duì)

    這篇文章主要介紹了基于redis樂(lè)觀鎖實(shí)現(xiàn)并發(fā)排隊(duì)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Redis+Hbase+RocketMQ?實(shí)際使用問(wèn)題案例講解

    Redis+Hbase+RocketMQ?實(shí)際使用問(wèn)題案例講解

    這篇文章主要介紹了Redis+Hbase+RocketMQ?實(shí)際使用問(wèn)題案例分享,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

怀集县| 英德市| 阳江市| 万盛区| 新平| 嵩明县| 响水县| 奉化市| 肥东县| 博白县| 冀州市| 阜新| 全州县| 四平市| 广宁县| 庆元县| 木兰县| 钦州市| 滦平县| 隆子县| 威信县| 绥芬河市| 南漳县| 林口县| 台南市| 旬阳县| 新丰县| 北辰区| 拜城县| 额尔古纳市| 喀喇沁旗| 射洪县| 潜江市| 玉环县| 云浮市| 紫阳县| 时尚| 遂川县| 竹溪县| 铅山县| 信阳市|