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值的不同,該命令的執行方式會有所不同:
- 當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}' |
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 |