redis常見應用場景

String應用場景

分佈式鎖

setnx key value,當key不存在時,將 key 的值設爲 value ,返回1。若給定的 key 已經存在,則setnx不作任何動做,返回0。瀏覽器

當setnx返回1時,表示獲取鎖,作完操做之後del key,表示釋放鎖,若是setnx返回0表示獲取鎖失敗,總體思路大概就是這樣分佈式

計數器

如知乎每一個問題的被瀏覽器次數code

set key 0
incr key // incr readcount::{帖子id} 每閱讀一次
get key // get readcount::{帖子id} 獲取閱讀量

分佈式全局惟一id(string)

實現相似於RDBMS的Sequence功能,生成一系列惟一的序列號隊列

設置序列起始值:內存

SET sequence "10000"
獲取一個序列值:rem

INCR sequence
直接將返回值做爲序列使用便可。get

獲取一批(如100個)序列值:消息隊列

INCRBY sequence 100
假設返回值爲N,那麼[N - 99 ~ N]的數值都是可用的序列值。string

當多個客戶端同時向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
相關文章
相關標籤/搜索