Redis进阶-核心数据结构进阶实战
文章目錄
- 入門
- Redis 基本數(shù)據(jù)結(jié)構(gòu)
- Redis API
- 通用API
- strings\ hash\list\set\zset
- Strings
- Hash
- List
- Set
- Zset
- 應(yīng)用場景
- Strings
- 單值緩存
- 對(duì)象緩存
- 分布式鎖
- 計(jì)數(shù)器
- Web集群session共享
- 分布式系統(tǒng)全局序列號(hào)
- Hash
- 對(duì)象緩存
- 電商購物車
- List
- 常用數(shù)據(jù)結(jié)構(gòu)
- 微信-訂閱號(hào)消息
- Set
- 點(diǎn)贊,收藏,標(biāo)簽
- 抽獎(jiǎng)
- 共同關(guān)注、共同好友。。。
- Zset
- 熱搜
入門
如果您還未接觸過Redis ,請(qǐng)先閱讀 【Redis-入門到精通】
Redis 基本數(shù)據(jù)結(jié)構(gòu)
這里我們簡單回顧下,記住常用的就夠了,記不住的訪問官方網(wǎng)站。
Redis API
通用API
keys 、del 、dbsize 、expire (ttl、persist)、exists、type…….時(shí)間復(fù)雜度都是O(1)
strings\ hash\list\set\zset
Strings
舉個(gè)例子:緩存用戶信息------------->將用戶信息結(jié)構(gòu)使用 JSON 序列化成字符串,然后將序列化后的字符串存入 Redis 來緩存。
同樣的,取用戶信息會(huì)經(jīng)過一次反序列化的過程
Redis 的字符串是動(dòng)態(tài)字符串,是可以修改的字符串,內(nèi)部結(jié)構(gòu)實(shí)現(xiàn)上類似于 Java 的 ArrayList,采用預(yù)分配冗余空間的方式來減少內(nèi)存的頻繁分配.
如圖中所示,內(nèi)部為當(dāng)前字符串實(shí)際分配的空間 capacity 一般要高于實(shí)際字符串長度 len。
當(dāng)字符串長度小于 1M 時(shí), 擴(kuò)容都是加倍現(xiàn)有的空間。
如果超過 1M,擴(kuò)容時(shí)一次只會(huì)多擴(kuò) 1M 的空間。
需要注意的是字符串最大長度為 512M
SET key value //存入字符串鍵值對(duì) MSET key value [key value ...] //批量存儲(chǔ)字符串鍵值對(duì) SETNX key value //存入一個(gè)不存在的字符串鍵值對(duì) GET key //獲取一個(gè)字符串鍵值 MGET key [key ...] //批量獲取字符串鍵值 DEL key [key ...] //刪除一個(gè)鍵 EXPIRE key seconds //設(shè)置一個(gè)鍵的過期時(shí)間(秒)原子加減 INCR key //將key中儲(chǔ)存的數(shù)字值加1 DECR key //將key中儲(chǔ)存的數(shù)字值減1 INCRBY key increment //將key所儲(chǔ)存的值加上increment DECRBY key decrement //將key所儲(chǔ)存的值減去decrementHash
HSET key field value //存儲(chǔ)一個(gè)哈希表key的鍵值 HSETNX key field value //存儲(chǔ)一個(gè)不存在的哈希表key的鍵值 HMSET key field value [field value ...] //在一個(gè)哈希表key中存儲(chǔ)多個(gè)鍵值對(duì) HGET key field //獲取哈希表key對(duì)應(yīng)的field鍵值 HMGET key field [field ...] //批量獲取哈希表key中多個(gè)field鍵值 HDEL key field [field ...] //刪除哈希表key中的field鍵值 HLEN key //返回哈希表key中field的數(shù)量 HGETALL key //返回哈希表key中所有的鍵值 HINCRBY key field increment //為哈希表key中field鍵的值加上增量incrementList
LPUSH key value [value ...] //將一個(gè)或多個(gè)值value插入到key列表的表頭(最左邊) RPUSH key value [value ...] //將一個(gè)或多個(gè)值value插入到key列表的表尾(最右邊) LPOP key //移除并返回key列表的頭元素 RPOP key //移除并返回key列表的尾元素 LRANGE key start stop //返回列表key中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量start和stop指定 BLPOP key [key ...] timeout //從key列表表頭彈出一個(gè)元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout //從key列表表尾彈出一個(gè)元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待Set
Set常用操作 SADD key member [member ...] //往集合key中存入元素,元素存在則忽略,若key不存在則新建 SREM key member [member ...] //從集合key中刪除元素 SMEMBERS key //獲取集合key中所有元素 SCARD key //獲取集合key的元素個(gè)數(shù) SISMEMBER key member //判斷member元素是否存在于集合key中 SRANDMEMBER key [count] //從集合key中選出count個(gè)元素,元素不從key中刪除 SPOP key [count] //從集合key中選出count個(gè)元素,元素從key中刪除Set運(yùn)算操作 SINTER key [key ...] //交集運(yùn)算 SINTERSTORE destination key [key ..] //將交集結(jié)果存入新集合destination中 SUNION key [key ..] //并集運(yùn)算 SUNIONSTORE destination key [key ...] //將并集結(jié)果存入新集合destination中 SDIFF key [key ...] //差集運(yùn)算 SDIFFSTORE destination key [key ...] //將差集結(jié)果存入新集合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中元素個(gè)數(shù) ZRANGE key start stop [WITHSCORES] //正序獲取有序集合key從start下標(biāo)到stop下標(biāo)的元素 ZREVRANGE key start stop [WITHSCORES] //倒序獲取有序集合key從start下標(biāo)到stop下標(biāo)的元素Zset集合操作 ZUNIONSTORE destkey numkeys key [key ...] //并集計(jì)算 ZINTERSTORE destkey numkeys key [key …] //交集計(jì)算應(yīng)用場景
Strings
單值緩存
SET key value GET key對(duì)象緩存
1) SET user:1 value (json格式數(shù)據(jù)) 2) MSET user:1:name artisan user:1:balance 1888MGET user:1:name user:1:balance分布式鎖
SETNX product:10001 true //返回1代表獲取鎖成功 SETNX product:10001 true //返回0代表獲取鎖失敗 。。。執(zhí)行業(yè)務(wù)操作 DEL product:10001 //執(zhí)行完業(yè)務(wù)釋放鎖 SET product:10001 true ex 10 nx //防止程序意外終止導(dǎo)致死鎖計(jì)數(shù)器
INCR article:judge:{文章id} GET article: judge:{文章id}轉(zhuǎn)發(fā)評(píng)論
集群環(huán)境 并發(fā)訪問同一個(gè)文章 如何保證線程安全
redis單線程 原子性
Web集群session共享
spring session + redis實(shí)現(xiàn)session共享
spring session 本身就是使用redis作為外部存儲(chǔ)
分布式系統(tǒng)全局序列號(hào)
INCRBY orderId 1000每次獲取1000 存入內(nèi)存,VS 每次都去redis取1個(gè)
N多表,N多并發(fā) ,N多場景使用redis
節(jié)點(diǎn)掛了也沒關(guān)系,無非就是id浪費(fèi)了
Hash
對(duì)象緩存
HMSET user {userId}:name artisan {userId}:balance 1888 HMSET user 1:name artisan 1:balance 1888 HMGET user 1:name 1:balance超時(shí) 針對(duì)key ,無法針對(duì) field
避免 big key
電商購物車
1)以用戶id為key
2)商品id為field
3)商品數(shù)量為value
? 購物車操作
List
常用數(shù)據(jù)結(jié)構(gòu)
Stack(棧) = LPUSH + LPOP ?FILO Queue(隊(duì)列)= LPUSH + RPOP Blocking MQ(阻塞隊(duì)列)= LPUSH + BRPOP ( 會(huì)阻塞其他消息,如果使用,使用單獨(dú)的Redis)微信-訂閱號(hào)消息
比如我關(guān)注的公眾號(hào),如何顯示這些公眾號(hào)發(fā)送的消息?
舉個(gè)例子
1)A 23:00發(fā)布公眾號(hào)文章,消息ID為10018
2)B 23:05 發(fā)布公眾號(hào)文章,消息ID為10086
LPUSH msg:{我的-ID} 100863)C 23:30 發(fā)布公眾號(hào)文章,消息ID為10099
LPUSH msg:{我的-ID} 100993)查看最新的關(guān)注的公眾號(hào)發(fā)布的消息
LRANGE msg:{我的-ID} 0 5都往我的這個(gè)隊(duì)列里放, lpush 從左側(cè)放
C的文章id B的文章id A 的文章id
獲取,肯定是按照時(shí)間倒敘排
LRANGE msg:{我的-ID} start stopSet
點(diǎn)贊,收藏,標(biāo)簽
抽獎(jiǎng)
點(diǎn)擊參與抽獎(jiǎng)加入集合
SADD key {userlD}
2)查看參與抽獎(jiǎng)所有用戶
SMEMBERS key
3)抽取count名中獎(jiǎng)?wù)?br /> SRANDMEMBER key [count] / SPOP key [count]
一 二三等 獎(jiǎng) 抽中的移除 SPOP
共同關(guān)注、共同好友。。。
集合操作的應(yīng)用
SINTER set1 set2 set3 -> { c } SUNION set1 set2 set3 -> { a,b,c,d,e } SDIFF set1 set2 set3 -> { a } 以第一個(gè)集合為基準(zhǔn),減去后面的集合所有元素Abc - bcd cde ---> a 第一個(gè)集合不存在的不算Zset
熱搜
1)點(diǎn)擊新聞
ZINCRBY hotNews:20200307 1 fujian 【score加1 】2)展示當(dāng)日排行前十
ZREVRANGE hotNews:20200307 0 10 WITHSCORES3)七日搜索榜單計(jì)算
ZUNIONSTORE hotNews:20200301-20200307 7 hotNews:20200301 hotNews:202000302... hotNews:2020003074)展示七日排行前十
ZREVRANGE hotNews:20200301-20200307 0 10 WITHSCORES總結(jié)
以上是生活随笔為你收集整理的Redis进阶-核心数据结构进阶实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode_349. 两个数组的交
- 下一篇: Redis进阶-Redis缓存优化