首頁>技術>

五種常用資料結構String 結構字串常用操作

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中儲存的數字值加1DECR key //將key中儲存的數字值減1INCRBY key increment //將key所儲存的值加上incrementDECRBY key decrement //將key所儲存的值減去decrement
String 應用場景單值快取物件快取分散式鎖計數器Web叢集Session共享分散式系統全域性序列號單值快取
SET key valueGet key
物件快取
SET user:1 value(json格式資料)MSET user:1:name yijiaoqian user:1:balance 1888MGET 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:readcount:{文章id}   GET article:readcount:{文章id}  
Web叢集Session共享

Spring session + redis 實現sessio共享

分散式系統全域性序列號
INCRBY orderId 1000 //redis批次生成序列號提升效能
Hash 結構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
Hash應用場景物件儲存
HMSET user {userId}:name  yijiaoqian {userId}:balance  1888HMSET user 1:name yijiaoqian 1:balance 1888HMGET user 1:name 1:balance  
電商購物車以使用者id為key商品id為field商品數量為value

購物車操作:

新增商品:hset cart:1001 10088 1增加數量:hincrby cart:1001 10088 1商品總數:hlen cart:1001刪除商品:hdel cart:1001 10088獲取購物車所有商品:hgetall cart:1001Hash結構優缺點

優點:

同類資料歸類整合儲存,方便資料管理相比string操作消耗記憶體與cpu更小相比string儲存更節省空間

缺點:

過期功能不能使用在field上,只能用在key上Redis叢集架構下不適合大規模使用List 結構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,一直阻塞等待
List應用場景常用資料結構:Stack(棧) = LPUSH + LPOP (FILO)Queue(佇列)= LPUSH + RPOP (FIFO)Blocking MQ(阻塞佇列)= LPUSH + BRPOP微博和微信公號訊息流
一角錢關注了雷軍、馬雲等大V1)雷布斯發微博,訊息ID為10018LPUSH  msg:{一角錢-ID}  100182)馬雲發微博,訊息ID為10086LPUSH  msg:{一角錢-ID} 100863)檢視最新微博訊息LRANGE  msg:{一角錢-ID}  0  4
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中
Set應用場景微信抽獎小程式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4MXrY6h4-1608565742118)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bcbd972138c54f229f249954a4634578~tplv-k3u1fbpfcp-zoom-1.image)]

1.點選參與抽獎加入集合: SADD key {userID} 2.檢視參與抽獎所有使用者:SMEMBERS key3.抽取count名中獎者:SRANDMEMBER key [count]/ SPOP key [count]
微信微博點贊、收藏、標籤
1.點贊: SADD  like:{訊息ID}  {使用者ID} 2.取消點贊: SREM like:{訊息ID}  {使用者ID} 3.檢查使用者是否點過贊: SISMEMBER  like:{訊息ID}  {使用者ID} 4.獲取點讚的使用者列表: SMEMBERS like:{訊息ID} 5.獲取點贊使用者數: SCARD like:{訊息ID}
集合操作
SINTER set1 set2 set3 -> { c }  // 交集SUNION set1 set2 set3 -> { a,b,c,d,e } // 並集SDIFF set1 set2 set3  -> { a } // 差集
集合操作實現微博微信關注模型
1) 張三關注的人: zhangsanSet-> {lisi, wangwu}2) 一角錢關注的人: yijiaoqianSet--> {zhangsan, zhaoliu, lisi, wangwu}3) 李四關注的人: lisiSet-> {zhangsan, yijiaoqian, zhaoliu, wangwu, xunyu)4) 我和一角錢共同關注: SINTER zhangsanSet yijiaoqianSet--> {lisi, wangwu}5) 我關注的人也關注他(一角錢): SISMEMBER lisiSet yijiaoqian SISMEMBER wangwuSet yijiaoqian6) 我可能認識的人: SDIFF yijiaoqianSet zhangsanSet->(zhangsan, zhaoliu}
集合操作實現電商商品篩選
SADD brand:huawei  P40SADD brand:xiaomi  mi-10SADD brand:iPhone iphone12SADD os:android P40 mi-10SADD cpu:brand:intel P40 mi-10SADD ram:8G P40 mi-10 iphone12SINTER os:android cpu:brand:intel ram:8G >  {P40,mi-10}
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 …]  //交集計算
ZSet應用場景ZSet集合操作實現排行榜
1. 點選新聞:ZINCRBY hotNews:20201221 1 完善低齡未成年人犯罪規定2. 展示當日排行前十:ZREVRANGE hotNews:20201221 0 9 WITHSCORES3. 七日搜尋榜單計算:ZUNIONSTORE hotNews:20201215-20201221  7 hotNews:20201215 hotNews:20201216... hotNews:202012214. 展示七日排行前十:ZREVRANGE hotNews:20201215-20201221 0 9 WITHSCORES
Redis的單執行緒和高效能Redis是單執行緒嗎?

Redis的單執行緒主要是指 Redis 的網路IO和鍵值對讀寫是由一個執行緒來完成的,這也是Redis對外提供鍵值儲存服務的主要流程。但是Redis的其他功能,比如持久化、非同步刪除、叢集資料同步等,其實由額外的執行緒執行的。

Redis 單執行緒為什麼還能這麼快?

因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算,而且單執行緒避免來多執行緒的切換效能損耗問題,正因為Redis是單執行緒,所以要小心使用Redis 指令,對於那些耗時的指令(比如keys),一定要謹慎使用,一不小心就可能會導致 Redis 卡頓。

Redis 單執行緒如何處理那麼多的併發客戶端連線?

Redis 的IO多路複用:redis利用epoll實現IO多路複用,將連線資訊和事件放到佇列中,依次放到檔案事件分派器,事件分派器將事件分發給事件處理器。

# 檢視redis支援的最大連線數,在redis.conf檔案中可修改,# maxclients 10000127.0.0.1:6379> CONFIG GET maxclients    ##1) "maxclients"    ##2) "10000"
其他高階命令keys:全量遍歷鍵

用來列出所有滿足特定正則字串規則的key,當redis資料量比較大時,效能比較差,要避免使用。

127.0.0.1:6379> set codehole1 aOK127.0.0.1:6379> set codehole2 bOK127.0.0.1:6379> set codehole3 cOK127.0.0.1:6379> set code1hole aOK127.0.0.1:6379> set code2hole bOK127.0.0.1:6379> set code3hole cOK127.0.0.1:6379> keys *1) "codehole1"2) "codehole3"3) "codehole2"4) "code3hole"5) "code1hole"6) "code2hole"127.0.0.1:6379> keys codehole*1) "codehole1"2) "codehole3"3) "codehole2"127.0.0.1:6379> keys code*hole1) "code3hole"2) "code1hole"3) "code2hole"
scan:漸進式遍歷鍵
SCAN cursor [MATCH pattern] [COUNT count]

scan 引數提供了三個引數:

第一個引數 cursor 整數值(hash桶的索引值)第二個是 key 的正則模式第三個是一次遍歷的key的數量(參考值,底層遍歷的數量不一定),並不少符合條件的結果數量。

第一次遍歷時,cursor 值為0,然後將返回結果中的第一個整數值作為下一次遍歷的 cursor。一直遍歷到返回的 cursor 值為0時結束。

info:檢視redis服務執行資訊

分為 9 大塊,每個塊都有非常多的引數:

Server 伺服器執行的環境引數Clients 客戶端相關資訊Memory 伺服器執行記憶體的統計資料Persistence 持久化資訊Stats 通用統計資料Replication 主從複製相關資訊CPU CPU使用情況Cluster 叢集資訊KeySpace 鍵值對統計數量資訊

核心屬性說明

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • JCIM|一個片段對接的基準資料集及其在對接軟體中的基準測試