redis入門篇
一、redis簡介
redis是key-value數據結構的內存數據庫。
至於具體特點,會在本系列最後一一列出,先看redis的入門。
二、redis的五種數據類型和指令
1、對key的操作指令
判斷key是否存在->exists key,代碼及結果如下:
127.0.0.1:6379> exists name
(integer) 1
刪除指定的key->del key1...keyN,返回刪除key的個數,代碼及結果如下:
127.0.0.1:6379> del name one
(integer) 1
返回指定格式的key->keys pattern,代碼及結果如下:127.0.0.1:6379> keys *
1) "hey"
2) "newint"
3) "list"
隨機返回數據庫中的一個key,若無key則返回空串->randomkey,代碼及結果如下:127.0.0.1:6379> randomkey
"list"
127.0.0.1:6379> randomkey
"hey"
對key重命名,若newkey存在會執行成功並覆蓋->rename oldkey newkey,代碼及結果如下:127.0.0.1:6379> rename list cool
OK
對key重命名,若newkey存在會返回0->renamenx oldkey newkey(在之後大多指令會用到nx後綴),代碼以及結果如下:
127.0.0.1:6379> renamenx list hey
(integer) 0
127.0.0.1:6379> rename list hey
OK
設置key的過期時間->expire key seconds,查看key的過期時間->ttl key,代碼及結果如下:127.0.0.1:6379> expire a 10
(integer) 1
127.0.0.1:6379> ttl a
(integer) 7
127.0.0.1:6379> ttl a
(integer) 5
127.0.0.1:6379> ttl a
(integer) 5
127.0.0.1:6379> ttl a
(integer) 4
127.0.0.1:6379> ttl a
(integer) 3
127.0.0.1:6379> ttl a
(integer) 2
127.0.0.1:6379> get a
(nil)
選擇數據庫index,redis有邏輯分區的16個數據庫,互相不干擾,可以通過select index來選擇。
可以將當前數據庫的key挪動到指定index的數據庫->move key index,代碼及結果如下:
127.0.0.1:6379> move newint 1
(integer) 1
127.0.0.1:6379> get newint
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get newint
"5"
2、redis的String類型,以及他的相關指令
這是redis最簡單的數據類型,value的最大上限爲一個G,可以存放圖片的序列化二進制文件。
get和set方法可以設置和獲取值,代碼以及結果如下:
127.0.0.1:6379> set string abc
OK
127.0.0.1:6379> get string
"abc"
getset key value可以先獲取key的值再設置key的value,此操作類似hashmap中的put,如下:127.0.0.1:6379> getset string bcd
"abc"
setnx key value,在此前說過,帶nx後綴的都是對存在key的情況進行處理,此操作若不存在key則設置加入key並設置值,若存在則返回0。
mget、mset、msetnx都可以批量的操作key,value,意味着more吧,可能,代碼如下:
127.0.0.1:6379> mset string abc string2 bcd string3 tf
OK
127.0.0.1:6379> mget string string2 string3
1) "abc"
2) "bcd"
3) "tf"
incr和decr可以對一個int類型的string進行++,--操作,若不是int類型的,則會返回錯誤,如下:127.0.0.1:6379> incr int
(integer) 6
127.0.0.1:6379> decr int
(integer) 5
incrby key count,decrby key count可以對int類型的數據進行加減法操作,其實也可以通過incrby一個負數實現decrby的效果。
3.hash類型
hash類型是一個key-value對應的數據類型,相當於又對應了一個hash表出來。
hset key filed value和hget key filed分別可以設置一個key的filed的value和獲取一個key的filed的value,代碼如下:
127.0.0.1:6379> hset hash one one
(integer) 1
127.0.0.1:6379> hget hash one
"one"
hmset和hmget則對應這上訴的批操作。
hincrby key filed count,可以對指定filed的value進行加法操作,並返回結果值:
127.0.0.1:6379> hincrby hash two 5
(integer) 7
hexists key filed,可以對該hash底下是否含有指定filed進行判斷:127.0.0.1:6379> hexists hash two
(integer) 1
hdel key filed,可以刪除指定的filed(可刪除多個filed):127.0.0.1:6379> hdel hash two one
(integer) 2
hlen key,返回該hash的長度,hkeys key,返回該hash所有的key,hvals key,返回該hash所有的value,hgetall key,返回該hash所有的filed和value。
4、list類型
list是一個雙向鏈表數據結構的存儲,key對應的value可以理解爲一個鏈表。
lpush可以在一個鏈表的頭部進行插入操作,代碼如下:
127.0.0.1:6379> lpush list a b c d
(integer) 4
rpush則在鏈表的尾部進行插入操作,其實就理解成左右就好了。
llen返回當前鏈表的長度。
lrange key start end返回指定區間的所有集合,代碼如下:
127.0.0.1:6379> lrange list 0 3
1) "d"
2) "c"
3) "b"
4) "a"
ltrim key start end用於截取指定區間的所有集合,有點類似java中的subString,代碼如下:127.0.0.1:6379> ltrim list 0 1
OK
127.0.0.1:6379> llen list
(integer) 2
lset key index value用於設置指定index的值,代碼如下:127.0.0.1:6379> lset list 0 z
OK
127.0.0.1:6379> lrange list 0 2
1) "z"
2) "c"
lrem key count value,從頭部(count爲正數)或者尾部(count爲負數),刪除指定數量匹配到爲value的值,並返回刪除數量,代碼如下:127.0.0.1:6379> lrem list 1 z
(integer) 1
127.0.0.1:6379> lrange list 0 2
1) "c"
lpop key和rpop分別從頭部或者尾部刪除並返回刪除元素,代碼如下:127.0.0.1:6379> lpop list
"c"
blpop key1...... keyN timeout 從左到右掃描,返回對第一個非空 list 進行 lpop 操作並返回,比如 blpop list1 list2 list3 如果 list 不存在 list2,list3 都是非空則對 list2 做lpop 並返回從 list2 中刪除的元素。如果所有的 list 都是空或不存在,則會阻塞timeout秒,timeout 爲 0 表示一直阻塞。當阻塞時,如果有 client 對 key1...keyN 中的任意 key進行 push 操作,則第一在這個 key 上被阻塞的 client 會立即返回。如果超時發生,則返回nil。
blpop和brpop實際上就是對lpop和rpop的變形,輪訓多個list,pop成功則返回;保證在能操作多個list的lpop和rpop同時,又能在當list都爲空時進行阻塞,當timeout爲0時,表示一直阻塞。
5、set類型
set類型是一種無序的集合,無序具體表現如下:
127.0.0.1:6379> sadd set a b c d e f
(integer) 6
127.0.0.1:6379> smembers set
1) "a"
2) "d"
3) "b"
4) "f"
5) "c"
6) "e"
此上也剛好解釋了sadd key value[]和smembers key的作用。另外的,set是一個非重複集合,如下:
127.0.0.1:6379> sadd set a
(integer) 0
127.0.0.1:6379> sadd set b
(integer) 0
srem key value,可以刪除指定元素,代碼如下:
127.0.0.1:6379> srem set a b c
(integer) 3
127.0.0.1:6379> smembers set
1) "d"
2) "f"
3) "e"
spop key count,隨機刪除並返回set中的元素:127.0.0.1:6379> spop set 1
1) "d"
127.0.0.1:6379> spop set 2
1) "e"
2) "f"
srandmember key,隨機返回但是不刪除set中的元素:127.0.0.1:6379> srandmember set
"a"
127.0.0.1:6379> srandmember set
"a"
127.0.0.1:6379> srandmember set
"c"
smove set1 set2 member,將set1中的member移動到set2中,代碼如下:127.0.0.1:6379> sadd set1 2
(integer) 1
127.0.0.1:6379> smove set1 set 2
(integer) 1
127.0.0.1:6379> smembers set
1) "c"
2) "b"
3) "a"
4) "d"
5) "2"
scard set,返回set的大小:代碼如下:127.0.0.1:6379> scard set
(integer) 5
sismember set member,判斷set中是否存在member,返回1或者0,代碼如下:127.0.0.1:6379> sismember set 2
(integer) 1
sinter set1 set2,返回兩個set的交集,代碼如下:127.0.0.1:6379> sadd set1 a b
(integer) 2
127.0.0.1:6379> sinter set set1
1) "b"
2) "a"
sinterstore keyset set1 set2,在上者的基礎上,將交集保存在keyset中,代碼如下:127.0.0.1:6379> sinterstore keyset set set1
(integer) 2
127.0.0.1:6379> smembers keyset
1) "b"
2) "a"
sunion,sunionstore,sdiff,sdiffstore同上,只不過處理的是並集和差集。
6、sorted set類型
顧名思義,該類型在set基礎上增加了排序的功能。實現方式是讓每一個set集合中的元素又擁有了其對應的score,set根據其對應的score實現排序。
zadd zset score value,添加元素並給元素一個score,若存在value則覆蓋:
127.0.0.1:6379> zadd zset 5 c
(integer) 1
zrange zset start end,這個和list的lrange很像,都是返回指定區間中的元素,只不過此返回的是按照score從小到大排序的元素集合,zrevrange恰好相反,返回的是score從大到小排序的元素集合:127.0.0.1:6379> zrange zset 0 3
1) "c"
2) "b"
3) "a"
zrank zset member(返回的是member的score從小到大的排名,zrevrank恰好相反,返回的是score從大到小的排名),返回zset中元素的排名,如此時的c,應該返回的是0:127.0.0.1:6379> zrank zset c
(integer) 0
zrem zset member,刪除指定的成員,這個操作set以及list都有:127.0.0.1:6379> zrem zset c
(integer) 1
zrangebyscore zset min max,在zrange的基礎上,返回指定score區間內的元素集合:127.0.0.1:6379> zrangebyscore zset 0 100
1) "b"
2) "a"
zincrby zset num member,可以對member對應的score進行加num操作。
zcount zset min max,返回指定score區間內元素的個數。
zcard,和scard類似,返回元素的個數:
127.0.0.1:6379> zcard zset
(integer) 2
zscore zset member,顧名思義,返回對應元素的對應的score:127.0.0.1:6379> zscore zset a
"100"
zremrangebyrank zset min max,zremrangebyscore zset min max,分別通過排名和score區間刪除集合。