Redis各種型應用場景

 

Redis的六種特性

Stringshtml

Hashsjava

Listsweb

l Setsredis

l Sorted Setssql

Pub/Sub數據庫

Redis各特性的應用場景

Strings

Strings 數據結構是簡單的key-value類型,value其實不只是String,也能夠是數字。json

經常使用方法

方法api

說明緩存

特性ruby

set

設置key對應的的值爲String類型的value

   

get

獲取對應key對應的String的值,若是不存在返回nil

   

setnx

設置能夠爲對應的值爲String類型的value,若是key存在返回0不覆蓋,不存在返回1

nx的意思爲not exist

Set the value of a key, only if the key does not exist

setex

置key對應的值爲String類型的value,並指定此鍵值對應的有效期

SETEX key seconds value

例:setex mykey 10 你好

setrange

設置key的value的子字符串

setrange key 位置 替換的內容

若是替換內容沒有原value長,則原value剩餘的內容將被保留

mset

一次設置多個key的值,成功返回ok,失敗返回0,要成功都成功,要不成功所有失敗。

mset key1 內容一 key2 內容二

msetnx

一次設置多個key的值,成功返回ok,失敗返回0,不覆蓋已經存在的值,要成功都成功,要失敗都失敗。

   

getset

設置key的值並返回key的舊值

getset key newValuse

getrange

獲取key對應的value子字符串

getrange key 0 5 //獲取前6個字符

mget

批量獲取

mget key1 key2 key3 //沒有設置則返回空

incr

對key的值作增長操做,並返回新的值

   +1

incrby

對能夠的value加指定的值,

key若是不存在會設置key並value爲0

incrby key1 5 //對key1的值加5

decr

對key的值作減減操做

    -1

decrby

對key的值減去指定值

   

append

給指定key的字符串追加value,返回新的字符串長度

   

strlen

取指定key的value值的長度

   

使用場景

常規key-value緩存應用。

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

Hashs

在Memcached中,咱們常常將一些結構化的信息打包成hashmap,在客戶端序列化後存儲爲一個字符串的值,好比用戶的暱稱、年齡、性別、積分等,這時候在須要修改其中某一項時,一般須要將全部值取出反序列化後,修改某一項的值,再序列化存儲回去。這樣不只增大了開銷,也不適用於一些可能併發操做的場合(好比兩個併發的操做都須要修改積分)。而Redis的Hash結構可使你像在數據庫中Update一個屬性同樣只修改某一項屬性值。

它是一個String類型的field和value的映射表,它的添加和刪除都是平均的,hash特別適合用於存儲對象,對於將對象存儲成字符串而言,hash會佔用更少的內存,而且能夠更方便的存取整個對象. 它和java的HashMap徹底相似

經常使用方法

方法

說明

特性

hset

設置一個hash 的field爲指定值,若是key不存在則先建立

hset tab ke1 val1

hget

獲取某個hash的某個field值

hget tab ke1

hsetnx

相似string只是操做的是hash

   

hmset

批量設置hash的內容

   

hmget

獲取hash表的所有key值

Hmget key field1 field2

hincrby

給hash表的某個字段增長值

   

hexists

判斷hash表中某個key是否存在

   

hlen

返回hash表中的key數量

   

hdel

刪除指定hash表的某個鍵值對

   

hkeys

返回hash表中全部的key

    

hvals

返回hash表中全部的value

   

hgetall

 獲取hash表中全部key和value

   

使用場景

存儲部分變動數據

如用戶信息等。

Lists

Lists 就是鏈表,略有數據結構知識的人都應該能理解其結構。使用Lists結構,咱們能夠輕鬆地實現最新消息排行等功能。Lists的另外一個應用就是消息隊列,能夠利用Lists的PUSH操做,將任務存在Lists中,而後工做線程再用POP操做將任務取出進行執行。Redis還提供了操做Lists中某一段的api,你能夠直接查詢,刪除Lists中某一段的元素。

 

Redis的list是每一個子元素都是String類型的雙向鏈表,能夠經過push和pop操做從列表的頭部或者尾部添加或者刪除元素,這樣List便可以做爲棧,也能夠做爲隊列。

經常使用方法

方法

說明

特性

lpush

在key所對應的list頭部添加一個元素

l的意思是left

rpush

在key說對應的list尾部添加一個元素

r的意思是right

lrange

顯示list裏面的內容

lrange 0 -1 //所有顯示

linsert

在key對應的list

linsert mylist before one myvalue

lset

設置list中指定下標元素的值

lset mylist index myvalue

lrem

從key對應的list中刪除n個和value相同的元素,結果返回影響元素的個數,n<0從尾部開始刪除,n=0全刪除

lrem mylist count "value"

ltrim

保留指定key範圍內的數據,返回ok成功

ltrim mylist 0 3 //0-3是保留的範圍

lpop

從list的頭部刪除一個元素,並返回該刪除的元素

 

rpop

從list的尾部彈出一個元素,並返回該刪除的元素

 

rpoplpush

從第一個list的尾部元素異常元素並添加到第二個list的頭部

rpoplpush mylistA mylistB

lindex

返回list位置的元素

lindex mylist 3

llen

返回list中元素的個數

llen mylist

使用場景

消息隊列系統

使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。

好比:將Redis用做日誌收集器

實際上仍是一個隊列,多個端點將日誌信息寫入Redis,而後一個worker統一將全部日誌寫到磁盤。

取最新N個數據的操做

記錄前N個最新登錄的用戶Id列表,超出的範圍能夠從數據庫中得到。

//把當前登陸人添加到鏈表裏

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)

 

好比sina微博:

在Redis中咱們的最新微博ID使用了常駐緩存,這是一直更新的。可是咱們作了限制不能超過5000個ID,所以咱們的獲取ID函數會一直詢問Redis。只有在start/count參數超出了這個範圍的時候,才須要去訪問數據庫。

咱們的系統不會像傳統方式那樣「刷新」緩存,Redis實例中的信息永遠是一致的。SQL數據庫(或是硬盤上的其餘類型數據庫)只是在用戶須要獲取「很遠」的數據時纔會被觸發,而主頁或第一個評論頁是不會麻煩到硬盤上的數據庫了。

Sets

Sets 就是一個集合,集合的概念就是一堆不重複值的組合。利用Redis提供的Sets數據結構,能夠存儲一些集合性的數據。

案例:

在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。Redis還爲集合提供了求交集、並集、差集等操做,能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。

 

Set是集合,是String類型的無序集合,set是經過hashtable實現的,概念和數學中個的集合基本相似,能夠交集,並集,差集等等,set中的元素是沒有順序的。

經常使用方法

方法

說明

特性

sadd

向名稱爲key的set中添加元素,返回影響元素的個數,0爲失敗,1爲成功

sadd myset value

smembers

查看集合中全部的成員

smebers myset

srem

刪除集合的一個元素

srem myset two

spop

隨機返回並刪除set中一個元素

spop myset

sdiff

返回全部set與第一個set的差集

sdiff myset1 myset2

sdiffstore

比較差集而且存儲到另外一個set中,返回1表明成功

sdiffstore setstoreSet mySet1 myset2

sinter

返回全部給定集合的交集

sinter myset1 mysert2 //1集合和2集合的交集

sinterstore

返回給定集合的交集並存儲到另外一個集合

sinterstore desset myset1 myset2 //存到desset集合中

sunion

返回全部給定集合的並集

sunion set1 set2

sunionstore

返回全部的並集而且存儲到另外一個集合中,返回影響的元素個數

sunionstore destSet myset1 myset2

smove

把第一個集合的元素移動到第二個集合中

smove myset myset 你好

scard

返回集合中元素的個數

scard myset1

sismember

測試某個元素是否在集合中,返回0是否是,大於0是存在

sismember mykey1 你好

srandmember

隨機返回個集合中的元素

srandmemeber myset1

使用場景

交集,並集,差集:(Set)

//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的書?

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

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

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

獲取某段時間全部數據去重值

這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。

Sorted Sets

和Sets相比,Sorted Sets增長了一個權重參數score,使得集合中的元素可以按score進行有序排列,好比一個存儲全班同窗成績的Sorted Sets,其集合value能夠是同窗的學號,而score就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。能夠用Sorted Sets來作帶權重的隊列,好比普通消息的score爲1,重要消息的score爲2,而後工做線程能夠選擇按score的倒序來獲取工做任務。讓重要的任務優先執行。

經常使用方法

方法

說明

特性

zadd

向zset中添加元素member,score 用於排序,若是元素存在,則更新其順序,返回0表明沒添加成功

ZADD key score member

zadd myset 3 itim

zrange

取出集合中的元素

zrange myset 0 -1 withscores//顯示序號

by index

zrem

刪除名稱爲key的zset中的元素member

zrem myset itim

zincrby

修改元素的排序,若是元素不存在則添加該元素,且排序的score值爲增長值

zincrby myzset score itim

zrank

返回元素在集合中的排序位置,就是索引值

zrank myzset itim //itim在集合中的位置

zrevrank

返回從大到小的排序索引值,就是逆序位置

zrevrangk myzset itim//逆序的位置

zrevrange

返回集合中從大到小排序(降序)的,索引start到end的全部元素

zrevrange myzset 0 -1 //逆序後的元素

zrangebyscore

根據排序索引的scores來返回元素

zrangebyscore myzset 1 3 withscores//

zcount

返回集合中給定區間的數量

zcount myzset 2 4 //集合中2-4索引元素的個數

zcard

返回集合中全部元素的個數

zcard myzset //返回全部元素的個數

zremrangebyrank

刪除集合中排序在給定區間的全部元素(按索引刪除)

zremrangebyrank myzset 2 3 //

zremrangebyscore

刪除集合中在給定排序區間的元素 (按順序刪除)

zremrangebyscore myzset 2 5 //

使用場景

排行榜應用,取TOP N操做

這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。

//將登陸次數和用戶統一存儲在一個sorted set裏

zadd login:login_times 5 1

zadd login:login_times 1 2

zadd login:login_times 2 3

ZADD key score member

//當用戶登陸時,對該用戶的登陸次數自增1

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

//那麼如何得到登陸次數最多的用戶呢,逆序排列取得排名前N的用戶

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

ZREVRANGE key start stop [WITHSCORES]

 

好比在線遊戲的排行榜,根據得分你一般想要:

         - 列出前100名高分選手

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

    這些操做對於Redis來講小菜一碟,即便你有幾百萬個用戶,每分鐘都會有幾百萬個新的得分。

    模式是這樣的,每次得到新得分時,咱們用這樣的代碼:

    ZADD leaderboard <score> <username>

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

    獲得前100名高分用戶很簡單:ZREVRANGE leaderboard 0 99。

用戶的全球排名也類似,只須要:ZRANK leaderboard <username>。

ZRANK key member

Determine the index of a member in a sorted set

須要精準設定過時時間的應用

好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。

範圍查找

好比:有一個IP範圍對應地址的列表,如今須要給出一個IP的狀況下,迅速的查找到這個IP在哪一個範圍,也就是要判斷此IP的全部地。

例如:查詢IP是否存在的問題;

ADSM,查詢IP是否在其餘分組中存在。寫json文件

sadd向名稱爲key的set中添加元素,返回影響元素的個數,0爲失敗,1爲成功

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

A_start 10, A_end 20

B_start 30, B_end 40

咱們將這兩個範圍的起始位置存在Redis的Sorted Sets數據結構中,基本範圍起始值做爲score,範圍名加start和end爲其value值:

redis 127.0.0.1:6379> zadd ranges 10 A_start

(integer) 1

redis 127.0.0.1:6379> zadd ranges 20 A_end

(integer) 1

redis 127.0.0.1:6379> zadd ranges 30 B_start

(integer) 1

redis 127.0.0.1:6379> zadd ranges 40 B_end

(integer) 1

這樣數據在插入Sorted Sets後,至關因而將這些起始位置按順序排列好了。

如今我須要查找15這個值在哪個範圍中,只須要進行以下的zrangbyscore查找:

redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 1

1) "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 1

1) "B_start"

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

Pub/Sub

Pub/Sub 從字面上理解就是發佈(Publish)與訂閱(Subscribe),在Redis中,你能夠設定對某一個key值進行消息發佈及消息訂閱,當一個key值上進行了消息發佈後,全部訂閱它的客戶端都會收到相應的消息。這一功能最明顯的用法就是用做實時消息系統,好比普通的即時聊天,羣聊等功能。

案例:

Qlocenter 下發策略

使用場景

Pub/Sub構建實時消息系統

Redis的Pub/Sub系統能夠構建實時的消息系統

好比不少用Pub/Sub構建的實時聊天系統的例子。

相關文章
相關標籤/搜索