Redis 資料型別及操作

ITLearner發表於2020-02-10

前言

作為Key-value型資料庫,Redis也提供了鍵(Key)和鍵值(Value)的對映關係。但是,除了常規的數值或字串,Redis的鍵值還可以是以下形式之一:

  • [Lists (可重複列表) ](#Lists (可重複列表) )
  • [Sets (不可重複集合) ](#Sets (不可重複集合))
  • [Sorted sets (不可重複有序集合) ](#Sorted sets (不可重複有序集合))
  • [Hashes (雜湊表)](#Hashes (雜湊表))

鍵值的資料型別決定了該鍵值支援的操作。Redis支援諸如列表、集合或有序集合的交集、並集、查集等高階原子操作;同時,如果鍵值的型別是普通數字,Redis則提供自增等原子操作。

strings(字串)

string型別是二進位制安全的。意思是redis的string可以包含任何資料,比如jpg圖片或者序列化的物件。

set

設定key對應的值為string型別的value。

127.0.0.1:6379> set name wwl
OK
複製程式碼

setnx

設定key對應的值為string型別的value。如果key已經存在,返回0,nx是not exist的意思。

127.0.0.1:6379> get name
"wwl"
127.0.0.1:6379> setnx name HongWan_new
(integer) 0
127.0.0.1:6379> get name 
"HongWan"
複製程式碼

由於原來name有一個對應的值,所以本次的修改不生效,且返回碼是0。

setex

設定key對應的值為string型別的value,並指定此鍵值對應的有效期。

127.0.0.1:6379> setex haircolor 10 red 
OK
127.0.0.1:6379> get haircolor
"red"
127.0.0.1:6379> get haircolor
"red"
127.0.0.1:6379> get haircolor
(nil)
複製程式碼

可見由於最後一次的呼叫是10秒以後了,所以取不到haicolor這個鍵對應的值。

setrange

設定指定key的value值的子字串。

127.0.0.1:6379> set name 'HongWan@126.com'
OK
127.0.0.1:6379> get name 
"HongWan@126.com"
127.0.0.1:6379>  setrange name 8 gmail.com 
(integer) 17
127.0.0.1:6379> get name 
"HongWan@gmail.com"
複製程式碼

其中的8是指從下標為8(包含8)的字元開始替換。

mset

一次設定多個key的值,成功返回ok表示所有的值都設定了,失敗返回0表示沒有任何值被設定。

127.0.0.1:6379> mset key1 HongWan1 key2 HongWan2 
OK
127.0.0.1:6379> get key1 
"HongWan1"
127.0.0.1:6379> get key2
"HongWan2"
複製程式碼

msetnx

一次設定多個key的值,成功返回ok表示所有的值都設定了,失敗返回0表示沒有任何值被設定,但是不會覆蓋已經存在的key。

127.0.0.1:6379> get key1
"HongWan1"
127.0.0.1:6379> get key2
"HongWan2"
127.0.0.1:6379> msetnx key2 HongWan2_new key3 HongWan3
(integer) 0
127.0.0.1:6379> get key2 
"HongWan2"
127.0.0.1:6379> get key3
(nil)
複製程式碼

可以看出如果這條命令返回0,那麼裡面操作都會回滾,都不會被執行。

get

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

127.0.0.1:6379> get name 
"HongWan_new"
## 我們獲取一個庫中不存在的鍵name1,那麼它會返回一個nil以表時無此鍵值對 
redis 127.0.0.1:6379> get name1 
(nil) 
複製程式碼

getset

設定key的值,並返回key的舊值。

127.0.0.1:6379> get name 
"HongWan"
127.0.0.1:6379> getset name HongWan_new 
"HongWan"
127.0.0.1:6379> get name
"HongWan_new"
複製程式碼

如果key不存在,將返回nil,並會設定新值。

redis 127.0.0.1:6379> getset name1 aaa
(nil) 
127.0.0.1:6379> get name1
"aaa"
複製程式碼

getrange

獲取指定key的value值的子字串。

127.0.0.1:6379> get name 
"HongWan_new"
127.0.0.1:6379> getrange name 0 6 
"HongWan"
## 字串左面下標是從0開始的
127.0.0.1:6379> getrange name -7 -1
"Wan_new"
## 字串右面下標是從-1開始的
127.0.0.1:6379> getrange name 7 100 
"_new"
## 當下標超出字串長度時,將預設為是同方向的最大下標
複製程式碼

mget

一次獲取多個key的值,如果對應key不存在,則對應返回nil。

127.0.0.1:6379> mget key1 key2 key3 
1) "HongWan1"
2) "HongWan2"
3) (nil)
## key3由於沒有這個鍵定義,所以返回nil。 
複製程式碼

incr

對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設定key為1 。

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> incr age 
(integer) 21
127.0.0.1:6379> get age
"21"
複製程式碼

incrby

同incr類似,加指定值 ,key不存在時候會設定key,並認為原來的value是 0 。

127.0.0.1:6379> get age 
"21"
127.0.0.1:6379> incrby age 5
(integer) 26
127.0.0.1:6379> get name
"HongWan_new"
127.0.0.1:6379> get age
"26"
複製程式碼

decr

對key的值做的是減減操作,decr一個不存在key,則設定key為-1。

127.0.0.1:6379> get age
"26"
127.0.0.1:6379> decr age
(integer) 25
127.0.0.1:6379> get age
"25"
複製程式碼

decrby

同decr,減指定值。

127.0.0.1:6379> get age
"25"
127.0.0.1:6379> decrby age 5
(integer) 20
127.0.0.1:6379> get age
"20"
複製程式碼

decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

127.0.0.1:6379> get age
"20"
127.0.0.1:6379> incrby age -5
(integer) 15
127.0.0.1:6379> get age
"15"
複製程式碼

append

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

127.0.0.1:6379> get name
"HongWan_new"
127.0.0.1:6379> append name @126.com
(integer) 19
127.0.0.1:6379> get name
"HongWan_new@126.com"
複製程式碼

strlen

取指定key的value值的長度。

127.0.0.1:6379> get name
"HongWan_new@126.com"
127.0.0.1:6379> strlen name
(integer) 19
127.0.0.1:6379> get age
"15"
127.0.0.1:6379> strlen age
(integer) 2
複製程式碼

Lists (可重複列表)

list是一個連結串列結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key理解為連結串列的名字。

Redis的list型別其實就是一個每個子元素都是string型別的雙向連結串列。連結串列的最大長度是(2^32)。我們可以通過push,pop操作從連結串列的頭部或者尾部新增刪除元素。這使得list既可以用作棧,也可以用作佇列。

lpush

在key對應list的頭部新增字串元素。

127.0.0.1:6379> lpush mylist "world"
(integer) 1
127.0.0.1:6379> lpush mylist "hello"
(integer) 2
127.0.0.1:6379>  lrange mylist 0 -1
1) "hello"
2) "world"
複製程式碼

在此處我們先插入了一個world,然後在world的頭部插入了一個hello。其中lrange是用於獲取mylist的內容。

rpush

在key對應list的尾部新增字串元素。

127.0.0.1:6379> rpush mylist2 "hello"
(integer) 1
127.0.0.1:6379> rpush mylist2 "world"
(integer) 2
127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
複製程式碼

在此處我們先插入了一個hello,然後在hello的尾部插入了一個world。

linsert

在key對應list的特定位置之前或之後新增字串元素。

127.0.0.1:6379> rpush mylist3 "hello"
(integer) 1
127.0.0.1:6379> rpush mylist3 "world"
(integer) 2
127.0.0.1:6379> linsert mylist3 before "world" "there"
(integer) 3
127.0.0.1:6379> lrange mylist3 0 -1
1) "hello"
2) "there"
3) "world"
複製程式碼

在此處我們先插入了一個hello,然後在hello的尾部插入了一個world,然後又在world的前面插入了there。

lset

設定list中指定下標的元素值(下標從0開始) 。

127.0.0.1:6379> rpush mylist4 "one"
(integer) 1
127.0.0.1:6379> rpush mylist4 "two"
(integer) 2
127.0.0.1:6379> rpush mylist4 "three"
(integer) 3
127.0.0.1:6379> lset mylist4 0 "four"
OK
127.0.0.1:6379> lset mylist4 -2 "five"
OK
127.0.0.1:6379> lrange mylist4 0 -1
1) "four"
2) "five"
3) "three"
複製程式碼

在此處我們依次插入了one,two,three,然後將標是0的值設定為four,再將下標是-2的值設定為five。

lrem

從key對應list中刪除count個和value相同的元素。

count>0時,按從頭到尾的順序刪除。

127.0.0.1:6379> rpush mylist5 "hello"
(integer) 1
127.0.0.1:6379> rpush mylist5 "hello"
(integer) 2
127.0.0.1:6379> rpush mylist5 "foo"
(integer) 3
127.0.0.1:6379> rpush mylist5 "hello"
(integer) 4
127.0.0.1:6379> lrem mylist5 2 "hello"
(integer) 2
127.0.0.1:6379> lrange mylist5 0 -1
1) "foo"
2) "hello"
複製程式碼

count<0時,按從尾到頭的順序刪除。

127.0.0.1:6379> rpush mylist6 "hello"
(integer) 1
127.0.0.1:6379> rpush mylist6 "hello"
(integer) 2
127.0.0.1:6379> rpush mylist6 "foo"
(integer) 3
127.0.0.1:6379> rpush mylist6 "hello"
(integer) 4
127.0.0.1:6379> lrem mylist6 -2 "hello"
(integer) 2
127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
複製程式碼

count=0時,刪除全部。

127.0.0.1:6379> rpush mylist7 "hello"
(integer) 1
127.0.0.1:6379> rpush mylist7 "hello"
(integer) 2
127.0.0.1:6379> rpush mylist7 "foo"
(integer) 3
127.0.0.1:6379> rpush mylist7 "hello"
(integer) 4
127.0.0.1:6379> lrem mylist7 0 "hello"
(integer) 3
127.0.0.1:6379> lrange mylist7 0 -1
1) "foo"
複製程式碼

ltrim

保留指定key 的值範圍內的資料。

127.0.0.1:6379> rpush mylist8 "one"
(integer) 1
127.0.0.1:6379> rpush mylist8 "two"
(integer) 2
127.0.0.1:6379> rpush mylist8 "three"
(integer) 3
127.0.0.1:6379> rpush mylist8 "four"
(integer) 4
127.0.0.1:6379> ltrim mylist8 1 -1
OK
127.0.0.1:6379> lrange mylist8 0 -1
1) "two"
2) "three"
3) "four"
複製程式碼

lpop

從list的頭部刪除元素,並返回刪除元素。

127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> lpop mylist
"hello"
127.0.0.1:6379> lrange mylist 0 -1
1) "world"
複製程式碼

rpop

從list的尾部刪除元素,並返回刪除元素。

127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> rpop mylist2
"world"
127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
複製程式碼

rpoplpush

從第一個list的尾部移除元素並新增到第二個list的頭部,最後返回被移除的元素值,整個操作是原子的。如果第一個list是空或者不存在返回nil。

127.0.0.1:6379> lrange mylist5 0 -1
1) "foo"
2) "hello"
127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
127.0.0.1:6379> rpoplpush mylist5 mylist6
"hello"
127.0.0.1:6379> lrange mylist5 0 -1
1) "foo"
127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
複製程式碼

lindex

返回名稱為key的list中index位置的元素。

127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
127.0.0.1:6379> lindex mylist5 0
"three"
127.0.0.1:6379> lindex mylist5 1
"foo"
複製程式碼

llen

返回key對應list的長度。

127.0.0.1:6379> llen mylist5
(integer) 2
複製程式碼

Sets (不可重複集合)

Redis的set是string型別的無序集合。set元素最大可以包含(2^32)個元素。

set的是通過hash table實現的,所以新增、刪除和查詢的複雜度都是O(1)。hash table會隨著新增或者刪除自動的調整大小。

sadd

向名稱為key的set中新增元素。

127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 0
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
複製程式碼

本例中,我們向myset中新增了三個元素,但由於第三個元素跟第二個元素是相同的,所以第三個元素沒有新增成功,最後我們用smembers來檢視myset中的所有元素。

srem

刪除名稱為key的set中的元素member。

127.0.0.1:6379> sadd myset2 "one"
(integer) 1
127.0.0.1:6379> sadd myset2 "two"
(integer) 1
127.0.0.1:6379> sadd myset2 "three"
(integer) 1
127.0.0.1:6379> srem myset2 "one"
(integer) 1
127.0.0.1:6379> srem myset2 "four"
(integer) 0
127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
複製程式碼

本例中,我們向myset2中新增了三個元素後,再呼叫srem來刪除one和four,但由於元素中沒有four所以,此條srem命令執行失敗。

spop

隨機返回並刪除名稱為key的set中一個元素。

127.0.0.1:6379> sadd myset3 "one"
(integer) 1
127.0.0.1:6379> sadd myset3 "two"
(integer) 1
127.0.0.1:6379> sadd myset3 "three"
(integer) 1
127.0.0.1:6379> spop myset3
"two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
複製程式碼

本例中,我們向myset3中新增了三個元素後,再呼叫spop來隨機刪除一個元素,可以看到three元素被刪除了。

sdiff

返回所有給定key與第一個key的差集。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sdiff myset2 myset3
1) "two"
複製程式碼

本例中,我們可以看到myset2中的元素與myset3中不同的只是three,所以只有three被查出來了,而不是three和one,因為one是myset3的元素。

我們也可以將myset2和myset3換個順序來看一下結果:

127.0.0.1:6379> sdiff myset3 myset2
1) "one"
複製程式碼

這個結果中只顯示了,myset3中的元素與myset2中不同的元素。

sdiffstore

返回所有給定key與第一個key的差集,並將結果存為另一個key。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sdiffstore myset4 myset2 myset3
(integer) 1
127.0.0.1:6379> smembers myset4
1) "two"
複製程式碼

sinter

返回所有給定key的交集。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sinter myset2 myset3
1) "three"
複製程式碼

通過本例的結果可以看出, myset2和myset3的交集two被查出來了。

sinterstore

返回所有給定key的交集,並將結果存為另一個key。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sinterstore myset5 myset2 myset3
(integer) 1
127.0.0.1:6379> smembers myset5
1) "three"
複製程式碼

通過本例的結果可以看出, myset2和myset3的交集被儲存到myset5中了。

sunion

返回所有給定key的並集。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sunion myset2 myset3
1) "three"
2) "one"
3) "two"
複製程式碼

通過本例的結果可以看出, myset2和myset3的並集被查出來了。

sunionstore

返回所有給定key的並集,並將結果存為另一個key。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> sunionstore myset6 myset2 myset3
(integer) 3
127.0.0.1:6379> smembers myset6
1) "three"
2) "one"
3) "two"
複製程式碼

通過本例的結果可以看出, myset2和myset3的並集被儲存到myset6中了。

smove

從第一個key對應的set中移除member並新增到第二個對應set中。

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
127.0.0.1:6379> smove myset2 myset7 three
(integer) 1
127.0.0.1:6379> smembers myset7
1) "three"
複製程式碼

通過本例可以看到,myset2的three被移到myset7中了。

scard

返回名稱為key的set的元素個數。

127.0.0.1:6379> scard myset2
(integer) 1
複製程式碼

sismember

測試member是否是名稱為key的set的元素。

127.0.0.1:6379> smembers myset2
1) "two"
127.0.0.1:6379> sismember myset2 two
(integer) 1
127.0.0.1:6379> sismember myset2 one
(integer) 0
複製程式碼

通過本例可以看到,two是myset2的成員,而one不是。

srandmember

隨機返回名稱為key的set的一個元素,但是不刪除元素。

127.0.0.1:6379> smembers myset3
1) "three"
2) "one"
127.0.0.1:6379> srandmember myset3
"three"
127.0.0.1:6379> srandmember myset3
"one"
127.0.0.1:6379> srandmember myset3
"one"
複製程式碼

通過本例可以看到,第二次返回了元素"one",但是並沒有刪除"one"元素。

Sorted sets (不可重複有序集合)

sorted set是set的一個升級版本,它在set的基礎上增加了一個順序屬性,這一屬性在新增修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解為有兩列的mysql表,一列存value,一列存順序。

和set一樣sorted set也是string型別元素的集合,不同的是每個元素都會關聯一個double型別的score。sorted set的實現是skip list和hash table的混合體。

zadd

向名稱為key的zset中新增元素member,score用於排序。如果該元素已經存在,則根據score更新該元素的順序。

127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
127.0.0.1:6379> zadd myzset 2 "two"
(integer) 1
127.0.0.1:6379> zadd myzset 3 "two"
(integer) 0
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
複製程式碼

zrem

刪除名稱為key的zset中的元素member。

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
127.0.0.1:6379> zrem myzset two
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
複製程式碼

可以看到two被刪除了。

zincrby

如果在名稱為key的zset中已經存在元素member,則該元素的score增加increment;否則向集合中新增該元素,其score的值為increment。

127.0.0.1:6379> zadd myzset2 1 "one"
(integer) 1
127.0.0.1:6379> zadd myzset2 2 "two"
(integer) 1
127.0.0.1:6379> zincrby myzset2 2 "one"
"3"
127.0.0.1:6379> zrange myzset2 0 -1 withscores
1) "two"
2) "2"
3) "one"
4) "3"
複製程式碼

本例中將one的score從1增加了2,增加到了3。

zrank

返回名稱為key的zset中member元素的排名(按score從小到大排序)即下標。

127.0.0.1:6379> zadd myzset3 1 "one"
(integer) 1
127.0.0.1:6379> zadd myzset3 2 "two"
(integer) 1
127.0.0.1:6379> zadd myzset3 3 "three"
(integer) 1
127.0.0.1:6379> zadd myzset3 5 "five"
(integer) 1
127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
127.0.0.1:6379> zrank myzset3 two
(integer) 1
複製程式碼

zrevrank

返回名稱為key的zset中member元素的排名(按score從大到小排序)即下標。

127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
127.0.0.1:6379> zrevrank myzset3 two
(integer) 2
複製程式碼

按從大到小排序的話two是第三個元素,下標是2。

zrevrange

返回名稱為key的zset(按score從大到小排序)中的index從start到end的所有元素。

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
複製程式碼

zrangebyscore

返回集合中score在給定區間的元素。

127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "five"
8) "5"
127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores
1) "two"
2) "2"
3) "three"
4) "3"
複製程式碼

zcount

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

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> zcount myzset3 2 3
(integer) 2
複製程式碼

zcard

返回集合中元素個數。

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> zcard myzset3
(integer) 4
複製程式碼

zscore

返回給定元素對應的score。

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379>  zscore myzset3 two
"2"
複製程式碼

zremrangebyrank

刪除集合中排名在給定區間的元素。

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "five"
2) "5"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> zremrangebyrank myzset3 3 3
(integer) 1
127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"
複製程式碼

在本例中我們將myzset3中按從小到大排序結果的下標為3的元素刪除了。

zremrangebyscore

刪除集合中score在給定區間的元素。

127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"
127.0.0.1:6379> zremrangebyscore myzset3 1 2
(integer) 2
127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
1) "three"
2) "3"
複製程式碼

在本例中我們將myzset3中按從小到大排序結果的score在1~2之間的元素刪除了。

Hashes (雜湊表)

Redis hash是一個string型別的field和value的對映表。它的新增、刪除操作都是O(1)(平均),hash特別適合用於儲存物件。

相較於將物件的每個欄位存成單個string型別,將一個物件儲存在hash型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。

hset

設定hash field為指定值,如果key不存在,則先建立。

127.0.0.1:6379> hset myhash field1 Hello
(integer) 1
複製程式碼

hsetnx

設定hash field為指定值,如果key不存在,則先建立。如果field已經存在,返回0,nx是not exist的意思。

127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 1
127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 0
複製程式碼

第一次執行是成功的,但第二次執行相同的命令失敗,原因是field已經存在了。

hmset

同時設定hash的多個field。

127.0.0.1:6379> hmset myhash field1 Hello field2 World
OK
複製程式碼

hget

獲取指定的hash field。

127.0.0.1:6379> hget myhash field1
"Hello"
127.0.0.1:6379> hget myhash field2
"World"
127.0.0.1:6379> hget myhash field3
(nil)
複製程式碼

由於資料庫沒有field3,所以取到的是一個空值nil。

hmget

獲取全部指定的hash filed。

127.0.0.1:6379> hmget myhash field1 field2 field3
1) "Hello"
2) "World"
3) (nil)
複製程式碼

由於資料庫沒有field3,所以取到的是一個空值nil。

hincrby

給指定的hash filed 加上給定值。

127.0.0.1:6379> hset myhash field3 20
(integer) 1
127.0.0.1:6379> hget myhash field3 
"20"
127.0.0.1:6379> hincrby myhash field3 -8
(integer) 12
127.0.0.1:6379> hget myhash field3
"12"
複製程式碼

在本例中我們將field3的值從20降到了12,即做了一個減8的操作。

hexists

測試指定field是否存在。

127.0.0.1:6379> hexists myhash field1
(integer) 1
127.0.0.1:6379> hexists myhash field9
(integer) 0
複製程式碼

通過上例可以說明field1存在,但field9是不存在的。

hlen

返回指定hash的field數量。

127.0.0.1:6379> hlen myhash
(integer) 4
複製程式碼

通過上例可以看到myhash中有4個field。

hdel

刪除指定hash的指定field。

127.0.0.1:6379> hlen myhash
(integer) 4
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hlen myhash
(integer) 3
複製程式碼

hkeys

返回hash的所有field。

127.0.0.1:6379>  hkeys myhash
1) "field"
2) "field2"
3) "field3"
複製程式碼

hvals

返回hash的所有value。

127.0.0.1:6379> hvals myhash
1) "Hello"
2) "World"
3) "12"
複製程式碼

hgetall

獲取某個hash中全部的filed及value。

127.0.0.1:6379> hgetall myhash
1) "field"
2) "Hello"
3) "field2"
4) "World"
5) "field3"
6) "12"
複製程式碼

一下子將myhash中所有的field及對應的value都取出來了。

相關文章