Redis進階-核心數據結構進階實戰

在這裏插入圖片描述


入門

如果您還未接觸過Redis ,請先閱讀 【Redis-入門到精通】

在這裏插入圖片描述


Redis 基本數據結構

在這裏插入圖片描述

這裏我們簡單回顧下,記住常用的就夠了,記不住的訪問官方網站。

Redis API

通用API

  keys 、del 、dbsize 、expire (ttl、persist)、exists、type…….

時間複雜度都是O(1)


strings\ hash\list\set\zset

Strings

SET  key  value 			//存入字符串鍵值對
MSET  key  value [key value ...] 	//批量存儲字符串鍵值對
SETNX  key  value 		//存入一個不存在的字符串鍵值對
GET  key 			//獲取一個字符串鍵值
MGET  key  [key ...]	 	//批量獲取字符串鍵值
DEL  key  [key ...] 		//刪除一個鍵
EXPIRE  key  seconds 		//設置一個鍵的過期時間(秒)

原子加減
INCR  key 			//將key中儲存的數字值加1
DECR  key 			//將key中儲存的數字值減1
INCRBY  key  increment 		//將key所儲存的值加上increment
DECRBY  key  decrement 	//將key所儲存的值減去decrement

Hash

HSET  key  field  value 			//存儲一個哈希表key的鍵值
HSETNX  key  field  value 		//存儲一個不存在的哈希表key的鍵值
HMSET  key  field  value [field value ...] 	//在一個哈希表key中存儲多個鍵值對
HGET  key  field 				//獲取哈希表key對應的field鍵值
HMGET  key  field  [field ...] 		//批量獲取哈希表key中多個field鍵值
HDEL  key  field  [field ...] 		//刪除哈希表key中的field鍵值
HLEN  key				//返回哈希表key中field的數量
HGETALL  key				//返回哈希表key中所有的鍵值
HINCRBY  key  field  increment 		//爲哈希表key中field鍵的值加上增量increment


List

LPUSH  key  value [value ...] 		//將一個或多個值value插入到key列表的表頭(最左邊)
RPUSH  key  value [value ...]	 	//將一個或多個值value插入到key列表的表尾(最右邊)
LPOP  key			//移除並返回key列表的頭元素
RPOP  key			//移除並返回key列表的尾元素
LRANGE  key  start  stop		//返回列表key中指定區間內的元素,區間以偏移量start和stop指定
BLPOP  key  [key ...]  timeout	//從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	//從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待

在這裏插入圖片描述


Set

Set常用操作
SADD  key  member  [member ...]			//往集合key中存入元素,元素存在則忽略,
							若key不存在則新建
SREM  key  member  [member ...]			//從集合key中刪除元素
SMEMBERS  key					//獲取集合key中所有元素
SCARD  key					//獲取集合key的元素個數
SISMEMBER  key  member			//判斷member元素是否存在於集合key中
SRANDMEMBER  key  [count]			//從集合key中選出count個元素,元素不從key中刪除
SPOP  key  [count]				//從集合key中選出count個元素,元素從key中刪除

Set運算操作
SINTER  key  [key ...] 				//交集運算
SINTERSTORE  destination  key  [key ..]		//將交集結果存入新集合destination中
SUNION  key  [key ..] 				//並集運算
SUNIONSTORE  destination  key  [key ...]		//將並集結果存入新集合destination中
SDIFF  key  [key ...] 				//差集運算
SDIFFSTORE  destination  key  [key ...]		//將差集結果存入新集合destination中

Zset

  ZSet常用操作
ZADD key score member [[score member]]	//往有序集合key中加入帶分值元素
ZREM key member [member …]		//從有序集合key中刪除元素
ZSCORE key member 			//返回有序集合key中元素member的分值
ZINCRBY key increment member		//爲有序集合key中元素member的分值加上increment 
ZCARD key				//返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES]	//正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE key start stop [WITHSCORES]	//倒序獲取有序集合key從start下標到stop下標的元素

Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] 	//並集計算
ZINTERSTORE destkey numkeys key [key …]	//交集計算

在這裏插入圖片描述


應用場景

Strings

單值緩存

SET  key  value 	
GET  key 	

對象緩存

1) SET  user:1  value (json格式數據)
2) MSET  user:1:name  artisan user:1:balance  1888
  MGET  user:1:name  user:1:balance 

分佈式鎖

SETNX  product:10001  true 		//返回1代表獲取鎖成功
SETNX  product:10001  true 		//返回0代表獲取鎖失敗
。。。執行業務操作
DEL  product:10001			//執行完業務釋放鎖
SET product:10001 true  ex  10  nx	//防止程序意外終止導致死鎖

計數器

INCR article:judge:{文章id}  	
GET article: judge:{文章id} 

在這裏插入圖片描述

轉發評論

集羣環境 併發訪問同一個文章 如何保證線程安全

redis單線程 原子性


Web集羣session共享

spring session + redis實現session共享

spring session 本身就是使用redis作爲外部存儲


分佈式系統全局序列號

INCRBY  orderId  1000

每次獲取1000 存入內存,VS 每次都去redis取1個

N多表,N多併發 ,N多場景使用redis

節點掛了也沒關係,無非就是id浪費了


Hash

對象緩存

HMSET  user  {userId}:name  artisan  {userId}:balance  1888
HMSET  user  1:name  artisan  1:balance  1888
HMGET  user  1:name  1:balance  

超時 針對key ,無法針對 field
避免 big key


電商購物車

1)以用戶id爲key
2)商品id爲field
3)商品數量爲value

• 購物車操作

  1. 添加商品hset cart:1001 10088 1
  2. 增加數量hincrby cart:1001 10088 1
  3. 商品總數hlen cart:1001
  4. 刪除商品hdel cart:1001 10088
  5. 獲取購物車所有商品hgetall cart:1001

在這裏插入圖片描述


List

常用數據結構

Stack() = LPUSH + LPOP  FILO
Queue(隊列)= LPUSH + RPOP
Blocking MQ(阻塞隊列)= LPUSH + BRPOP ( 會阻塞其他消息,如果使用,使用單獨的Redis)

微信-訂閱號消息

在這裏插入圖片描述

比如我關注的公衆號,如何顯示這些公衆號發送的消息?

舉個例子
1)A 23:00發佈公衆號文章,消息ID爲10018

LPUSH  msg:{我的-ID}  10018

2)B 23:05 發佈公衆號文章,消息ID爲10086

LPUSH  msg:{我的-ID} 10086

3)C 23:30 發佈公衆號文章,消息ID爲10099

LPUSH  msg:{我的-ID} 10099

3)查看最新的關注的公衆號發佈的消息

LRANGE  msg:{我的-ID}  0  5

都往我的這個隊列裏放, lpush 從左側放

C的文章id B的文章id A 的文章id

獲取,肯定是按照時間倒敘排

LRANGE  msg:{我的-ID}  start  stop 

Set

點贊,收藏,標籤

  1. 點贊
SADD  like:{消息ID}  {用戶ID}
  1. 取消點贊
SREM like:{消息ID}  {用戶ID}
  1. 檢查用戶是否點過贊
SISMEMBER  like:{消息ID}  {用戶ID}
  1. 獲取點讚的用戶列表
SMEMBERS like:{消息ID}
  1. 獲取點贊用戶數
SCARD like:{消息ID}

抽獎

點擊參與抽獎加入集合
SADD key {userlD}
2)查看參與抽獎所有用戶
SMEMBERS key
3)抽取count名中獎者
SRANDMEMBER key [count] / SPOP key [count]

一 二三等 獎 抽中的移除 SPOP

在這裏插入圖片描述


共同關注、共同好友。。。

在這裏插入圖片描述集合操作的應用

SINTER set1 set2 set3 -> { c }
SUNION set1 set2 set3 ->  { a,b,c,d,e }
SDIFF set1 set2 set3 ->  { a }   以第一個集合爲基準,減去後面的集合所有元素
             Abc -  bcd  cde --->  a  第一個集合不存在的不算

Zset

熱搜

在這裏插入圖片描述

1)點擊新聞

ZINCRBY  hotNews:20200307  1  fujian 【score加1

2)展示當日排行前十

ZREVRANGE  hotNews:20200307  0  10  WITHSCORES 

3)七日搜索榜單計算

ZUNIONSTORE  hotNews:20200301-20200307  7 
hotNews:20200301  hotNews:202000302... hotNews:202000307

4)展示七日排行前十

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