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
結束點贊!鼓掌!