主頁 > 知識庫 > RedisAPI原子性操作及原理解析

RedisAPI原子性操作及原理解析

熱門標(biāo)簽:貴州電銷卡外呼系統(tǒng) 魔獸2青云地圖標(biāo)注 十堰營銷電銷機(jī)器人哪家便宜 日本中國地圖標(biāo)注 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 宿遷便宜外呼系統(tǒng)平臺 超呼電話機(jī)器人 鄭州人工智能電銷機(jī)器人系統(tǒng) 山東外呼銷售系統(tǒng)招商

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

原子性

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

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

Redis操作原子性的原因

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

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

進(jìn)程與線程

進(jìn)程

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

線程

操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單元。它被包含在進(jìn)程之中,是進(jìn)程的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)?!揪S基百科】。比如,mysql運(yùn)行時,mysql啟動后,該mysql服務(wù)就是一個進(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ù)一個一個地做,必須做完一個任務(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)是一樣的。

如果想在上面的程序中實(shí)現(xiàn)原子性,可以將get和set改成單命令操作,比如incr,或者使用Redis的事務(wù),或者使用Redis+Lua的方式實(shí)現(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ù)其實(shí)是要保證批量操作的原子性。

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

您可能感興趣的文章:
  • Springboot使用redis進(jìn)行api防刷限流過程詳解
  • Redis 緩存實(shí)現(xiàn)存儲和讀取歷史搜索關(guān)鍵字的操作方法
  • redis分布式鎖的go-redis實(shí)現(xiàn)方法詳解
  • Asp.net core中RedisMQ的簡單應(yīng)用實(shí)現(xiàn)
  • 從零搭建SpringBoot2.X整合Redis框架的詳細(xì)教程
  • docker安裝redis設(shè)置密碼并連接的操作
  • Windows下如何安裝配置Redis環(huán)境
  • Redis六大數(shù)據(jù)類型使用方法詳解
  • Redis Java Lettuce驅(qū)動框架原理解析

標(biāo)簽:大慶 果洛 楊凌 吉安 北京 江蘇 朝陽 臺州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《RedisAPI原子性操作及原理解析》,本文關(guān)鍵詞  RedisAPI,原子,性,操作,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《RedisAPI原子性操作及原理解析》相關(guān)的同類信息!
  • 本頁收集關(guān)于RedisAPI原子性操作及原理解析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章