這篇文章主要來總結一下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