重溫redis命令

奮程式序猿發表於2017-01-10

 

redis是已知的效能最快的key-value 資料庫。

1.key相關命令

exists key :檢查指定的key是否存在 1表示存在 0表示不存在

del key1,key2,key3....:刪除指定的key,返回刪除key的個數,如果key都不存在返回0

type key :返回給的key的value的型別。返回none表示key不存在,string表示字串,list表示連結串列,set表示無序集合...

keys pattern :返回匹配指定模式的所有key

expire key seconds:設定給定key的過期時間

randomkey:返回從當前資料庫中隨機選擇的一個key,如果當前資料庫是空的返回空串

rename oldkey newkey :重新命名key,如果newkey存在則覆蓋,返回1表示成功,0失敗。若失敗則可能oldkey不存在或者和newkey相同

renamenx oldkey newkey :同上如果newkey存在返回失敗

ttl key :返回設定的過期時間key的剩餘的秒數,-1表示key不存在或者沒有設定過期時間

move key db-index: 將key從當前資料庫移動到指定資料庫。返回1成功,0表示key不存在或已經在指定的資料庫中

案例:

2.資料型別

redis支援多種資料型別,例如:string,list,set,sorted set,hash等。每種資料型別都有其各自的特點。

1.string型別

string型別是二進位制安全的,可以把圖片和視訊檔案儲存到string中,定義如下

struct sdshdr{
  long len;
  long free;
  char buf[];
}

buf陣列:字串的實體,儲存字串的內容

len欄位:記錄buf陣列大小

free欄位;記錄buf陣列還有多少空間

因為有len和free記錄字串資訊,所以不必使用nil字元作為結束,從而實現二進位制安全。為了提高網站的執行速度可以使用string型別儲存一些靜態檔案例如圖片,css,js等。

string命令:

set key value :設定key對應的string值,返回1成功,0失敗

setnx key value :如果key不存在則設定,如果key已存在返回0

get key : 獲取key對應的string值 如果key不存在返回nil

getset key value :先獲取key的值,再設定key的值,如果key不存在返回nil

mget key1,key2... :一次獲取多個key的值,如果對應的key不存在返回nil

mset key1 values1 key2 values2 ... :一次設定多個key成功放回1 ,失敗返回0 表示都沒有設定

msetnx  key1 values1 key2 values2 ...:一次設定多個key,但不會覆蓋已存在的

incr key : 向key對應的value加1,並返回新值,注意該key的值必須是int型別 否則返回錯誤 ,如果key 不存在則設定key 為1

decr key : 向key對應的value做-1,並返回新值,注意該key的值必須是int型別 否則返回錯誤 ,如果key 不存在則設定key 為-1

incrby key integer : 向key對應的值加上一個指定的整數,key不存在則新建一個,並認為原來的值是0

decrby key interger :向key對應的值減去一個指定的整數,key不存在則新建一個,並認為原來的值是0

案例:

3.list型別

list資料型別指key對應value是一個雙向連結串列結構,所以list型別提供連結串列支援的所有操作。list型別在網際網路引用中非常有用,例如存放微博中‘我關注的列表’,或者論壇中所有回帖ID。

list命令:

lpush key string :向key對應的list頭部新增一個字串元素,成功返回1,失敗返回0

rpush key string :向key對應的list尾部新增一個字串元素,成功返回1,失敗返回0

llen key :返回key對應list的長度,如果key不存在返回0,如果key對應的型別不是list返回錯誤。

lrange key start end :返回指定區間內(start~~end)的元素,下表從0開始,負值表示從連結串列尾部開始計算,-1表示倒數第一個,key不存在返回空列

ltrim key start end :擷取list指定區間內(start~~end)元素,成功返回1,key不存在返回錯誤

lset key index value :設定list中指定下表的元素,成功返回1,key或者下表不存在返回錯誤。

lrem key count value : 從list 頭部(count正數)或尾部(count負數)刪除一定數量(count絕對值)的匹配value的元素,返回刪除元素的數量,count為0時表示全部刪除。

lpop key : 從list頭部刪除並返回刪除的元素。如果key對應的list不存在或者是空返回nil,如果key對應的值不是list返回錯誤

rpop :從list 尾部刪除元素並返回

blpop key1 key2 ... timeout  :從左到右掃描key1···key2 ,返回對第一個非空list進行lpop操作並返回。如果所有list都是空或不存在,阻塞timeout秒,timeout為0表示一直阻塞。阻塞時,如果有其他client對key1...key2 中任意一個key進行push炒作,阻塞解除並返回。如果超時發生,則返回nil

brpop key..key2  timeout 功能與plpop類似,不同的是blpop從頭刪除 而brpop是從尾部刪除

案例:

 

使用list可以實現訊息列隊功能,減去資料庫壓力。訊息列隊類似於實現生活中的排隊,每次有訊息到達時就把訊息放入列隊尾部,取出訊息時頭部取出。要有那個list實現訊息列隊,先用rpush命令吧訊息列隊放入尾部,然後使用lpop命令把訊息列隊從頭部取出。

4.set型別

set資料型別是一種無序集合,在redis內部通過hashtable實現,查詢和刪除元素的時間複雜度為O(1).set資料型別的優點是快速查詢元素是否存在,用於記錄一些不能重複的資料。例如,在網站註冊賬號時使用者名稱不能重複,使用set記錄註冊使用者,如果註冊的使用者已經存在set中,則拒絕註冊。

set命令:

sadd key member :新增一個strimg元素到key對應的set集合中,成功返回1,如果元素在集合中返回0 ,key對應的set不存在返回錯誤

srem key member :從key對應set中移除給定的元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set型別返回錯誤

spop key :刪除並返回key對應set中隨機的一個元素,如果set是空或者key對應的set不存在返回nil

srandmember key: 同spop 隨機取出一個元素,但不刪除該元素

smove srckey dstkey member :從srckey 對應set中移除member並新增到dstkey對用的set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key對應的不是set型別,返回錯誤

scard key :返回set元素的個數,如果set是空或者key不存在返回0

sismember key member :判斷member 是否在set中,存在返回1,不存在或者key對應的set集合不存在返回0

sinter  key1,key2,key3... : 返回所有給定的key的交集

sinterstore dstkey key1,key2.... :同sinter,同時將交集存到dstkey對應的set集合中

sunion key1 key2 ... : 返回所有key的並集

sunionstore  dstkey key1,key2.... :同sunion ,同時將並集存到dstkey對應的set集合中

sdiff key1 key2 key3 ... :返回給定key的差集

sdiffstore dstkey key1 key2 key3...:同sdiff ,同時將差集存到dstkey對應的set集合中

smembers key 返回key對應set的所有元素,結果是無序的

案例:

set型別通常還可以用來記錄做過某些事。例如投票系統,每個使用者一天只能投票一次,那麼可以使用set記錄某個使用者的投票情況,只需要一日期作為set的key,則將使用者的ID作為member即可。檢視某個使用者今天是否投過票,只需要以今天的日期作為key檢視該使用者ID是否存在。

 5.sorted set 型別

sorted set型別與set型別相似,都是string型別元素的集合,不同的是sorted set 屬於有序集合,而sorted set 通過一個double型別的整數score進行排序。sorted set 通過skiplist(跳躍表)和hashtable組合完成。skiplist負責排序功能,而hashtable負責儲存資料。

因為sorted set 是排序的set,所以set能做的事情sorted set 也可以做。而且sorted set 還可以完成一些set不能做的事情,例如,使用sorted set 構建一個具有優先順序的列隊,這也是list型別不能實現的。sorted set 型別支援的命令如表10-6所示。

sorted set命令:

zadd key score member :新增元素member到集合,元素在集合中存在則跟新對應 score

zrem key member : 刪除指定元素,1表示成功,如果元素不存在返回0

zincrby key incr member :增加對應member 的 score值,並重新排序,返回更新後的score值

zrank key member :返回指定元素在集合中的排名(下標),集合中元素按score從小到大排序的

zrevrank key member : 同上,但是集合中元素按score從大到小排序

zrange key start end : 從集合中指定區間的元素,返回結構按score順序排序

zrevrange  key start end :同上,返回結構按照score逆序排序

zrangebyscore key min max : 返回集合中score在給定區間的元素

zcount key min max :返回集合中score 在給定的區間的數量

zcard key : 返回集合中元素個數

zscore key element:返回給定元素對應的score

zremrangebyrank key min max : 刪除集合中排名在給定區間的元素

zremrangebyscore key min max : 刪除集合中score在給定區間的元素

sorted set 型別在web 應用中非常有用。例如排行榜中按‘頂貼’次數排序,方法是:將排序的值設定成sorted set 的score值,將具體資料設定成相應的value,使用者每次按‘頂貼’是,只需執行zadd命令修改score值。

6.hash型別

hash型別是每個key對應一個hashtable,新增刪除和修改的時間複雜度都是0(1)。Hash型別適合應用於儲存物件,例如使用者資訊物件。把使用者ID作為key,使用者資訊儲存到hash型別中。

新建一個hash型別物件時,為了節省記憶體,redis使用zipmap儲存資料。這個zipmap並不是真正的hashtable,新增,刪除和修改操作的時間複雜度都是0(n),但是相比普通hashtable,zipmap節省不是記憶體。如果field或者value大小超出一定限制,redis在內部自動將zipmap替換為正常的hashtable儲存。修改配置檔案的hash-max-zipmap-entries和hash-max-zipmap-value選項設定這兩個限制。

hash命令:

hset key field value :設定key對應的hash物件中指定域的值。如果key對應的hash物件不存在,將建立此hash物件。如果指定的域已經存在,其值將被重寫

hget key field : 返回與field域相關聯的值,如果該域不存在或者key對應的hash物件不存在,返回nil

hmget key filed1 。。。filedN :返回儲存在key對應的hash物件中各個指定域相關聯的值。對於在hash物件不存在的域返回nil

hmset key filed1 value1 filed2 value2 。。。:設定儲存在key對應的hash物件中指定域的值。該命令會複寫hash中已經存在的域。如果key對應的hash物件不在,將建立此hash物件

hincrby key field interger :將儲存在key對應的hash物件中field域相關的值加上interger指定的值。如果key對應的hash不存在,則建立hash物件。如果field域不存在或者不能表示為一個整數,在執行該操作前設定為0

hexists key field :檢視指定field域是否存在

hdel key field :刪除指定的field域,返回1,。如果指定的域不存在或者key不存在,返回0

hlen key :返回key中filed的數量,如果key 不存在返回0

hkeys key :返回key對應的hahs物件中所有filed名稱

hvals key :返回key對應的hash物件中所有的值

hgetall key : 返回key對應的hash物件中所有域和相關聯的值。返回值中,每個域名稱後面跟著相關聯的值。

案例:

 7.redis排序

redis支援對list,set,sorted set型別進行排序,sort命令完整格式如下:

sort key [by pattern] [limit strt count] [get pattern] [asc|desc] [alpha] [store dstkey]

1,sort key簡單排序

例如:

從案例可以看出 預設排序是 asc就是升序  但是如果是字母按照字母的順序排序就要加上alpha就可以了

案例:

通過案例可以看出如果不是數字是字母的話不使用alpha就會報錯。

[by pattern]

sort 命令可以按照集合元素自身的值排序,還可以按照給定模式(patern)將集合元素內容組合成新的key,並按照新的key對應的內容進行排序,完成後返回排序好的元素集合。

例如:

 

模式‘name*’ 代表使用key1集合中的填充*,得到3個新的key name1 name2 name3 然後以這3個key的值進行排序,排序的結果就就是,key1集合返回的順序。

[limit start count]

通過limit可以限定返回結果的數量

例如:

start下標從0開始,上面例子中limit選項的意思是從1開始獲取2個

[store dstkey]

使用store可以把排序的結果快取到指定的key 可以減少cpu的開銷

例如:

 

相關文章