Redis各個資料型別的使用場景

2021-08-14 15:24:53 字數 4771 閱讀 1720

redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

參考:string資料結構是簡單的key-value型別,value其實不僅可以是string,也可以是數字。 

常規key-value快取應用; 

常規計數:微博數,粉絲數等。

redis hash是乙個string型別的field和value的對映表,hash特別適合用於儲存物件。 

儲存部分變更的資料,如使用者資訊等。

list就是鍊錶,略有資料結構知識的人都應該能理解其結構。使用lists結構,我們可以輕鬆地實現最新訊息排行等功能。list的另乙個應用就是訊息佇列,可以利用list的push操作,將任務存在list中,然後工作執行緒再用pop操作將任務取出進行執行。redis還提供了操作list中某一段的api,你可以直接查詢,刪除list中某一段的元素。 

redis的list是每個子元素都是string型別的雙向鍊錶,可以通過push和pop操作從列表的頭部或者尾部新增或者刪除元素,這樣list即可以作為棧,也可以作為佇列。

訊息佇列系統

使用list可以構建佇列系統,使用sorted set甚至可以構建有優先順序的佇列系統。 

比如:將redis用作日誌收集器 

實際上還是乙個佇列,多個端點將日誌資訊寫入redis,然後乙個worker統一將所有日誌寫到磁碟。

取最新n個資料的操作

//把當前登入人新增到煉表裡

ret = r.lpush("login:last_login_times", uid)

//保持鍊錶只有n位

ret = redis.ltrim("login:last_login_times", 0, n-1)

//獲得前n個最新登陸的使用者id列表

last_login_list = r.lrange("login:last_login_times", 0, n-1)

set就是乙個集合,集合的概念就是一堆不重複值的組合。利用redis提供的set資料結構,可以儲存一些集合性的資料。set中的元素是沒有順序的。 

案例:在微博應用中,可以將乙個使用者所有的關注人存在乙個集合中,將其所有粉絲存在乙個集合。redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到乙個新的集合中。

交集,並集,差集

//book表儲存book名稱

set book:1:name "the ruby programming language"

set book:2:name "ruby on rail"

set book:3:name "programming erlang"

//tag表使用集合來儲存資料,因為集合擅長求交集、並集

sadd tag:ruby 1

sadd tag:ruby 2

sadd tag:web 2

sadd tag:erlang 3

//即屬於ruby又屬於web的書?

inter_list = redis.sinter("tag:web", "tag:ruby")

//即屬於ruby,但不屬於web的書?

diff_list = redis.sdiff("tag:ruby", "tag:web")

//屬於ruby和屬於web的書的合集?

union_list = redis.sunion("tag:ruby", "tag:web")

獲取某段時間所有資料去重值

這個使用redis的set資料結構最合適了,只需要不斷地將資料往set中扔就行了,set意為集合,所以會自動排重。

和set相比,sorted set增加了乙個權重引數score,使得集合中的元素能夠按score進行有序排列,比如乙個儲存全班同學成績的sorted set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。可以用sorted set來做帶權重的佇列,比如普通資訊的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

排行榜應用,取top n操作

這個需求與上面需求的不同之處在於,前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,這時候就需要我們的sorted set出馬了,將你要排序的值設定成sorted set的score,將具體的資料設定成相應的value,每次只需要執行一條zadd命令即可。

//將登入次數和使用者統一儲存在乙個sorted set裡

zadd login:login_times 5

1zadd login:login_times 1

2zadd login:login_times 2

3//當使用者登入時,對該使用者的登入次數自增1

ret = r.zincrby("login:login_times", 1, uid)

//那麼如何獲得登入次數最多的使用者呢,逆序排列取得排名前n的使用者

ret = r.zrevrange("login:login_times", 0, n-1)

- 列出前100名高分選手

- 列出某使用者當前的全球排名

這些操作對於redis來說小菜一碟,即使你有幾百萬個使用者,每分鐘都會有幾百萬個新的得分。 

模式是這樣的,每次獲得新得分時,我們用這樣的**:

zadd leaderboard 

你可能用userid來取代username,這取決於你是怎麼設計的。 

得到前100名高分使用者很簡單:

zrevrange leaderboard 0 99
使用者的全球排名也相似,只需要:

zrank leaderboard 
需要精準設定過期時間的應用

比如你可以把上面說到的sorted set的score值設定成過期時間的時間戳,那麼就可以簡單地通過過期時間排序,定時清除過期資料了,不僅是清除redis中的過期資料,你完全可以把redis裡這個過期時間當成是對資料庫中資料的索引,用redis來找出哪些資料需要過期刪除,然後再精準地從資料庫中刪除相應的記錄。

範圍查詢

來自redis在google group上的乙個問題,有一位同學發貼求助,說要解決如下的乙個問題:他有乙個ip範圍對應位址的列表,現在需要給出乙個ip的情況下,迅速的查詢到這個ip在哪個範圍,也就是要判斷此ip的所有地。這個問題引來了redis作者salvatore sanfilippo(@antirez)的回答。解答如下: 

例如有下面兩個範圍,10-20和30-40 

- a_start 10, a_end 20 

- b_start 30, b_end 40 

我們將這兩個範圍的起始位置存在redis的sorted set資料結構中,基本範圍起始值作為score,範圍名加start和end為其value值:

redis 127.0

.0.1

:6379> zadd

ranges 10 a_start

1redis 127.0

.0.1

:6379> zadd

ranges 20 a_end

1redis 127.0

.0.1

:6379> zadd

ranges 30 b_start

1redis 127.0

.0.1

:6379> zadd

ranges 40 b_end

1

這樣資料在插入sorted set後,相當於是將這些起始位置按順序排列好了。 

現在我需要查詢15這個值在哪乙個範圍中,只需要進行如下的zrangbyscore查詢:

redis

127.0.0.1:6379> zrangebyscore ranges (15 +inf limit 0

11) "a_end"

這個命令的意思是在sorted sets中查詢大於15的第乙個值。(+inf在redis中表示正無窮大,15前面的括號表示》15而非》=15) 

查詢的結果是a_end,由於所有值是按順序排列的,所以可以判定15是在a_start到a_end區間上,也就是說15是在a這個範圍裡。至此大功告成。 

當然,如果你查詢到的是乙個start,比如咱們用25,執行下面的命令:

redis

127.0.0.1:6379> zrangebyscore ranges (25 +inf limit 0

11) "b_start"

返回結果表明其下乙個節點是乙個start節點,也就是說25這個值不處在任何start和end之間,不屬於任何範圍。 

當然,這個例子僅適用於類似上面的ip範圍查詢的案例,因為這些值範圍之間沒有重合。如果是有重合的情況,這個問題本身也就變成了乙個一對多的問題。

pub/sub 從字面上理解就是發布(publish)與訂閱(subscribe),在redis中,你可以設定對某乙個key值進行訊息發布及訊息訂閱,當乙個key值上進行了訊息發布後,所有訂閱它的客戶端都會收到相應的訊息。這一功能最明顯的用法就是用作實時訊息系統,比如普通的即時聊天,群聊等功能。

使用場景

pub/sub構建實時訊息系統

redis的pub/sub系統可以構建實時的訊息系統 

比如很多用pub/sub構建的實時聊天系統的例子。

**:

Redis各個資料型別應用場景

redis各個資料型別應用場景,菜鳥教程 型別 簡介特性 場景string 字串 二進位制安全 可以包含任何資料,比如jpg或者序列化的物件,乙個鍵最大能儲存512m hash 字典 鍵值對集合,即程式語言中的map型別 適合儲存物件,並且可以像資料庫中update乙個屬性一樣只修改某一項屬性值 m...

redis學習 redis各個資料型別使用場景

一 回顧一下redis的幾個基本資料型別 string list set hash zset 回歸redis的本質,充當資料快取,降低磁碟io的操作的次數,提公升查詢響應速度 2 list 列表型別是用來儲存多個有序的字串,列表中的每個字串成為元素 element 乙個列表最多可以儲存 2的32次方...

Redis的各個資料型別操作

string 最簡單的字串型別鍵值對快取,也是最基本的 keys 檢視所有的key 不建議在生產上使用,有效能影響 type key key的型別 get set del 查詢 設定 刪除 set rekey data 設定已經存在的key,會覆蓋 setnx rekey data 設定已經存在的k...