1. 程式人生 > 其它 >Redis常用資料型別及操作

Redis常用資料型別及操作

Redis常用資料型別及操作

常用資料型別

Reids中基礎資料結構包含字串、雜湊,列表,集合,有序集合。工作中具體使用哪種型別要結合具體場景。

String型別操作實踐

字串型別是redis中最簡單的資料型別,它儲存的值可以是字串,其最大字串長度支援到512M。基於此型別,可以實現部落格的字數統計,將日誌不斷追加到指定key,實現一個分散式自增iid,實現一個部落格的的點贊操作等

incr/incrby

當儲存的字串是整數時,redis提供了一個實用的命令INCR,其作用是讓當前鍵值遞增,並返回遞增後的值。
語法:INCR key

127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"

說明,如果num不存在,則自動會建立,如果存在自動+1。

127.0.0.1:6379> incr num2
(integer) 1
127.0.0.1:6379> get num2
"1"

語法:INCRBY key increment

127.0.0.1:6379> set num3 6
OK
127.0.0.1:6379> get num3
"6"
127.0.0.1:6379> incrby num3 3
(integer) 9
127.0.0.1:6379> get num3
"9"

decr/decrby

減少指定的整數
DECR key 按照預設步長(預設為1)進行遞減
DECRBY key decrement 按照指定步長進行遞減

127.0.0.1:6379> get num3
"9"
127.0.0.1:6379> decr num3
(integer) 8
127.0.0.1:6379> get num3
"8"
127.0.0.1:6379> decrby num3 2
(integer) 6
127.0.0.1:6379> get num3
"6"

append

向尾部追加值。如果鍵不存在則建立該鍵,其值為寫的value,即相當於SET key value。返回值是追加後字串的總長度。
語法:APPEND key value

127.0.0.1:6379> set str qi
OK
127.0.0.1:6379> get str
"qi"
127.0.0.1:6379> APPEND str qi
(integer) 4
127.0.0.1:6379> get str
"qiqi"

strlen

字串長度,返回資料的長度,如果鍵不存在則返回0。注意,如果鍵值為空串,返回也是0。
語法:STRLEN key

127.0.0.1:6379> get str
"qiqi"
127.0.0.1:6379> STRLEN str
(integer) 4

mset/mget

同時設定/獲取多個鍵值
語法:MSET key value [key value …]
MGET key [key …]

127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"

Hash型別應用實踐

Redis雜湊型別相當於Java中的HashMap,實現原理跟HashMap一致,一般用於儲存物件資訊,儲存了欄位(field)和欄位值的對映,一個雜湊型別可以包含最多2^32-1個欄位。

hset/hget

語法結構

HSET key field value
HGET key field
HMSET key field value [field value…]
HMGET key field [field]
HGETALL key

HSET和HGET賦值和取值

127.0.0.1:6379> hset user username qi
(integer) 1
127.0.0.1:6379> hget user username
"qi"
127.0.0.1:6379> hset user username aqi
(integer) 0
127.0.0.1:6379> hget user username
"aqi"
127.0.0.1:6379> hset user age 22
(integer) 1
127.0.0.1:6379> hgetall user
1) "username"
2) "aqi"
3) "age"
4) "22"

HSET命令不區分插入和更新操作,當執行插入操作時HSET命令返回1,當執行更新操作時返回0。

hincrby

127.0.0.1:6379> HINCRBY user age 2
(integer) 24
127.0.0.1:6379> hget user age
"24"

hmset/hmget

HMSET和HMGET設定和獲取物件屬性

127.0.0.1:6379> hmset user name qi age 22 addr suzhou
OK
127.0.0.1:6379> hmget user name age
1) "qi"
2) "22"
127.0.0.1:6379> HGETALL user
1) "name"
2) "qi"
3) "age"
4) "22"
5) "addr"
6) "suzhou"

注意:上面HMGET欄位順序可以自行定義

hexists

屬性是否存在

127.0.0.1:6379> HEXISTS user name
(integer) 1
127.0.0.1:6379> HEXISTS user sex
(integer) 0

hdel

刪除屬性

127.0.0.1:6379> HGETALL user
1) "name"
2) "qi"
3) "age"
4) "22"
5) "addr"
6) "suzhou"
127.0.0.1:6379> HDEL user addr
(integer) 1
127.0.0.1:6379> HGETALL user
1) "name"
2) "qi"
3) "age"
4) "22"

hkeys/hvals

只獲取欄位名HKEYS或欄位值HVALS

127.0.0.1:6379> hkeys user
1) "name"
2) "age"
127.0.0.1:6379> HVALS user
1) "qi"
2) "22"

List型別應用實踐

Redis的list型別相當於java中的LinkedList,其原理就就是一個雙向連結串列。支援正向、反向查詢和遍歷等操作,插入刪除速度比較快。經常用於實現熱銷榜,最新評論等的設計。

lpush

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

127.0.0.1:6379> LPUSH list qi
(integer) 1
127.0.0.1:6379> LPUSH list a
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "qi"

其中,Redis Lrange 返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推

rpush

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

127.0.0.1:6379> RPUSH list qifei
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "qi"
3) "qifei"

del

127.0.0.1:6379> del list
(integer) 1

linsert

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

127.0.0.1:6379> LPUSH list qi a
(integer) 2
127.0.0.1:6379> LINSERT list before qi xiaoqi
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xiaoqi"
3) "qi"
127.0.0.1:6379> LINSERT list after  qi lail
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xiaoqi"
3) "qi"
4) "lail"

lset

設定list中指定下標的元素值(一般用於修改操作)

127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xiaoqi"
3) "qi"
4) "lail"
127.0.0.1:6379> lset list 3 kuai
OK
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xiaoqi"
3) "qi"
4) "kuai"

lrem

從key對應list中刪除count個和value相同的元素,count>0時,按從頭到尾的順序刪除

127.0.0.1:6379> LPUSH list hello
(integer) 1
127.0.0.1:6379> LPUSH list hello
(integer) 2
127.0.0.1:6379> LPUSH list hello
(integer) 3
127.0.0.1:6379> LPUSH list qiqi
(integer) 4
127.0.0.1:6379> LPUSH list hello
(integer) 5
127.0.0.1:6379> LPUSH list hello
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello"
3) "qiqi"
4) "hello"
5) "hello"
6) "hello"
127.0.0.1:6379> LREM list 3 hello
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "qiqi"
2) "hello"
3) "hello"

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

127.0.0.1:6379> LPUSH list hello
(integer) 4
127.0.0.1:6379> LPUSH list hello
(integer) 5
127.0.0.1:6379> LPUSH list hello
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello"
3) "hello"
4) "qiqi"
5) "hello"
6) "hello"
127.0.0.1:6379> lrem list -3 hello
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello"
3) "qiqi"

count=0時,刪除全部

127.0.0.1:6379> lrem list 0 hello
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "qiqi"

ltrim

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

127.0.0.1:6379> lpush list a b c d e f
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> LTRIM list 2 -1
OK
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"

lpop

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

127.0.0.1:6379> LPOP list
"d"

rpop

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

127.0.0.1:6379> RPOP list
"a"

llen

返回key對應list的長度:

127.0.0.1:6379> LLEN list
(integer) 2

lindex

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

127.0.0.1:6379> LPUSH list a b c d e f g
(integer) 7
127.0.0.1:6379> LINDEX list 4
"c"
127.0.0.1:6379> LINDEX list -1
"a"

rpoplpush

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

127.0.0.1:6379> rpoplpush list2 list
(nil)
127.0.0.1:6379> rpoplpush list list2
"a"

Set型別應用實踐

Redis的Set類似Java中的HashSet,是string型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。Redis中Set集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。

sadd

新增元素,重複元素新增失敗,返回0

127.0.0.1:6379> sadd name qi
(integer) 1
127.0.0.1:6379> sadd name fang
(integer) 1
127.0.0.1:6379> sadd name qi
(integer) 0

smembers

獲取內容

127.0.0.1:6379> SMEMBERS name
1) "fang"
2) "qi"

spop

移除並返回集合中的一個隨機元素

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> sadd name a b c d e f g
(integer) 7
127.0.0.1:6379> spop name
"d"
127.0.0.1:6379> spop name
"f"

scard

獲取成員個數

127.0.0.1:6379> scard name
(integer) 5

smove

移動一個元素到另外一個集合

127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd set2 a b c d e
(integer) 5
127.0.0.1:6379> smove set1 set2 3
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "4"
4) "5"
127.0.0.1:6379> SMEMBERS set2
1) "d"
2) "b"
3) "c"
4) "e"
5) "a"
6) "3"

sunion

並集

127.0.0.1:6379> SUNION set1 set2
 1) "1"
 2) "e"
 3) "b"
 4) "d"
 5) "4"
 6) "2"
 7) "5"
 8) "c"
 9) "a"
10) "3"
127.0.0.1:6379> SMEMBERS set2
1) "d"
2) "b"
3) "c"
4) "e"
5) "a"
6) "3"

Storted Set型別應用實踐

有序的set,通過分數值來進行排序,分數值越大,越靠後

zadd

新增資料

127.0.0.1:6379> zadd top 100 a 300 b 120 c 180 d 150 e
(integer) 5

zrange

獲取資料

127.0.0.1:6379> zrange top 0 -1
1) "a"
2) "c"
3) "e"
4) "d"
5) "b"

zscore

獲取資料分數

127.0.0.1:6379> zscore top a
"100"

zincrby

增加資料分數

127.0.0.1:6379> zincrby top 5 a
"105"

zrevrange

逆序獲取資料

127.0.0.1:6379> ZREVRANGE top 0 -1
1) "b"
2) "d"
3) "e"
4) "c"
5) "a"