redis 進階

以下模塊的使用場景,有些典型場景未考慮進去的情況,歡迎有經驗的讀者前來補充。

前言

假定使用者,已經在業務中熟練掌握了連接,SET,GET,SETEX。Redis還有一些其它的非常好的模塊可以用在業務裏。

1. 原子增減incr

客戶端命令加一,減一。該命令爲原子操作,可以在多客戶端調用併發安全。

set index 0
incr index
decr index

使用場景: 在線用戶,接口調用次數,商品搶購數量

2. 對已有的key,增加/修改過期約束,並查看過期時間

過期單位爲秒

set index 0
expire index 120
ttl index

使用場景: 查看商品還有多少時間下架,活動多少時間結束

3. 操作隊列list

左進,右進, 取子list(含頭含尾), 隊列元素必須同類型,取長度,左彈出,右彈出

RPUSH friends "Alice"
RPUSH friends "Bob"
LPUSH friends "Sam"
LRANGE friends 0 -1 => 1) "Sam", 2) "Alice", 3) "Bob"
LRANGE friends 0 1 => 1) "Sam", 2) "Alice"
LRANGE friends 1 2 => 1) "Alice", 2) "Bob"
LLEN friends => 3
LPOP friends => "Sam"
RPOP friends => "Bob"

使用場景: 不易變的數組隊列的緩存,比如app內小圖標的排序。

4. 無序唯一集set

增加,列表,刪除, 是否包含, 合併多個set爲一個set(依舊保持去重無序)

sadd users "Kimi"
sadd users "Uky"
smember users
srem users "Kimi"
sismember users "Uky"
sunion users key2 key3 // 合併多個set爲一個set

5. 有序唯一集zset

增加,列表,刪除,包含,合併

ZADD hackers 1940 "Alan Kay"
ZADD hackers 1906 "Grace Hopper"
ZADD hackers 1953 "Richard Stallman"
ZADD hackers 1965 "Yukihiro Matsumoto"
ZADD hackers 1916 "Claude Shannon"
ZADD hackers 1969 "Linus Torvalds"
ZADD hackers 1957 "Sophie Wilson"
ZADD hackers 1912 "Alan Turing"
ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman"

6. 開啓事務

以multi開頭,exec結尾,事務之間的命令會被壓入執行隊列,事務結束時,提交所有操作,具備原子性。
返回值是對應暫存的命令返回結果

multi
set name "ft"
set name "ft2"
exec

// 回滾 discard

關於回滾,有一個地方要特別注意。不顯式調用discard,子命令行出錯時,已執行的命令不會回滾。舉例:

set key1 1
multi 
set key1 2
set key1 3
set key1 3 kk kj jj
exec

如上所示,第三個事務子語句,很顯然語法錯誤,輸出key1的值,爲3,因爲前兩句話正確得執行了。

樂觀鎖

這裏重點講一下,很有用。
以前面提到的INCR爲例,爲某一個數字自增1是一個原子操作。那麼問題來了,在業務中,我們對key值的修改,可能也需要做到原子性,其修改操作不能簡單地被形容成自增1.這種情況應該怎麼做呢?

使用樂觀鎖。
樂觀鎖使用模式是固定的: (需要保證原子性的操作,寫在multi和exec之間,併發不安全的key,寫到watch後)

watch key1 key2
multi
...
exec

它做到了這樣的邏輯:
在 multi和exec之間的任何命令,一旦[出錯]/[被監控的key發生了變化,比如被其他客戶端修改了值],則事務回滾。

那麼,要達到成功執行的結果,便需要,不斷提交該次事務,直到成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章