Redis Note(一)五大基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

(一)五大基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

A. string

  • 概述:字符串是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),redis所有的key都是string類型,且其他的數(shù)據(jù)結(jié)構(gòu)都是基于string構(gòu)建的。redis中string的value可以是string、數(shù)字(int float)甚至是二進(jìn)制(圖片、音頻 & 視頻),其value最大值不超過512MB。
  • 主要操作
    1. 設(shè)置 & 獲取value
      • 基礎(chǔ)設(shè)置:直接使用set key value
      • 過期設(shè)置:原子操作使用setex key seconds value
      • 條件設(shè)置:設(shè)置key不存在時(shí)才能被新建,使用setnx key value。
      • 注意:若多個(gè)clients同時(shí)執(zhí)行setnx,僅有一個(gè)client可設(shè)置成功(setnx即為redis中分布式鎖的實(shí)現(xiàn)方案,具體實(shí)現(xiàn)請參考redis官方文檔)。
      • 獲取value:get key獲取對應(yīng)value,若不存在則會返回nil。
    2. 批量操作
      • 概述:提高業(yè)務(wù)處理效率,降低網(wǎng)絡(luò)壓力,但是單次批量操作不宜發(fā)送過多命令,容易導(dǎo)致redis阻塞和網(wǎng)絡(luò)擁塞。
      • 批量設(shè)置mset key1 value1 key2 value2 key3 value3。
      • 批量獲取mget key1 key2 key3。
    3. 計(jì)數(shù)操作
      • 概述:incr命令對value進(jìn)行自增操作,若value不是整數(shù)則返回錯(cuò)誤,若key不存在則從0開始增加(第一次執(zhí)行完就為1)。
      • 基礎(chǔ)命令為incr key & decr key
      • 指定增加數(shù)目:incrby key increment
    4. 低頻使用命令
      • 追加值:append key value,比如原始的key對應(yīng)的value是redis,使用了append key world后,value變成了redisworld。
      • value的長度:strlen key,單個(gè)中文被認(rèn)為長度為3。
  • 主要功能
    1. 緩存功能,免于直接調(diào)用database;
    2. 計(jì)數(shù)功能,基于incr實(shí)現(xiàn);
    3. 共享session,因?yàn)閣eb服務(wù)存在負(fù)載均衡的問題,一個(gè)用戶多次訪問可能會被分配至不同server。redis會存儲所有server的session,統(tǒng)一獲?。?/li>
    4. 限速,基于計(jì)數(shù)器的本質(zhì),確保一定時(shí)間內(nèi)只能發(fā)送數(shù)次請求
    // 60s內(nèi)只能嘗試1次(比如短信驗(yàn)證場景)
    phoneNum = "1886*12***9";
    key = "msgLimitation:" + phoneNum;
    // setex 設(shè)置參數(shù)NX確保是全新的key才設(shè)置value為0
    isExists = redis.set(key, 0, "EX 60", "NX");
    if(isExists != null & redis.incr(key) <= 1) {
        //通過,第2次進(jìn)入的時(shí)候進(jìn)行語法判斷,發(fā)現(xiàn)key的value變成了2,會進(jìn)入下方限速區(qū)域
    }
    else {
        // 限速不通過
    }
    

B. hash

  • 概述:redis內(nèi)的hash類型的value包含多個(gè)fileds。比如key是user:10086,value里面有2個(gè)fields分別是name & age,具體對應(yīng)的value是dave & 18。

  • 主要操作

    1. 設(shè)置 & 獲取value
      • 基礎(chǔ)設(shè)置:hset key field value,設(shè)置成功會返回1,否則返回0。
      • 條件設(shè)置:當(dāng)這個(gè)field不存在時(shí)才可被新建,使用hsetnx key field value實(shí)現(xiàn)。
      • 獲取value:heget key field
    2. 刪除fields:hdel key field1 [field2],刪除全部fields則該hash key就消失了。
    3. 計(jì)算長度
      • hlen key,可獲得該key下的fields總數(shù),便于粗略判斷key的大小。
      • hstrlen key field,計(jì)算key的具體某個(gè)field的value的長度。
    4. 批量操作
      • 批量獲取即hmget key field1 [field2]
      • 批量設(shè)置即hmset key field1 value1 [field2 value2]。
    5. 判斷field存在與否:hexists key field,根據(jù)存在與否返回1或0。
    6. 全量獲取
      • 全部fields:使用hkeys key可看到key對應(yīng)的所有fields,hlen key只能看到field的總數(shù),不能看到具體內(nèi)容。
      • 全部values:hvals key獲得key對應(yīng)的所有values。
      • 全量內(nèi)容:hgetall key可以看到key下所有的fields和對應(yīng)的values。
    7. 計(jì)數(shù)器:作用域也是對于key下具體的某個(gè)field,語法為hincrby key field。
  • 優(yōu)點(diǎn):占用鍵少,合理使用可以減少內(nèi)存消耗

C. list

  • 概述:列表數(shù)據(jù)結(jié)構(gòu)中的元素是有序的,且元素可以重復(fù)。
  • 主要操作
    1. 基礎(chǔ)操作
      • 頭部添加:即左側(cè)插入,lpush key value1 [value2]
      • 尾部添加:即右側(cè)插入,rpush key value1 [value2]
      • 某元素位置添加:insert key before pivot value或者insert key after pivot value,在list元素為pivot前或后插入value元素。
      • 頭部彈出:即取出最左側(cè)元素,lpop key
      • 尾部彈出:即取出最右側(cè)元素,rpop key
      • 刪除指定元素:lrem key count value,刪除count個(gè)key中等于value的元素。count > 0,從左往右刪,count < 0則從右往左刪,count=0全刪。
      • 范圍刪除:ltrim key start end,僅保留start到end的部分,其他都刪掉。
      • 修改:lset key index newValue對具體某個(gè)下標(biāo)的元素做修改。
      • 列表的長度:llen key
    2. 查找
      • 獲取全部元素:lrange key start end,例如lrange test 0 -1即把名為test的list的全部元素羅列出來。
      • 獲取指定元素:lindex key index
    3. 阻塞操作
      • 彈出:blpop key1 key2 timeout或者brpop key1 key2 timeout,可對多個(gè)列表同時(shí)彈出,timeout設(shè)置為0代表會一直保持阻塞,一有新元素進(jìn)入就彈出。若多個(gè)client都是用命令,則先觸發(fā)命令的獲得彈出內(nèi)容。
  • 主要功能:
    1. 消息隊(duì)列:lpush + brpop的組合可實(shí)現(xiàn)阻塞隊(duì)列(FIFO),生產(chǎn)者使用lpush,消費(fèi)者使用brpop搶元素。若組合改為lpush + blpop即為棧。
    2. 文章列表:每個(gè)用戶有自己閱讀的文章列表。
      • 文章本身是用hash存儲的,比如hmset article:1 title xx time 12321 content yyyy,hmset article:2 title zz time 12298 content nhs
      • 設(shè)置用戶1號選手所閱讀的文章列表,lpush user:1:articles article:1 article:2

D. set

  • 概述:集合中無重復(fù)元素,且內(nèi)部是無序的,無法通過index獲取元素內(nèi)容。
  • 主要操作
    1. 基礎(chǔ)操作
      • 添加元素:sadd key element1 [element2],無需和hash一樣必須使用hmset才能設(shè)置多個(gè)field-value。
      • 刪除元素:srem key element1 [element2]
      • 隨機(jī)彈出元素:spop key
      • 計(jì)算元素個(gè)數(shù):scard key,類似hlen的效果。
      • 獲取全量元素:smembers key
    2. 查找
      • 判斷是否存在某元素:sismember key element
      • 隨機(jī)返回:srandmember key [count],count若不填寫,則返回一個(gè)元素,填了就根據(jù)數(shù)字返回。
    3. 集合間操作
      • 交集:sinter key1 key2 [key3]
      • 并集:sunion key1 key2 [key3]
      • 差集:sdiff key1 key2 [key3],差集的含義是key1集合中有,但其他集合中沒有的。
      • 存下結(jié)果:sinterstore newkey key1 key2 [key3],把結(jié)果存到newkey這個(gè)set中。
  • 主要功能:給用戶添加標(biāo)簽,或給某類標(biāo)簽添加用戶
  • 注意:smembers,lrange,hgetall都是時(shí)間復(fù)雜度高的命令,建議用sscan

E. sorted_set

  • 概述:保留了set的元素不重復(fù)這一特性,但是有序集合內(nèi)的元素可進(jìn)行排序,依據(jù)每個(gè)元素的score(多用于排行榜的場景)
  • 主要操作
    1. 基礎(chǔ)操作
      • 添加成員:zadd key score1 member1 [score2 member2]可添加其余參數(shù),例如nx xx(類似setnx)
      • 刪除成員:zrem key member1 [member2]
      • 刪除排名內(nèi)成員:zremrangebyrank key start end,刪除升序排名start-end內(nèi)的成員。
      • 刪除分?jǐn)?shù)內(nèi)成員:zremrangebyscore key min max
      • 計(jì)算成員個(gè)數(shù):zcard key
      • 某分?jǐn)?shù)段內(nèi)成員個(gè)數(shù):zcount key min max
      • 增加成員分?jǐn)?shù):zincrby key increment member
    2. 查找 & 排名
      • 獲取某個(gè)成員的分?jǐn)?shù):zscore key member
      • 返回排名范圍的成員:zrange key start end [withscores] & zrevrange key start end [withscores],帶上參數(shù)后返回結(jié)果會有score顯示。
      • 返回分?jǐn)?shù)范圍的成員:zrangebyscore key min max [withscores] [limit offset count],同樣也有zrevrangebyscore。
      • 計(jì)算成員排名:zrank key member & zrevrank key member,前者是從低到高排名,后者反之。
    3. 集合間操作
      • 交集:zinterstore newkey numkeys key1 [key2],newkey即結(jié)果保存到這個(gè)新集合中,numkeys意味著需要做交集計(jì)算的個(gè)數(shù)。
      • 并集:zunionstore newkey numkeys key1 [key2]
  • 主要功能:一般用于排行榜系統(tǒng),下方以點(diǎn)贊為場景進(jìn)行展示
    1. 添加用戶贊數(shù):zadd user:ranking:2022_07_03 3 mike,每天有一個(gè)rank的有序集合,在2022.07.03的排行榜上,用戶mike有3個(gè)贊。
    2. 后續(xù)點(diǎn)贊設(shè)計(jì):zincrby user:ranking:2022_07_03 1 mike,后續(xù)每點(diǎn)一個(gè)贊就score+1。
    3. 取消贊設(shè)計(jì):若用戶注銷,需刪除時(shí)使用zrem user:ranking:2022_07_03 mike,此時(shí)mike被刪除。
    4. 展示點(diǎn)贊排行榜:展示top10的點(diǎn)贊用戶和他們的具體點(diǎn)贊數(shù),則使用zrevrange user:ranking:2022_07_03 0 9 withscores
    5. 展示某個(gè)用戶的排名和點(diǎn)贊數(shù):排名為zrank user:ranking:2022_07_03 mike,點(diǎn)贊數(shù)為zscore user:ranking:2022_07_03 mike
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容