欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

redis的高級特性有哪些

這篇文章主要介紹了redis的高級特性有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計、成都做網(wǎng)站,提供網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,建網(wǎng)站,按需網(wǎng)站制作,網(wǎng)站開發(fā)公司,成立與2013年是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價值為核心業(yè)務(wù),全程參與項目的網(wǎng)站策劃設(shè)計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。

Redis(Remote Dictionary Server ),即遠程字典服務(wù),是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。

1.redis發(fā)布訂閱模式

Redis除了提供像list的這種的消息隊列模式,還提供了一組命令實現(xiàn)發(fā)布/訂閱模式。例如微博,公眾號等都是可以由此實現(xiàn)。

redis的高級特性有哪些

1.2 訂閱頻道

發(fā)布者需要將消息發(fā)送到一個地方,讓訂閱者可以訂閱消息,這個地方就是頻道(channel)。訂閱者可以訂閱一個或者多個頻道,所有訂閱了這個頻道的訂閱者都會受到這條消息。

開啟兩個客戶端進行測試

客戶端1 訂閱channel1
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

客戶端2 發(fā)布一則消息
127.0.0.1:6379> publish channel1 test
(integer) 1

客戶端1 訂閱消息
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "test"

1.2 按規(guī)則訂閱

支持?和*占位符。?代表一個字符,*代表 0 個或者多個字符。

啟動四個redis-cli,一個作為消息的發(fā)布者,另外三個作為訂閱者。
訂閱者1:訂閱體育相關(guān)

psubscribe *sport

訂閱者2:訂閱新聞相關(guān)

psubscribe news*

訂閱者3:訂閱天氣相關(guān)

psubscribe new weather*

發(fā)布者:

publish news-sport Kobe
publish news-music jaychou
publish news-weather rain

此時訂閱者1將會收到Kobe,訂閱者2將會收到全部信息,訂閱者3將會收到rain。

redis的高級特性有哪些

2.redis事務(wù)

2.1 為什么要用事務(wù)

我們都是知道redis的單個命令是原子性的,但是如果需要用多個命令作為一個不可分割的操作序列,就需要用到事務(wù)。
例如使用setnx實現(xiàn)分布式鎖,我們一般先set,然后對key設(shè)置expire,防止del發(fā)生異常時候鎖不會釋放,業(yè)務(wù)處理完之后在del,這三個操作我們就希望作為一組命令執(zhí)行。
redis事務(wù)有兩個特點:

  • 按照進入隊列的順序執(zhí)行

  • 不會受到其他客戶端請求影響

redis的事務(wù)設(shè)計四個命令:multi(開啟事務(wù)),exec(執(zhí)行事務(wù)),dicard(取消事務(wù)),watch(監(jiān)視)

2.2 事務(wù)的用法

轉(zhuǎn)賬場景A和B各有100元,A向B轉(zhuǎn)賬10元,A減10元,B加10元

127.0.0.1:6379> set A 100
OK
127.0.0.1:6379> set B 100
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby A 10
QUEUED
127.0.0.1:6379> incrby B 10
QUEUED
127.0.0.1:6379> exec
1) (integer) 90
2) (integer) 110
127.0.0.1:6379> get A
"90"
127.0.0.1:6379> get B
"110"

通過multi命令開啟事務(wù)。事務(wù)不能嵌套,多個multi命令效果一樣的
使用multi開啟事務(wù)之后,客戶端向服務(wù)器發(fā)送多條命令,這些命令并不會立即被執(zhí)行,而是會被放到一個隊列中,當exec命令調(diào)用之后,隊列中的命令才會被執(zhí)行。
我們可以使用discard來清空事務(wù)隊列。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> get k2
(nil)

當我們執(zhí)行事務(wù)的時候出現(xiàn)了問題會回滾嗎?

exec之前發(fā)生錯誤 (如指令語法錯誤)

127.0.0.1:6379> clear
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name test
QUEUED
127.0.0.1:6379> hset user lisi
(error) ERR wrong number of arguments for 'hset' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name
(nil)

exec之后發(fā)生錯誤(對同一個key使用不同數(shù)據(jù)類型的命令)

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> hset k1 a b
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get k1
"1"

通過上面操作,我們可以知道當事務(wù)在exec前發(fā)生錯誤,將會回滾所有操作;如果在exec后發(fā)生錯誤,只有錯誤的命令不會被執(zhí)行。
為什么redis在一個事務(wù)中存在錯誤不進行回滾呢?
我們從上面操作可以看出,redis只有在指令語法錯誤的時候進行回滾,而指令操作錯誤是有開發(fā)人員導(dǎo)致的bug,例如:你對一個int類型進行+1,然后不小心+2,或者對一個string類型進行+1,回滾是不適用的

2.3 watch指令

它可以為Redis事務(wù)提供CAS樂觀鎖操作,也就是多個線程更新某個變量的時候,會讓舊值跟內(nèi)存地址相比較,如果相等,則更新為新值。
我們可以用watch監(jiān)視一個或者多個key,如果開啟事務(wù)之后,至少有一個被監(jiān)視的key在exec執(zhí)行之前被修改,則會取消整個事務(wù)。

首先client 1執(zhí)行watch監(jiān)視money這個key,并開啟事務(wù)對money進行增加100

127.0.0.1:6379> set money 1000
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby money 100
QUEUED

在事務(wù)結(jié)束之前,在client 2對money進行減少100

127.0.0.1:6379> decrby money 100
(integer) 900

此時client 1結(jié)束事務(wù),money的值并沒有被增加,反而減少,說明事務(wù)的修改失效

127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get money
"900"

3. Lua腳本

Lua腳本是一種輕量級腳本語言,C語言編寫的,跟存儲過程有點類似。為啥要用lua腳本呢?

一次發(fā)送多個命令,減少網(wǎng)絡(luò)開銷Redis會將腳本作為一個整體執(zhí)行,保證原子性(可用此方式替換事務(wù))腳本復(fù)用,便于多個客戶端完成相同的邏輯。

3.1 使用

我們可以使用以下命令進行調(diào)用lua腳本

eval script numkeys [key1 key2 key3 ....] [arg1 arg2 arg3 ....]

eval 執(zhí)行l(wèi)ua腳本

script 代表lua腳本的內(nèi)容

numkeys key的數(shù)量

[key1 key2 key3 ....] 鍵名參數(shù),表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數(shù)可以在 Lua 中通過全局變量 KEYS 數(shù)組,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。

[arg1 arg2 arg3 ....] 全局變量,可以在 Lua 中通過全局變量 ARGV 數(shù)組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)

來個簡單的例子

127.0.0.1:6379> eval "return {KEYS[1],ARGV[1],KEYS[2],ARGV[2]}" 2 key1 key2 val1 val1
1) "key1"
2) "val1"
3) "key2"
4) "val1"
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 val1 val1
1) "key1"
2) "key2"
3) "val1"
4) "val1"

在lua腳本如何調(diào)用redis命令呢?
我們可以使用 redis.call(command, key [param1, param2…])進行操作

commond redis的命令,如set,get等key 被操作的鍵[param1, param2…]表示給key的參數(shù)

127.0.0.1:6379> eval "redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2])" 2 name age lisi 18
(nil)
127.0.0.1:6379> mget name age
1) "lisi"
2) "18

以上命令等價于 mset name lisi age 18, key的數(shù)量為2,2 后面兩個值為key,在之后就是args

直接在redis-cli中寫lua腳本不夠方便,通常我們會把腳本放在文件中,然后執(zhí)行這個文件
我們在一個目錄下新建一個test.lua的腳本,填寫以下內(nèi)容后執(zhí)行。

root@VM-0-5-centos src]# mkdir testlua
[root@VM-0-5-centos src]# cd testlua/
[root@VM-0-5-centos testlua]# ll
total 0
[root@VM-0-5-centos testlua]# touch test.lua
[root@VM-0-5-centos testlua]# vim test.lua
redis.call('set',KEYS[1],ARGV[1])
return redis.call('get',KEYS[1])
[root@VM-0-5-centos testlua]# redis-cli --eval test.lua 1 myname , Armin
"Armin"

值得注意的是key和arg之間需要加上空格逗號空格(myname , Armin)

3.2 緩存lua腳本

之所以需要緩存lua腳本,這是因為每次調(diào)用的時候都將整個腳本傳給redis服務(wù)端,會產(chǎn)生較大的網(wǎng)絡(luò)開銷。為了解決這個問題,Redis提供了evalsha命令,讓開發(fā)人員通過腳本內(nèi)容的SHA1摘要執(zhí)行腳本。

那么怎么將生成這個SHA1并將腳本內(nèi)容加載到緩存呢,這就用到script load命令去計算腳本的SHA1摘要并記錄腳本到緩存中,執(zhí)行evalsha時,redis會根據(jù)提供的摘要去腳本緩存找到對應(yīng)腳本內(nèi)容,如果找到則執(zhí)行,否則返回錯誤提示: “NOSCRIPT No matching script. Please use EVAL”

127.0.0.1:6379> script load "return 'Hey boy'"
"3760855b303510c83f0be2e8acfb0be64113ae6e"
127.0.0.1:6379> evalsha 3760855b303510c83f0be2e8acfb0be64113ae6e 0
"Hey boy"
127.0.0.1:6379> script exists 3760855b303510c83f0be2e8acfb0be64113ae6e //判斷是否存在
1) (integer)

Redis還給lua腳本的執(zhí)行提供了超時時間,默認的超時時間為5s,超過5s之后redis會接受其他命令但是會返回一個"BUSY"的錯誤
可在redis.conf中修改指定參數(shù)

lua-time-limit 5000

Redis提供了個script kill的命令來終止正在運行的腳本

127.0.0.1:6379> set name lisi
(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379> script kill
OK
127.0.0.1:6379> set name lisi
OK

如果數(shù)據(jù)進行了修改操作,將無法使用script kill終止腳本,因為違反了原子性。此時只能通過shutdown nosave來強行終止redis。
shutdown nosave 和 shutdown 的區(qū)別在于 shutdown nosave 不會進行持久化 操作,意味著發(fā)生在上一次快照后的數(shù)據(jù)庫修改都會丟失。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“redis的高級特性有哪些”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

網(wǎng)站名稱:redis的高級特性有哪些
網(wǎng)站路徑:http://aaarwkj.com/article22/jjgicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣小程序開發(fā)、網(wǎng)站收錄、ChatGPT、自適應(yīng)網(wǎng)站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
中文字幕成人免费看片| 欧美av精品一区二区三区| 夫妻性生活视频在线免费看| 91九色国产原创在线观看| 白小白的视频在线观看| 久久久人妻精品一区二区三区四区| 太爽了少妇高潮在线看片| 国产精品麻豆色哟哟av| 日本一级黄色影视大全| 超碰在线免费视频97| 国产一区二区不卡在线播放| 日本av免费观看一区二区| 亚洲av香蕉综合一区| 青青草免费公开视频久久| 另类欧美亚洲中文在线综合| 做性视频大全在线观看| 看看永久成人免费视频| 精品久久人妻中文字幕免费| 亚洲精品成人午夜av| 少妇毛片一区二区三区| 国产视频不卡一区二区| 久久久人妻精品少妇av| 亚洲国产欧美日韩综合| 麻豆精品人妻中文在线| 特黄一级黄色大片免费看| 麻豆视频在线观看传媒| 久久这里精品中文字幕| 国产黄色一区二区三区四区| 日韩高清在线不卡视频| 强暴美女视频大全久久久| 男女互射视频在线观看| 丝袜美腿诱惑国产在线| 日本中文一区在线观看| 久草福利视频免费播放| 久久精品国产亚洲av麻豆尤物| 给我免费在线观看视频| 国产精品六区久久综合亚洲av| 18禁在线免费观看网站| 91亚洲熟妇国产熟妇肥婆| 91黑丝国产在线播放| 亚洲成人久久久久久久|