1. 程式人生 > 其它 >BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)

BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)

Redis資料型別

命令不區分大小寫,key區分大小寫

1、資料型別

  1. String (字串)
  2. Hash (雜湊)
  3. List (列表型別)
  4. Set (集合型別)
  5. SortedSet (有序集合型別,簡稱 Zset)
  6. Bitmap (點陣圖)
  7. HyperLoglog (統計)
  8. GEO (地理)
  9. Stream

2、String的使用

2.1 最常用

  • set key value
  • get key

2.2 同時設定/獲取多個鍵值

  • mset key value [key, value, key ,value ……]
  • mget key [key ……]

2.3 數值的增減

  • 遞增數值 incr key
  • 增加指定的整數 incrby key increment
  • 遞減數值 decr key
  • 減少指定的整數 decrby key decrment

2.4 獲取 字串長度

  • strlen key

2.5 分散式鎖

  • setnx key value
  • set key value [EX seconds] [PX milliseconds] [NX|XX]
    • EX 表示key 在多少秒之後過期
    • PX 表示在多少毫秒之後過期
    • NX 表示當key 不存在的時候,才建立key,效果等同於 setnx
    • XX 表示當key 存在的時候,覆蓋key

2.6 應用場景

  • 抖音無限點贊某個視訊或者商品,點一下加一次
  • 是否喜歡文章

3、Hash的使用

3.1 Map<String, Map<Object, Object>>

3.2 一次設定一個欄位值

  • hset key feild value

3.3 一次獲取一個欄位值

  • hget key feild

3.4 一次設定多個欄位值

  • hmset key feild value [feild value ……]
    • key 表示map的key
    • feild表示 map中value的key
    • value 表示 map 中value的value

3.5 一次獲取多個欄位值

  • hmget key feild [feild……]

3.6 獲取所有欄位值

  • hgetall key

3.7 獲取某個key內的全部數量

  • hlen

3.8 刪除一個 key

  • hdel

3.9 應用場景

  • JD某物車早期
  • 設計目前不再採用,當前中小廠可用

4、list的使用

4.1 說明

一個雙端連結串列的結構,容量是2的32次方減一個元素,大概40多億,主要功能有 push/pop等,一般用在棧、佇列、訊息佇列等場景。

4.2 向列表左邊新增元素

  • lpush key value [value ……]

4.3 向列表右邊新增元素

  • rpush key value [value……]

4.4 檢視列表

  • lrange key start stop

4.5 獲取列表中元素的個數

  • llen key

4.6 應用場景

  • 微信公眾號訂閱的訊息

  • 商品評論列表

    • 需求:使用者針對某一商品釋出評論時,一個商品會被不同的使用者進行評論,儲存商品評論時,要按照時間排序

    • 需求:使用者在前段頁面查詢該商品時,需要按照時間順序降序排序

    • 實現:

      • 使用list儲存商品評論資訊,key是該商品的id,value是商品評論資訊商品編號為 1001的商品評論key 【items:comment:1001】

      • lpush items:comment:1001 {"id":1001, "name":"huawei", "date": 1634634833, "content":"ljhgka;fafagakg;ahafaf;ohiga"}
        

5、set的使用 (無重複)

無重複資料的容器

5.1 新增元素

  • sadd key member [member……]

5.2 刪除元素

  • srem key member [member……]

5.3 遍歷集合中的所有元素

  • smembers key

5.4 判斷元素 是否在集合中

  • sismember key member

5.5 獲取集合中的元素總數

  • scard key

5.6 從集合中隨機彈出一個元素,元素不刪除

  • srandmember key [數字]

5.7 從集合中隨機彈出一個元素,出一個刪一個

  • spop key [數字]

5.8 集合運算

  • A、B
    • A : abc12
    • B: 123ax
  • 集合的差集運算 A-B
    • 屬於A但是不屬於B的元素構成的集合
    • sdiff key [key……]
  • 集合的交集運算 A∩B
    • 屬於A同時也屬於B的共同擁有的元素構成的集合
    • sinter key [key……]
  • 集合的並集運算 A∪B
    • 屬於A或者屬於B的元素合併後的集合
    • sunion key [key……]

5.9 應用場景

  • 微信抽獎小程式
    • 使用者ID,立即參與按鈕 => sadd key 使用者ID
    • 顯示已經有多少人蔘與了=> scard key
    • 抽獎(從set中任意選取N箇中獎人) => srandmember key 2 => 隨機抽獎兩個人,元素不刪除
      • spop key 3 => 隨機抽獎3個人,元素會刪除
  • 微信朋友圈點贊
    • 新增點贊 => sadd pub:msgID 點贊使用者ID1 點贊使用者ID2
    • 取消點贊 => srem pub:msgID 點贊使用者ID
    • 展示所有點贊過的使用者 => smembers pub:msgID
    • 點贊使用者數統計,就是常見的點贊紅色陣列 => scard pub:msgID
    • 判斷某個朋友是否對樓主點贊過 => sismember pub:msgID 使用者ID
  • 微博好友關注社交關係
    • 共同關注的人
    • 我關注的人也關注他(大家愛好相同)
  • QQ內推可能認識的人

6、Zset的使用

向有序集合中加入一個元素和該元素的分數

6.1 新增元素

  • zadd key score member [score member ……]

6.2 按照元素分數從小到打的順序,返回索引從 start 到 stop 之間的所有元素

  • zrange key start stop [withscores]

6.3 獲取元素的分數

  • Zscore key member

6.4 刪除元素

  • zrem key member [member……]

6.5 獲取指定分數範圍的元素

  • zrangebyscore key min max [withscores] [limit offset count]

6.6 增加某個元素的分數

  • zincrby key increment member

6.7 獲取集合中元素的數量

  • zcard key

6.8 獲取元素的排名

  • 從小到大
    • zrank key member
  • 從大到小
    • zrevrank key member

6.9 應用場景

  • 根據商品銷售隊商品進行排序顯示
    • 思路:定義商品銷售排行榜 (sorted set集合),key為goods:sellsort,分數為商品銷售數量
    • 商品編號1001的銷量是9,商品編號1002的銷量是15 => zadd goods:sellsort 9 1001 15 1002
    • 有一個客戶又買了兩件商品1001,商品編號1001銷量加2 => zincrby goods:sellsort 2 1001
    • 求商品銷量前10名 => zrange goods:sellsort 0 10 withscores
  • 抖音熱搜
    • 點選視訊 => zincrby hotvcr:20211019 1 八佰
      • zincrby hotvcr:20211019 15 八佰 2 花木蘭
    • 展示當日排行前10條 => zrevrange hotvcr:20211019 0 9 withscores