redis各個資料型別的使用場景redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。
redis列表命令
參考:使用場景string
string資料結構是簡單的key-value型別,value其實不僅可以是string,也可以是數字。
常規key-value快取應用;
常規計數:微博數,粉絲數等。
hash
redis hash是乙個string型別的field和value的對映表,hash特別適合用於儲存物件。
儲存部分變更的資料,如使用者資訊等。
list
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
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 1sadd tag:ruby 2sadd tag:web 2sadd 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意為集合,所以會自動排重。
sorted 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//當使用者登入時,對該使用者的登入次數自增1ret = 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_start1redis 127.0.0.1:6379> zadd ranges 20 a_end1redis 127.0.0.1:6379> zadd ranges 30 b_start1redis 127.0.0.1:6379> zadd ranges 40 b_end1
這樣資料在插入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
pub/sub 從字面上理解就是發布(publish)與訂閱(subscribe),在redis中,你可以設定對某乙個key值進行訊息發布及訊息訂閱,當乙個key值上進行了訊息發布後,所有訂閱它的客戶端都會收到相應的訊息。這一功能最明顯的用法就是用作實時訊息系統,比如普通的即時聊天,群聊等功能。
使用場景
pub/sub構建實時訊息系統
redis的pub/sub系統可以構建實時的訊息系統
比如很多用pub/sub構建的實時聊天系統的例子。
redis 資料型別使用場景
redis各個資料型別的使用場景 redis支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 及zset sorted set 有序集合 redis列表命令 參考 使用場景string string資料結構是簡單的key value型別,value其實不僅可以是st...
Redis 資料型別 使用場景
string 一般做一些複雜的計數功能的快取 list 做簡單的訊息佇列的功能 hash 單點登入 set 做全域性去重的功能 sortedset 做排行榜應用,取topn操作 延時任務 做範圍查詢 簡介特性 場景string 字串 redis的字串是動態字串,是可以修改的字串,它的內部表示就是乙個...
Redis資料型別及使用場景
wqtech閱讀 2936 摘要 redis相比其它的kv資料庫,其一大特點是支援豐富的資料型別.它一共支援5種資料型別,下面逐一介紹這5種資料型別及其使用場景.redis相比其它的kv資料庫,其一大特點是支援豐富的資料型別。它一共支援5種資料型別,下面逐一介紹這5種資料型別及其使用場景和內部實現方...