String應用場景
分布式鎖
setnx key value,當key不存在時,將 key 的值設為 value ,返回1。若給定的 key 已經存在,則setnx不做任何動作,返回0。
當setnx返回1時,表示獲取鎖,做完操作以后del key,表示釋放鎖,如果setnx返回0表示獲取鎖失敗,整體思路大概就是這樣
計數器
如知乎每個問題的被瀏覽器次數
set key 0
incr key // incr readcount::{帖子id} 每閱讀一次
get key // get readcount::{帖子id} 獲取閱讀量
分布式全局唯一id(string)
實現類似於RDBMS的Sequence功能,生成一系列唯一的序列號
設置序列起始值:
SET sequence "10000"
獲取一個序列值:
INCR sequence
直接將返回值作為序列使用即可。
獲取一批(如100個)序列值:
INCRBY sequence 100
假設返回值為N,那么[N - 99 ~ N]的數值都是可用的序列值。
當多個客戶端同時向Redis申請自增序列時,Redis能夠確保每個客戶端得到的序列值或序列范圍都是全局唯一的,絕對不會出現不同客戶端得到了重復的序列值的情況
list應用場景
消息隊列(list)
在list里面一邊進,一邊出即可
# 實現方式一
# 一直往list左邊放
lpush key value
# key這個list有元素時,直接彈出,沒有元素被阻塞,直到等待超時或發現可彈出元素為止,上面例子超時時間為10s
brpop key value 10
# 實現方式二
rpush key value
blpop key value 10
新浪/Twitter用戶消息列表(list)
假如說小編li關注了2個微博a和b,a發了一條微博(編號為100)就執行如下命令
lpush msg::li 100
b發了一條微博(編號為200)就執行如下命令:
lpush msg::li 200
假如想拿最近的10條消息就可以執行如下命令(最新的消息一定在list的最左邊):
# 下標從0開始,[start,stop]是閉區間,都包含
lrange msg::li 0 9
Set應用場景
抽獎活動(set)
# 參加抽獎活動
sadd key {userId}
# 獲取所有抽獎用戶,大輪盤轉起來
smembers key
# 抽取count名中獎者,並從抽獎活動中移除
spop key count
# 抽取count名中獎者,不從抽獎活動中移除
srandmember key count
實現點贊,簽到,like等功能(set)
# 1001用戶給8001帖子點贊
sadd like::8001 1001
# 取消點贊
srem like::8001 1001
# 檢查用戶是否點過贊
sismember like::8001 1001
# 獲取點贊的用戶列表
smembers like::8001
# 獲取點贊用戶數
scard like::8001
實現關注模型,可能認識的人(set)
seven關注的人
sevenSub -> {qing, mic, james}
青山關注的人
qingSub->{seven,jack,mic,james}
Mic關注的人
MicSub->{seven,james,qing,jack,tom}
# 返回sevenSub和qingSub的交集,即seven和青山的共同關注
sinter sevenSub qingSub -> {mic,james}
# 我關注的人也關注他,下面例子中我是seven
# qing在micSub中返回1,否則返回0
sismember micSub qing
sismember jamesSub qing
# 我可能認識的人,下面例子中我是seven
# 求qingSub和sevenSub的差集,並存在sevenMayKnow集合中
sdiffstore sevenMayKnow qingSub sevenSub -> {seven,jack}
電商商品篩選(set)
每個商品入庫的時候即會建立他的靜態標簽列表如,品牌,尺寸,處理器,內存。
# 將拯救者y700P-001和ThinkPad-T480這兩個元素放到集合brand::lenovo
sadd brand::lenovo 拯救者y700P-001 ThinkPad-T480
sadd screenSize::15.6 拯救者y700P-001 機械革命Z2AIR
sadd processor::i7 拯救者y700P-001 機械革命X8TIPlus
# 獲取品牌為聯想,屏幕尺寸為15.6,並且處理器為i7的電腦品牌(sinter為獲取集合的交集)
sinter brand::lenovo screenSize::15.6 processor::i7 -> 拯救者y700P-001
zset應用場景
- 排行版(zset)
redis的zset天生是用來做排行榜的、好友列表, 去重, 歷史記錄等業務需求。
# user1的用戶分數為 10
zadd ranking 10 user1
zadd ranking 20 user2
# 取分數最高的3個用戶
zrevrange ranking 0 2 withscores
