學Redis,這些數據類型的總結不能不看!

這篇文章主要來總結一下Redis中的數據類型,String,Hash,List。

1. String類型及操作

String是最簡答的類型,一個key對應一個value,String類型是二級制安全的,redis的String可以包含任何數據,比如jpg圖片或者序列化的對象。

set:表示設置key對應的值爲String類型的value。如:set name eson_15當然了,get是獲取某個key的值 如:get name 如果再一次set name csdn 那麼剛剛那個eson_15就會被csdn覆蓋掉,

如果不想被覆蓋,可以使用

setnx name csdn如果key已經存在則會返回0,並且設置不成功,nx是not exist的意思 如果key不存在則會返回1,並且直接設置該value

如果要指定鍵的有效期,可以使用

setex color 10 red設置color對應的value的值爲red,並且有效期爲10秒,10秒後獲取則返回nil

如果要設定指定key的value值的子字符串該怎麼做呢?我們可以使用setrange

set email [email protected] get email會得到[email protected] email 5 gmail.comget email會得到[email protected] 5表示從第6個字符開始替換,第一個字符從0開始的 如果替換後的字符串比原來的短,那隻會原來多餘的部分不動,如 setrange email 5 xx get email會得到[email protected]

如果我們想一次性設置多個值,也就是批量設置,該怎麼做呢?

可以使用mset,返回OK表示全部設置成功,返回0表示沒有任何值被設置了mset key1 value1 key2 value2可以分別get key1和get key2來獲取

有了mset,肯定就會想到有msetnx,和上面的類似

msetnx表示批量設置,但是檢測key是否存在,返回0表示沒有任何值被設置了msetnx key3 vlaue3 key4 value4 可以正常設置 如果將key3改成key2則返回0,因爲key2已經有了

如果我想覆蓋現在的key對應的value值,並且覆蓋的時候想獲取原來的key對應的value值,該怎麼辦呢?

可以使用getset,直接返回原來的值getset key3 value執行上面這句就會返回value3。並且把value插進去了 所以get key3就會返回value

剛剛有setrange,那麼肯定也有getrange,表示獲取一個範圍內的數據

getrange email 0 5會返回eson@x

剛剛有mset批量設置,那麼肯定也有mget來批量獲取

mget key1 key2 key3 key4就會返回相應的value值

如果想要對某個值遞增,可以使用incr或者incrby

set num 20incr num 就會返回21 如果不想一個個增,可以使用incrby num 4 會返回25

對應的還有decr和decrby,就不贅述了。還有一個append,表示給指定key的字符串追加value,返回新字符串值的長度

append name java 會返回11 get name 會得到eson_15java,爲11個字符

如果想要獲取key對應value的長度,可以使用strlen

strlen name 即可返回11

2. Hash類型及操作

redis hash是一個String類型的field和value的映射表。它的添加、刪除操作都是O(1)(平均)。hash特別適合用於存儲對象,相較於將對象的每個字段存成單個String類型,將一個對象存儲在hash類型中會佔用更少的內存,並且可以更方便的存取整個對象。

hset:設置hash field爲指定值,如果key不存在,則先創建hset myhash field1 hellohget myhash field1 即可獲取hello 可以把myhash看做一張表~

和上面的String類型類似,hash也有hsetnx,就不多說了

hsetnx myhash field hello

hmset表示批量設置:

hmset myhash field2 hello field3 word

當然了,hmget批量獲取

hmget myhash field2 field3

同樣,hincrby表示增加多少

hset myhash num 20hincrby mahash num 5 就會返回25

在hash裏面還有個hexists用來測試指定field是否存在

hexists myhash num 存在即返回1,否則返回0

hlen表示hash中存了多少個數據,即鍵值對

hlen myhash

hdel表示刪除指定hash的field字段

hdel myhash num刪除myhash中的num字段

如果想要獲取hash中所有的字段,可以使用hkeys

hkeys myhash

與之對應,肯定就有hvals

hvals myhash

很容易想到,除了獲取key和value,也可以獲取key-value,可以使用hgetall,返回所有字段和其對應的value

hgetall myhash

3. List類型及操作

List是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key理解爲鏈表的名字。redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push、pop操作從鏈表的頭部或者尾部添加刪除元素,這樣list既可以作爲棧,又可以作爲隊列。下面對List的操作做一下整理。

lpush:在key對應list的頭部添加字符串元素 rpush:在key對應list的尾部添加字符串元素lpush mylist "world" lpush mylist "hello"lrange mylist 0 -1 就會輸出整個list:hello world

那如果想要在key對應list的特定位置前或後添加字符串呢?可以使用linsert

linsert mylist before world beautifullrange mylist 0 -1:會輸出hello beautiful world

那如果想要設置list中指定位置的元素值該怎麼做呢?可以使用lset

lset mylist 0 hello2lrange mylist 0 -1:會輸出hello2 beautiful world

接下來看看刪除,lrem表示從key對應的list中刪除n個和value相同的元素(n<0表示從尾刪,n=0表示全部刪)

lrem mylist 1 world如果返回0代表沒有刪除成功,或者沒有這個,或者刪除的數量不對等等

如果要批量刪除,只保留一部分呢,可以使用ltrim

ltrim mylist 0 6 表示只保留新添加的7條數據,其他全刪了

因爲list可以模擬棧,所以還有lpop,表示刪除list頭部的元素,並返回該元素,另外,還有rpop,表示刪除list尾部的元素,rpop就不舉例子了。

假如 lrange mylist 0 -1輸出hello worldlpop mylist 會返回hello 再運行lrange mylist 0 -1則只有world了

還有兩個命令一起使用的,比如rpoplpush,表示從第一個list的尾部彈出,並且添加到第二個list的頭部

lrange mylist 0 -1 假如輸出的是hello world lrange mylist2 0 -1 假如輸出的是eson_15rpoplpush mylist mylist2 後 mylist中只有hello了,mylist2中有world eson_15

list中還有個lindex,返回名稱爲key的list中index位置的元素

lindex mylist 2

還有一個llen,返回key對應的list的長度

llen mylist

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章