1. 程式人生 > >Redis基礎二----------Redis的資料型別

Redis基礎二----------Redis的資料型別

Redis基礎二

Redis可以通過一些鍵值型別來儲存資料。

鍵值型別:

String字元型別

map雜湊型別

list列表型別

set集合型別

sortedset有序集合型別

1、String字元型別

賦值

語法:SET key value

127.0.0.1:6379> set test 123

OK

取值

語法:GET key

127.0.0.1:6379> get test

"123“

取值並賦值

語法:GETSET key value

127.0.0.1:6379> getset s2 222

"111"

127.0.0.1:6379> get s2

"222"

設定/獲取多個鍵值 

語法

MSET key value [key value …]

MGET key [key …]

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3

OK

127.0.0.1:6379> get k1

"v1"

127.0.0.1:6379> mget k1 k3

1) "v1"

2) "v3"

刪除

語法:DEL key

127.0.0.1:6379> del test

(integer) 1

數值增減

遞增數字

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

 

語法:INCR key

127.0.0.1:6379> incr num

(integer) 1

127.0.0.1:6379> incr num

(integer) 2

127.0.0.1:6379> incr num

(integer) 3

 

增加指定的整數

語法:INCRBY key increment

127.0.0.1:6379> incrby num 2

(integer) 5

127.0.0.1:6379> incrby num 2

(integer) 7

127.0.0.1:6379> incrby num 2

(integer) 9

遞減數值

語法:DECR key

127.0.0.1:6379> decr num

(integer) 9

127.0.0.1:6379> decr num

(integer) 8

 

減少指定的整數 

語法:DECRBY key decrement

127.0.0.1:6379> decr num

(integer) 6

127.0.0.1:6379> decr num

(integer) 5

127.0.0.1:6379> decrby num 3

(integer) 2

127.0.0.1:6379> decrby num 3

(integer) -1

其它命令(自學)向尾部追加值 

APPEND的作用是向鍵值的末尾追加value。如果鍵不存在則將該鍵的值設定為value,即相當於 SET key value。返回值是追加後字串的總長度。 

 

語法APPEND key value

127.0.0.1:6379> set str hello

OK

127.0.0.1:6379> append str " world!"

(integer) 12

127.0.0.1:6379> get str

"hello world!"

 

 

​​​​​​​獲取字串長度 

STRLEN命令返回鍵值的長度,如果鍵不存在則返回0。

 

語法STRLEN key

127.0.0.1:6379> strlen str

(integer) 0

127.0.0.1:6379> set str hello

OK

127.0.0.1:6379> strlen str

(integer) 5

 

應用自增主鍵

商品編號、訂單號採用string的遞增數字特性生成。

 

定義商品編號key:items:id

192.168.101.3:7003> INCR items:id

(integer) 2

192.168.101.3:7003> INCR items:id

(integer) 3

​​​​​​​2、Hash(map)雜湊型別

雜湊型別

​​​​​​​使用string的問題

假設有User物件以JSON序列化的形式儲存到Redis中,User物件有id,username、password、age、name等屬性,儲存的過程如下: 

儲存、更新: 

User物件 à json(string) à redis

如果在業務上只是更新age屬性,其他的屬性並不做更新我應該怎麼做呢? 如果仍然採用上邊的方法在傳輸、處理時會造成資源浪費,下邊講的hash可以很好的解決這個問題。

 

​​​​​​​redis hash介紹

hash叫雜湊型別,它提供了欄位和欄位值的對映。欄位值只能是字串型別,不支援雜湊型別、集合型別等其它型別。如下:

命令

賦值

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

一次只能設定一個欄位值

語法HSET key field value

127.0.0.1:6379> hset user username zhangsan

(integer) 1

一次可以設定多個欄位值

語法HMSET key field value [field value ...]

127.0.0.1:6379> hmset user age 20 username lisi

OK

當欄位不存在時賦值,類似HSET,區別在於如果欄位存在,該命令不執行任何操作

語法HSETNX key field value

127.0.0.1:6379> hsetnx user age 30 如果user中沒有age欄位則設定age值為30,否則不做任何操作

(integer) 0

 

​​​​​​​取值 

一次只能獲取一個欄位值

語法HGET key field

127.0.0.1:6379> hget user username

"zhangsan“

一次可以獲取多個欄位值

語法:HMGET key field [field ...]

127.0.0.1:6379> hmget user age username

1) "20"

2) "lisi"

獲取所有欄位值

語法:HGETALL key

127.0.0.1:6379> hgetall user

1) "age"

2) "20"

3) "username"

4) "lisi"

刪除欄位

可以刪除一個或多個欄位,返回值是被刪除的欄位個數 

語法HDEL key field [field ...]

127.0.0.1:6379> hdel user age

(integer) 1

127.0.0.1:6379> hdel user age name

(integer) 0

127.0.0.1:6379> hdel user age username

(integer) 1

增加數字 

語法HINCRBY key field increment

127.0.0.1:6379> hincrby user age 2 將使用者的年齡加2

(integer) 22

127.0.0.1:6379> hget user age 獲取使用者的年齡

"22“

其它命令(自學)

判斷欄位是否存在

 

語法HEXISTS key field

127.0.0.1:6379> hexists user age 檢視user中是否有age欄位

(integer) 1

127.0.0.1:6379> hexists user name 檢視user中是否有name欄位

(integer) 0

只獲取欄位名或欄位值

語法

HKEYS key

HVALS key

127.0.0.1:6379> hmset user age 20 name lisi

OK

127.0.0.1:6379> hkeys user

1) "age"

2) "name"

127.0.0.1:6379> hvals user

1) "20"

2) "lisi

獲取欄位數量 

語法HLEN key

127.0.0.1:6379> hlen user

(integer) 2

  • 儲存商品資訊
  • 應用
  • 商品欄位

【商品id、商品名稱、商品描述、商品庫存、商品好評】

定義商品資訊的key

商品1001的資訊在 Redis中的key為:[items:1001]

儲存商品資訊

192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9

OK

獲取商品資訊

192.168.101.3:7003> HGET items:1001 id

"3"

192.168.101.3:7003> HGETALL items:1001

1) "id"

2) "3"

3) "name"

4) "apple"

5) "price"

6) "999.9"

3、list列表型別

​​​​​​​Arraylist和linkedlist的區別

Arraylist是使用陣列來儲存資料,特點:查詢快、增刪慢

Linkedlist是使用雙向連結串列儲存資料,特點:增刪快、查詢慢,但是查詢連結串列兩端的資料也很快。

 

Redis的list是採用來連結串列來儲存的,所以對於redis的list資料型別的操作,是操作list的兩端資料來操作的。

命令

向列表兩端增加元素

向列表左邊增加元素 

語法LPUSH key value [value ...]

127.0.0.1:6379> lpush list:1 1 2 3

(integer) 3

向列表右邊增加元素 

語法:RPUSH key value [value ...]

127.0.0.1:6379> rpush list:1 4 5 6

(integer) 3

​​​​​​​檢視列表 

LRANGE命令是列表型別最常用的命令之一,獲取列表中的某一片段,將返回start、stop之間的所有元素(包含兩端的元素),索引從0開始。索引可以是負數,如:-1”代表最後邊的一個元素

語法LRANGE key start stop

127.0.0.1:6379> lrange list:1 0 2

1) "2"

2) "1"

3) "4"

 

127.0.0.1:6379> lrange list1 0 -1

​​​​​​​從列表兩端彈出元素 

LPOP命令從列表左邊彈出一個元素,會分兩步完成:

第一步是將列表左邊的元素從列表中移除

第二步是返回被移除的元素值。

語法

LPOP key

RPOP key

127.0.0.1:6379> lpop list:1

"3“

127.0.0.1:6379> rpop list:1

"6“

​​​​​​​獲取列表中元素的個數 

語法LLEN key

127.0.0.1:6379> llen list:1

(integer) 2

其它命令(自學)

刪除列表中指定的值 

LREM命令會刪除列表中前count個值為value的元素,返回實際刪除的元素個數。根據count值的不同,該命令的執行方式會有所不同: 

  1. 當count>0時, LREM會從列表左邊開始刪除。 
  2. 當count<0時, LREM會從列表後邊開始刪除。 
  3. 當count=0時, LREM刪除所有值為value的元素。 

語法LREM key count value

 

​​​​​​​獲得/設定指定索引的元素值 

獲得指定索引的元素值

語法:LINDEX key index

127.0.0.1:6379> lindex l:list 2

"1"

設定指定索引的元素值

語法:LSET key index value

127.0.0.1:6379> lset l:list 2 2

OK

127.0.0.1:6379> lrange l:list 0 -1

1) "6"

2) "5"

3) "2"

4) "2"

​​​​​​​只保留列表指定片段

指定範圍和LRANGE一致 

語法LTRIM key start stop

127.0.0.1:6379> lrange l:list 0 -1

1) "6"

2) "5"

3) "0"

4) "2"

127.0.0.1:6379> ltrim l:list 0 2

OK

127.0.0.1:6379> lrange l:list 0 -1

1) "6"

2) "5"

3) "0"

​​​​​​​向列表中插入元素 

該命令首先會在列表中從左到右查詢值為pivot的元素,然後根據第二個引數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面。 

語法LINSERT key BEFORE|AFTER pivot value

127.0.0.1:6379> lrange list 0 -1

1) "3"

2) "2"

3) "1"

127.0.0.1:6379> linsert list after 3 4

(integer) 4

127.0.0.1:6379> lrange list 0 -1

1) "3"

2) "4"

3) "2"

4) "1"

​​​​​​​將元素從一個列表轉移到另一個列表中 

語法RPOPLPUSH source destination

127.0.0.1:6379> rpoplpush list newlist

"1"

127.0.0.1:6379> lrange newlist 0 -1

1) "1"

127.0.0.1:6379> lrange list 0 -1

1) "3"

2) "4"

3) "2"

 

應用

商品評論列表

思路:

在Redis中建立商品評論列表

使用者釋出商品評論,將評論資訊轉成json儲存到list中。

使用者在頁面查詢評論列表,從redis中取出json資料展示到頁面。

 

定義商品評論列表key:

商品編號為1001的商品評論key【items: comment:1001】

192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不錯,很好!!","date":1430295077289}'

​​​​​​​4、Set集合型別

集合型別:無序、不可重複

列表型別:有序、可重複

命令

增加/刪除元素 

語法SADD key member [member ...]

127.0.0.1:6379> sadd set a b c

(integer) 3

127.0.0.1:6379> sadd set a

(integer) 0

語法SREM key member [member ...]

127.0.0.1:6379> srem set c d

(integer) 1

獲得集合中的所有元素 

語法SMEMBERS key

127.0.0.1:6379> smembers set

1) "b"

2) "a”

判斷元素是否在集合中

語法SISMEMBER key member

127.0.0.1:6379> sismember set a

(integer) 1

127.0.0.1:6379> sismember set h

(integer) 0

運算命令

集合的差集運算 A-B

 

屬於A並且不屬於B的元素構成的集合。 

語法SDIFF key [key ...]

 

127.0.0.1:6379> sadd setA 1 2 3

(integer) 3

127.0.0.1:6379> sadd setB 2 3 4

(integer) 3

127.0.0.1:6379> sdiff setA setB

1) "1"

127.0.0.1:6379> sdiff setB setA

1) "4"

集合的交集運算 A ∩ B

屬於A且屬於B的元素構成的集合。 

語法:SINTER key [key ...]

127.0.0.1:6379> sinter setA setB

1) "2"

2) "3"

集合的並集運算 A  B

屬於A或者屬於B的元素構成的集合

語法:SUNION key [key ...]

127.0.0.1:6379> sunion setA setB

1) "1"

2) "2"

3) "3"

4) "4"

其它命令(自學)獲得集合中元素的個數 

語法SCARD key

127.0.0.1:6379> smembers setA

1) "1"

2) "2"

3) "3"

127.0.0.1:6379> scard setA

(integer) 3

從集合中彈出一個元素

注意:由於集合是無序的,所有SPOP命令會從集合中隨機選擇一個元素彈出 

語法SPOP key

127.0.0.1:6379> spop setA

"1“

5、Sortedset

Sortedset又叫zset

Sortedset是有序集合,可排序的,但是唯一。

Sortedset和set的不同之處,是會給set中的元素新增一個分數,然後通過這個分數進行排序。

命令

增加元素

 

向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。 

語法ZADD key score member [score member ...]

127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu

(integer) 3

127.0.0.1:6379> zadd scoreboard 97 lisi

(integer) 0

獲取元素的分數 

語法:ZSCORE key member

127.0.0.1:6379> zscore scoreboard lisi

"97"

刪除元素

移除有序集key中的一個或多個成員,不存在的成員將被忽略。

當key存在但不是有序集型別時,返回一個錯誤。

語法:ZREM key member [member ...]

127.0.0.1:6379> zrem scoreboard lisi

(integer) 1

獲得排名在某個範圍的元素列表

獲得排名在某個範圍的元素列表 

  • 按照元素分數從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素)

語法ZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrange scoreboard 0 2

1) "zhangsan"

2) "wangwu"

3) "lisi“

 

  • 按照元素分數從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)

 

語法ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrevrange scoreboard 0 2

1) " lisi "

2) "wangwu"

3) " zhangsan “

 

如果需要獲得元素的分數的可以在命令尾部加上WITHSCORES引數 

127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES

1) "zhangsan"

2) "80"

3) "wangwu"

4) "94"

獲取元素的排名 

  • 從小到大

語法ZRANK key member

127.0.0.1:6379> ZRANK scoreboard lisi

(integer) 0

 

  • 從大到小

語法ZREVRANK key member

127.0.0.1:6379> ZREVRANK scoreboard zhangsan

(integer) 1

其它命令(自學)

獲得指定分數範圍的元素

語法ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES

1) "wangwu"

2) "94"

3) "lisi"

4) "97"

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2

1) "wangwu"

2) "lisi"

增加某個元素的分數

返回值是更改後的分數 語法ZINCRBY  key increment member

127.0.0.1:6379> ZINCRBY scoreboard 4 lisi

"101“

獲得集合中元素的數量

語法ZCARD key

127.0.0.1:6379> ZCARD scoreboard

(integer) 3

獲得指定分數範圍內的元素個數

語法ZCOUNT key min max

127.0.0.1:6379> ZCOUNT scoreboard 80 90

(integer) 1

按照排名範圍刪除元素 

語法ZREMRANGEBYRANK key start stop

127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1

(integer) 2

127.0.0.1:6379> ZRANGE scoreboard 0 -1

1) "lisi"

​​​​​​​按照分數範圍刪除元素 

語法ZREMRANGEBYSCORE key min max

127.0.0.1:6379> zadd scoreboard 84 zhangsan

(integer) 1

127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100

(integer) 1

應用

商品銷售排行榜

需求:根據商品銷售量對商品進行排行顯示

思路:定義商品銷售排行榜(sorted set集合),Key為items:sellsort,分數為商品銷售量。

 

寫入商品銷售量

  • 商品編號1001的銷量是9,商品編號1002的銷量是10

192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002

 

  • 商品編號1001的銷量加1

192.168.101.3:7001> ZINCRBY items:sellsort 1 1001

 

  • 商品銷量前10名:

192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores