当前位置:网站首页>Redis數據類型日常使用場景

Redis數據類型日常使用場景

2022-06-11 12:24:00 請叫我靚仔丶

一、 String

1. 緩存

	 簡單的key-value存儲

2. 分布式鎖

		setnx key value,當key不存在時,將key 的值設為 value ,返回1;
		若給定的 key 已經存在,則setnx不做任何動作,返回0。
		當setnx返回1時,錶示獲取鎖,做完操作以後del key,錶示釋放鎖;如果  setnx返回0錶示獲取鎖失敗,整體思路大概就是這樣

3. 計數器

	  Redis中有一個字符串相關的命令incr key,incr命令將 key 中儲存的數字值增一,返回結果分為以下三種情况:
  • 值不是整數,返回錯誤
  • 值是整數,返回自增後的結果
  • key不存在, key 的值會先被初始化為 0 ,返回1

比如文章的閱讀量,視頻的播放量等等都會使用redis來計數,每播放一次,對應的播放量就會加1,同時將這些數據异步存儲到數據庫中達到持久化的目的。

set key 0 
 
incr key // incr readcount::{帖子id} 每閱讀一次
 
get key // get readcount::{帖子id} 獲取閱讀量 

4. IP限制

為了安全考慮,會對IP進行限制,限制同一IP在一定的時間內訪問次數不能超過N次

二、 List

Redis 裏的 List 是一個鏈錶,由於鏈錶本身插入和删除比較塊,但是查詢的效率比較低,所以常常被用做异步隊列。Redis 裏的 List 設計非常牛,當數據量比較小的時候,數據結構是壓縮鏈錶,而當數據量比較多的時候就成為了快速鏈錶。
列錶類型用來存儲多個有序的字符串,一個列錶最多可以存儲2^32-1個元素,列錶的兩端都可以插入和彈出元素。

1.消息隊列

在業務中异步隊列使用 rpush/lpush 操作隊列,使用 lpop 和 rpop 出隊列,具體結構如下圖所示:
在這裏插入圖片描述
Redis雖然支持消息隊列的實現,但是並不支持ack。所以redis實現的消息隊列不能保證消息的可靠性,除非自己實現消息確認機制,不過這非常麻煩,所以如果是重要的消息還是推薦使用專門的消息隊列去做。

2.文章列錶

因為列錶的元素不但是有序的,而且還支持按照索引範圍獲取元素。因此我們可以使用命令lrange key 0 9分頁獲取文章列錶

三、 Hash

Redis的散列可以讓用戶將多個鍵值對存儲到一個Redis的鍵裏面,散列非常適用於將一些相關的數據存儲在一起。類似map的一種結構,將結構化的數據,比如一個對象(前提是這個對象沒嵌套其他的對象)給緩存到redis中,以後每次讀寫內存時,就可以操作hash裏的某個字段。

1.Hash內部編碼

哈希類型的內部編碼有倆種
  • zipList(壓縮列錶):當哈希類型元素個數小於hash-max-ziplist-entries配置(默認512個)同時所有值都小於hash-max-ziplist-value配置(默認64字節)時使用。ziplist使用更加緊凑的結構實現多個元素的連續存儲,所以比hashtable更加節省內存。
  • hashtable(哈希錶):當ziplist不能滿足要求時,會使用hashtable。

2.使用場景

由於hash類型存儲的是多個鍵值對,比如數據庫有以下一個用戶錶結構

IDNAMEage
1靚仔28
hset user:1 name 靚仔 age 28

使用哈希存儲會比字符串更加方便直觀

四、 set

set集合類型也可以保存多個字符串元素,與列錶不同的是,集合中不允許有重複元素並且集合中的元素是無序的。一個集合最多可以存儲2^32-1個元素。

無序集合,自動去重,將數據放到set中就可去重,可以基於JVM的HashSet去重,如果系統部署在多臺機器上,就可以用redis進行全局去重。可以基於set做交集,並集,差集的操作。如把2個人的粉絲列錶弄一個交集,就能看到兩個人的共同好友是誰。

1. 抽獎功能

集合有兩個命令支持獲取隨機數,分別是:
  • 隨機獲取count個元素,集合元素個數不變
srandmember key [count]
  • 隨機彈出count個元素,元素從集合中彈出,集合元素個數改變
spop key [count]

用戶點擊抽獎按鈕,參數抽獎,將用戶編號放入集合,然後抽獎,分別抽一等獎、二等獎,如果已經抽中一等獎的用戶不能參數抽二等獎則使用spop,反之使用srandmember。

五、 Zset(sorted set )

zset是Redis中最具有特色的數據結構(跳躍列錶),首先它有set不可重複的特性,在這個基礎上,還可以給value賦予一個排序權重score,所謂的有序其實就是根據這個得分來排序。排序的set,可以去重還可以排序,寫進去的時候給一個分數,自動根據根據分數排序,分數可以自定義排序規則。

Redis 有序集合zset和集合set一樣也是String類型元素的集合,且不允許重複的成員。不同的是 zset 的每個元素都會關聯一個分數(分數可以重複),redis 通過分數來為集合中的成員進行從小到大的排序。Redis的zset天生是用來做排行榜的,榜單,總榜,熱榜。

1、zset內部編碼

有序集合類型的內部編碼有兩種:

ziplist(壓縮列錶):當有序集合的元素個數小於list-max-ziplist-entries配置(默認128個)同時所有值都小於list-max-ziplist-value配置(默認64字節)時使用。ziplist使用更加緊凑的結構實現多個元素的連續存儲,更加節省內存。

skiplist(跳躍錶):當不滿足ziplist的要求時,會使用skiplist。

2、排行榜

用戶發布了n篇文章,其他人看到文章後給喜歡的文章點贊,使用score來記錄點贊數,有序集合會根據score排行。流程如下

用戶發布一篇文章a,初始點贊數為0,即score為0

zadd user:article 0 a

有人給文章a點贊,遞增1

zincrby user:article 1 a

查詢點贊前三篇文章

zrevrangebyscore user:article 0 2

查詢點贊後三篇文章

zrangebyscore user:article 0 2

六、Bitmap

七、HyperLogLog(基數)

八、Geospatial (地理空間索引)

九、Streams

原网站

版权声明
本文为[請叫我靚仔丶]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/162/202206111211099726.html