面試官:redis五種基本數據類型的應用場景是啥?

string

緩存

簡單key-value存儲

分佈式鎖

setnx key value,當key不存在時,將 key 的值設爲 value ,返回1

若給定的 key 已經存在,則setnx不做任何動作,返回0。

當setnx返回1時,表示獲取鎖,做完操作以後del key,表示釋放鎖,如果setnx返回0表示獲取鎖失敗,整體思路大概就是這樣

計數器

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

面試官:redis五種基本數據類型的應用場景是啥?

 

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

分佈式全局唯一id

分佈式全局唯一id的實現方式有很多,這裏只介紹用redis實現

面試官:redis五種基本數據類型的應用場景是啥?

 

每次獲取userId的時候,對userId加1再獲取,可以改進爲如下形式

面試官:redis五種基本數據類型的應用場景是啥?

 

直接獲取一段userId的最大值,緩存到本地慢慢累加,快到了userId的最大值時,再去獲取一段,一個用戶服務宕機了,也頂多一小段userId沒有用到

set userId 0
incr usrId //返回1
incrby userId 1000 //返回10001

hash

redis的散列可以讓用戶將多個鍵值對存儲到一個Redis的鍵裏面,散列非常適用於將一些相關的數據存儲在一起。類似map的一種結構,將結構化的數據,比如一個對象(前提是這個對象沒嵌套其他的對象)給緩存到redis中,以後每次讀寫內存時,就可以操作hash裏的某個字段

list

消息隊列

面試官:redis五種基本數據類型的應用場景是啥?

 

在list裏面一邊進,一邊出即可

## 實現方式一
lpush key value //一直往list左邊放
brpop key value 10 
//key這個list有元素時,直接彈出,沒有元素被阻塞,直到等待超時或發現可彈出元素爲止,上面例子超時時間爲10s

## 實現方式二
rpush key value
blpop key value 10

新浪/Twitter用戶消息列表

面試官:redis五種基本數據類型的應用場景是啥?

 

加入說小編li關注了2個微博a和b,a發了一條微博(編號爲100)就執行如下命令

lpush msg::li 100

b發了一條微博(編號爲200)就執行如下命令:

lpush msg::li 200

假如想拿最近的10條消息就可以執行如下命令(最新的消息一定在list的最左邊):

lrange msg::li 0 9 //下標從0開始,[start,stop]是閉區間,都包含

set

無序集合,自動去重,將數據放到set中就可去重,可以基於JVM的HashSet去重,如果系統部署在多臺機器上,就可以用redis進行全局去重

可以基於set做交集,並集,差集的操作。如把2個人的粉絲列表弄一個交集,就能看到兩個人的共同好友是誰

實現點贊,簽到,like等功能

面試官:redis五種基本數據類型的應用場景是啥?

 

// 1001用戶給8001帖子點贊
sadd like::8001 1001
srem like::8001 1001 //取消點贊
sismember like::8001 1001 //檢查用戶是否點過贊
smembers like::8001 //獲取點讚的用戶列表
scard like::8001 //獲取點贊用戶數

實現關注模型,可能認識的人

面試官:redis五種基本數據類型的應用場景是啥?

 

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}

電商商品篩選

面試官:redis五種基本數據類型的應用場景是啥?

 

每個商品入庫的時候即會建立他的靜態標籤列表如,品牌,尺寸,處理器,內存

// 將拯救者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

排序的set,可以去重還可以排序,寫進去的時候給一個分數,自動根據根據分數排序,分數可以自定義排序規則

redis的zset天生是用來做排行榜的、好友列表, 去重, 歷史記錄等業務需求

面試官:redis五種基本數據類型的應用場景是啥?

 

// user1的用戶分數爲 10
zadd ranking 10 user1
zadd ranking 20 user2
// 取分數最高的3個用戶
zrevrange ranking 0 2 withscores
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章