日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis进阶-核心数据结构进阶实战

發(fā)布時(shí)間:2025/3/21 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis进阶-核心数据结构进阶实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 入門
  • 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ǔ)存的值減去decrement

Hash

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鍵的值加上增量increment

List

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

? 購物車操作

  • 添加商品?hset cart:1001 10088 1
  • 增加數(shù)量?hincrby cart:1001 10088 1
  • 商品總數(shù)?hlen cart:1001
  • 刪除商品?hdel cart:1001 10088
  • 獲取購物車所有商品?hgetall cart:1001

  • 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

    LPUSH msg:{我的-ID} 10018

    2)B 23:05 發(fā)布公眾號(hào)文章,消息ID為10086

    LPUSH msg:{我的-ID} 10086

    3)C 23:30 發(fā)布公眾號(hào)文章,消息ID為10099

    LPUSH msg:{我的-ID} 10099

    3)查看最新的關(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 stop

    Set

    點(diǎn)贊,收藏,標(biāo)簽

  • 點(diǎn)贊
  • SADD like:{消息ID} {用戶ID}
  • 取消點(diǎn)贊
  • SREM like:{消息ID} {用戶ID}
  • 檢查用戶是否點(diǎn)過贊
  • SISMEMBER like:{消息ID} {用戶ID}
  • 獲取點(diǎn)贊的用戶列表
  • SMEMBERS like:{消息ID}
  • 獲取點(diǎn)贊用戶數(shù)
  • SCARD like:{消息ID}

    抽獎(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 WITHSCORES

    3)七日搜索榜單計(jì)算

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

    4)展示七日排行前十

    ZREVRANGE hotNews:20200301-20200307 0 10 WITHSCORES

    總結(jié)

    以上是生活随笔為你收集整理的Redis进阶-核心数据结构进阶实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。