Redis數據類型

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

應用

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

定義商品編號key:items:id

192.168.101.3:7003> INCR items:id
(integer) 2
192.168.101.3:7003> INCR items:id
(integer) 3

Hash

散列類型

使用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"

List

Arraylist和linkedlist的區別

Arraylist是使用數組來存儲數據,特點:查詢快、增刪慢
Linkedlist是使用雙向鏈表存儲數據,特點:增刪快、查詢慢,但是查詢鏈表兩端的數據也很快。

Redis的list是採用來鏈表來存儲的,所以對於redis的list數據類型的操作,是操作list的兩端數據來操作的。

命令

向列表兩端增加元素

  • 向列表左邊增加元素
    語法:LPUSH key value [value …]
127.0.0.1:6379> lpush list:112 3
(integer) 3
  • 向列表右邊增加元素
    語法:RPUSH key value [value …]
127.0.0.1:6379> rpush list:14 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值的不同,該命令的執行方式會有所不同:

  • 當count>0時, LREM會從列表左邊開始刪除。
  • 當count<0時,LREM會從列表後邊開始刪除。
  • 當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}’

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“

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的銷量加
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
  • 商品銷量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores

結束點贊!鼓掌!

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