【Redis】4.Redis数据存储listsetsorted_set
list類型
- 數據存儲需求:存儲多個數據,并對數據進入存儲空間的順序進行區分
- 需要的存儲數據:一個存儲空間保存多個數據,且通過數據可以體現進入順序
- list類型:保存多個數據,底層使用雙向鏈表存儲結構實現
list類型數據基本操作
- 添加/修改數據
lpush key value1 [value2] …
rpush key value1 [value2] …
- 獲取數據
lrange key start stop
lindex key index
llen key
- 刪除并移除數據
lpop key
rpop key
list 類型數組擴展操作
- 規定時間內獲取并移除數據
blpop key1 [key2] timeout
brpop key1 [key2] timeout
阻塞式獲取,獲取值如果還沒有的時候可以等,如果有值就可以獲取到。
業務場景
微信朋友圈點贊,要求按照點贊順序顯示點贊好友信息,如果取消點贊,移除對應好友信息
- 移除指定數據
lrem key count value
- redis應用于具有操作先后順序的數據控制
list類型數據操作注意事項
- list 中保存的數據都是string類型的,數據總容量是有限的,最多232-1個元素(4294967295)
- list具有索引的概念,但是操作數據時候通常以隊列的形式進行入隊出隊操作,或以棧的形式進入棧出棧的操作
- 獲取全部數據操作結束索引設置為-1
- list 可以對數據進行分頁操作,通過第一頁的信息來自list,第2頁及更多的信息通過數據庫的形式加載
list類型應用場景
業務場景
- twitter、新浪微博、騰訊微博中個人用于的關注列表需要按照用戶的關注順序進行展示,粉絲列表需要將最近關注的粉絲列在前面
- 新聞、資訊類網站如何將最新的新聞或資訊按照發生的事件順序展示
- 企業運營過程中,系統將產生出大量的運營數據,如何保障墮胎服務器操作日志的統一順序輸出?
解決方案 - 依賴list的數據具有順序的特征對信息進行管理
- 使用隊列模型解決多路信息匯總合并的問題
- 使用棧模型解決最新消息的問題
Set類型
- 新的存儲需求:存儲大量的數據,在查詢方面提供更高的效率
- 休要的存儲結構:能夠保存大量的數據,搞笑的內部存儲機制,便于查詢
- set類型:與hash存儲結構完全相同,僅存儲鍵(field),不存儲值(nil),并且值不允許重復的
set類型數據的基本操作
- 添加數據
sadd key menber1 [member2]
- 獲取全部數據
smembers key
- 刪除數據
srem key member1 [member2]
- 獲取集合數據總量
scard key
- 判斷集合中是否包含指定數據
sismember key member
set類型數據的擴展操作
業務場景
每位用戶首次使用進入頭條時候會設置3項愛好的內容,但是后期為了增加用戶的活躍度,興趣點,必須讓用戶對其他信息類別逐漸產生興趣,增加客戶留存度,如何實現?
業務分析
- 系統分析出各個分類的最新或最熱點信息條目并組織成set集合
- 隨機挑選其中部分信息
- 配合用戶關注信息分類中的熱點信息組織展示的全信息集合
解決方案 - 隨機獲取集合中指定數量的數據
srandmember key [count]
- 隨機獲取集合中的某個數據并將該數據移出集合
spop key
- redis應用于隨機推薦類信息檢索,例如熱點歌單推薦,熱點新聞推薦,熱點旅游線路,應用APP推薦,大V推薦等
set類型數據的擴展操作
業務場景
解決方案
- 求兩個集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
- 求兩個集合的交、并、差集并存儲到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
- 將指定數據從原始集合移動到目標集合中
smove source destination member
- redis應用于同類信息的關聯搜索,二度關聯搜索,深度關聯搜索
- 顯示共同關注(一度)
- 顯示共同好友(一度)
- 由用戶A出發,獲取到好友用戶B的好友信息列表(一度)
- 由用戶A出發,獲取到好友用戶B的購物清單列表(二度)
- 由用戶A出發,獲取到好友用戶B的游戲充值列表(二度)
Set類型數據操作的注意事項
- set類型不允許數據重復,如果添加的數據在set中已經存在,將只保留一份
- set雖然與hash的存儲結構相同,但是無法啟用hash中存儲值的空間
業務場景
解決方案 - 依賴set集合數據不重復的特征,依賴set集合hash存儲結構特征完成數據過濾與快速查詢
- 根據用戶id獲取用戶所有角色
- 根據用戶所有角色獲取用戶所有操作權限放入set集合
- 根據用戶所有覺得獲取用戶所有數據全選放入set集合
校驗工作:redis提供基礎數據還是提供校驗結果
Tips 10:
- redis應用于同類型不重復數據的合并操作
set類型應用場景
業務場景
解決方案
- 利用set集合的數據去重特征,記錄各種訪問數據
- 建立string類型數據,利用incr統計日訪問量(PV)
- 建立set模型,記錄不同cookie數量(UV)
- 建立set模型,記錄不用IP數量(IP)
業務場景(黑白名單)
解決方案
- 基于經營戰略設定問題用戶發現、鑒別規則
- 周期性更行滿足規則的用戶黑名單,加入set集合
- 用戶行為信息達到后與黑名單進行比比對,確認行為去向
- 黑名單過濾IP地址:應用于開放游客訪問權限的信息源
- 黑名單過濾設備信息:應用于限定訪問設備的信息源
- 黑名單過濾用戶:應用于基于訪問權限的信息源
Tips 12:
- redis應用于基于黑名單與白名單設定的服務控制
sorted_set
- 新的存儲需求:根據排序有利于數據的有效顯示,需要提供一種可以根據自身特征進行排序的方式
- 需要的存儲結構:新的存儲模型,可以保存可排序的數據
- sorted_set類型:在set的存儲結構基礎上添加可排序字段
sorted_set類型數據的基本操作
- 添加數據
zadd key score1 member1 [score2 member2]
- 獲取全部數據
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
- 刪除數據
zrem key member [member …]
- 按條件獲取數據
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
- 條件刪除
zremrangebyrank key start stop
zremrangebyscore key min max
注意:
-
min與max用于限定搜索查詢的條件
-
start與stop用于限定查詢范圍,作用于索引,表示開始和結束索引
-
offset與count用于限定查詢范圍,作用于查詢結果,表示開始位置和數據總量
-
獲取集合數據總量
zcard key
zcount key min max
- 集合交、并操作
zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]
sorted_set 類型數據的擴展操作
業務場景
解決方案
- 獲取數據對應的索引(排名)
zrank key member
zrevrank key member
- score 值獲取與修改
zscore key member
zincrby key increment member
Tips 13:
- redis 應用于計數器組合排序功能對應的排名
sorted_set 類型數據操作的注意事項
- score 保存的數據存儲空間是64位,如果是整數范圍是
- score保存的數據也可以是一個雙精度的double值,基于雙精度浮點數的特征,可能會丟失精度,使用時侯要慎重
- sorted_set底層存儲還是基于set結構的,因此數據不能重復,如果重復添加相同的數據,score值將被反復覆蓋,保留最后一次修改的結果
業務場景
解決方案
- 對于基于時間線限定的任務處理,將處理時間記錄位score值,利用排序功能區分處理的先后順序
- 記錄下一個要處理的事件,當到期后處理對應的任務,移除redis中的記錄,并記錄下一個要處理的時間
- 當新任務加入時,判定并更新當前下一個要處理的任務時間
- 為提升sorted_set的性能,通常將任務根據特征存儲成若干個sorted_set.例如1小時內,1天內,年度等,操作時逐漸提升,將即將操作的若干個任務納入到1小時內處理隊列中
- 獲取當前系統時間
time
Tips 14
- redis應用于定時任務執行順序管理或任務過期管理
業務場景任務/消息權重設定應用
解決方案
- 對于帶有權重的任務,優先處理權重高的任務,采用score記錄權重即可
Tips 15: - redis應用于即時任務/消息隊列執行管理
總結
以上是生活随笔為你收集整理的【Redis】4.Redis数据存储listsetsorted_set的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Redis】3. Redis数据类型
- 下一篇: 【Redis】6.Redis key通用