目錄
- `Redis` 支援的資料類型
- 使用場景
-
- `String` 類型
- `Hash` 類型
- `List` 清單類型
- `Set` 類型
- `Zset` 類型
Redis
支援的資料類型
Redis
Redis
支援的五種資料類型
-
:字元串類型String
-
:哈希,散清單類型Hash
-
:清單類型List
-
:集合Set
-
:有序集合Zset
使用場景
String
類型
String
String
類型是
Redis
中最常見的資料類型,其使用場景如下
- 緩存:簡單的
存儲,可以用于熱點資料的緩存、對象緩存、全頁緩存、可以提升熱點資料的通路資料key-value
- 位統計:線上使用者統計,文章通路量,記錄每個使用者的通路次數。方案:常用鍵名:
,如果一個使用者的pageview:userid
為id
,那對應的123
的Redis
就為key
,pageview:123
就為使用者的通路次數,增加次數可以使用指令:value
incr
- 計數器:文章的閱讀量、微網誌點贊數、允許一定的延遲,先寫入
再定時持久化同步到資料庫Redis
set key 0
incr key // incr readcount::{文章id} 每閱讀一次
get key // get readcount::{文章id} 擷取閱讀量
- 分布式全局唯一
:分布式全局唯一id
的實作方式有很多,這裡隻介紹用id
實作 每次擷取redis
的時候,對userId
加userId
再擷取,可以改進為如下形式 直接擷取一段1
的最大值,緩存到本地慢慢累加,快到了userId
的最大值時,再去擷取一段,一個使用者服務當機了,也頂多一小段userId
沒有用到userId
set userId 0
incr usrId // 傳回1
incrby userId 1000 // 傳回10001
Hash
類型
Hash
Redis
的散列可以讓使用者将多個鍵值對存儲到一個
Redis
的鍵裡面,散列非常适用于将一些相關的資料存儲在一起。類似
map
的一種結構,将結構化的資料,比如一個對象(前提是這個對象沒嵌套其他的對象)緩存到
redis
中,以後每次讀寫記憶體時,就可以操作
hash
裡的某個字段
- 存儲使用者資訊、存儲對象
// 存儲使用者資訊,比如儲存name,age:
hset(user:1001,name,"zhangsan")
hset(user:1001,age,18)
hget(user:1001,name) // 擷取
hset(user:1001,name,"張三") // 修改
- 存儲購物車相關資訊
key:使用者id
field:商品id
value:商品數量
List
清單類型
List
List
的應用場景非常多,也是
Redis
最重要的資料類型之一
- 定時排行榜
- 消息隊列
- 排行榜、最新清單(評論清單、點贊清單)
示例,新浪
Twitter
使用者消息清單
// 假如使用者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
Redis
的
Set
是
String
類型的無序集合,和
List
不同的是,
Set
中不會出現重複的成員,集合最大的好處就是可以進行交集或差集的操作
- 将每個人的好友存在
中,可避免重複Set
- 好友、關注、粉絲、感興趣的人等的集合
sismember key member //判斷 member 元素是否是集合 key 的成員
smove source destination member //将 member 元素從 source 集合移動到 destination 集合
scard key //擷取集合的成員數
- 尋找兩個人的共同好友,使用
求交集sinter
示例,實作點贊、簽到、打卡。假如微網誌
ID
是
t1001
,使用者
ID
是
u3001
。用
like:t1001
來維護
t1001
這條微網誌的所有點贊使用者
sadd like:t1001 u3001 // 點贊了這條微網誌
srem like:t1001 u3001 //取消點贊
sismember like:t1001 u3001 // 是否點贊
smembers like:t1001 // 點贊的所有使用者
scard like:t1001 // 點贊數
示例:實作關注模型,可能認識的人
- 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}
Zset
類型
Zset
Redis
中的
Zset
和
Set
一樣,都是
String
類型的集合,也不允許有重複的成員,但不同的是
Zset
的每個元素都會有一個
double
類型的分數
score
與之關聯,而
Redis
也是通過這個分數來為這個集合排序的
- 電商商品綜合排名
- 按價格排名
- 線上遊戲的積分排行榜、熱點新聞排行榜
// user1的使用者分數為 10
zadd ranking 10 user1
zadd ranking 20 user2
// 取分數最高的3個使用者
zrevrange ranking 0 2 withscores