Redis之數據類型,好記性不如爛筆頭(二)

我是方圓,勵志寫出好文章的博主
54青年節,大家節日快樂

2. 五大數據類型和三小數據類型

2.1 五大數據類型

2.1.1 String類型

127.0.0.1:6379> set name xiaowang #設置值
OK
127.0.0.1:6379> get name #獲取值
"xiaowang"
127.0.0.1:6379> exists name #查看key是否存在
(integer) 1
127.0.0.1:6379> move name 1 #移動key到數據庫1
(integer) 1
127.0.0.1:6379> select 1 #切換數據庫1
OK
127.0.0.1:6379[1]> get name
"xiaowang"
127.0.0.1:6379[1]> expire name 5 #設置key的生命時間
(integer) 1
127.0.0.1:6379[1]> ttl name #查看剩餘時間
(integer) 1
127.0.0.1:6379[1]> ttl name #時間耗盡後爲-2
(integer) -2
127.0.0.1:6379[1]> set name xiaowang3
OK
127.0.0.1:6379[1]> append name 3 #在value後連接3值
(integer) 10
127.0.0.1:6379[1]> get name
"xiaowang33"
127.0.0.1:6379[1]> set num 1
OK
127.0.0.1:6379[1]> incr num #增加1
(integer) 2
127.0.0.1:6379[1]> get num
"2"
127.0.0.1:6379[1]> decr num #減少1
(integer) 1
127.0.0.1:6379[1]> get num
"1"
127.0.0.1:6379[1]> incrby num 3 #設置了增加步長,增加3,返回值即爲結果
(integer) 4
127.0.0.1:6379[1]> decrby num 5 #設置減少步長,減少5
(integer) -1
127.0.0.1:6379[1]> getrange name 0 3 #獲取範圍內的值,全閉區間
"xiao"
127.0.0.1:6379[1]> getrange name 0 -1 #獲取全部範圍的值
"xiaowang33"
127.0.0.1:6379[1]> setrange name 7 54qingnian #從指定位置開始向後添加值
(integer) 17
127.0.0.1:6379[1]> get name
"xiaowan54qingnian"
127.0.0.1:6379[1]> type name #查看數據類型
string
127.0.0.1:6379[1]> setex name1 5 yb #設置key的同時,添加生命時間
OK
127.0.0.1:6379[1]> setnx name xiaowang #不存在時才能設置成功,已經存在的key則會設置失敗
(integer) 0
127.0.0.1:6379[1]> get name 
"xiaowan54qingnian"
127.0.0.1:6379[1]> mset name2 2 name3 3 #設置多個值
OK
127.0.0.1:6379[1]> msetnx name4 4 name5 5 #設置多個值,其中有一個設置失敗則全部失敗,setnx只能添加未存在的值
(integer) 1
127.0.0.1:6379[1]> mget name2 name3 name4  #獲取多個值
1) "2"
2) "3"
3) "4"
127.0.0.1:6379[1]> getset num 1 #先獲取再改變值
"-1"
127.0.0.1:6379[1]> get num
"1"

setxn 命令常在分佈式鎖中使用,不存在時纔會進行添加
String可以用做計數器

2.1.2 Hash類型

本質上和String類型區別不大

127.0.0.1:6379[1]> hset myhash field1 1 #向myhash中添加值
(integer) 1
127.0.0.1:6379[1]> hmset myhash field2 2 field3 3 #添加多個值
OK
127.0.0.1:6379[1]> hsetnx myhash field3 33 #不存在時才能添加成功
(integer) 0
127.0.0.1:6379[1]> hsetnx myhash field4 4
(integer) 1
127.0.0.1:6379[1]> hget myhash field1 #獲取值
"1"
127.0.0.1:6379[1]> hmget myhash field2 field3 #獲取多個值
1) "2"
2) "3"
127.0.0.1:6379[1]> hgetall myhash #獲取全部值
1) "field1"
2) "1"
3) "field2"
4) "2"
5) "field3"
6) "3"
127.0.0.1:6379[1]> hlen myhash #獲取myhash的大小
(integer) 3
127.0.0.1:6379[1]> hexists myhash field3 #判斷field3是否存在
(integer) 1
127.0.0.1:6379[1]> hkeys myhash #獲取所有key
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379[1]> hvals myhash #獲取所有value
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> hdel myhash field2 #刪除field2
(integer) 1
127.0.0.1:6379[1]> hincrby myhash field3 3 #使字段3增加3
(integer) 6

Hash數據類型用於存儲經常變動的信息,相比於String更適合存儲對象

2.1.3 Set類型

Set類型不能重複

127.0.0.1:6379[1]> sadd myset hello world #添加
(integer) 2
127.0.0.1:6379[1]> smembers myset #顯示所有成員
1) "world"
2) "hello"
127.0.0.1:6379[1]> sismember myset hello #判斷成員是否存在
(integer) 1
127.0.0.1:6379[1]> scard myset #返回myset的大小
(integer) 2
127.0.0.1:6379[1]> srem myset world #移除指定成員
(integer) 1
127.0.0.1:6379[1]> sadd myset set1 set2 set3 set4 set5
(integer) 5
127.0.0.1:6379[1]> srandmember myset #隨機抽取成員
"set2"
127.0.0.1:6379[1]> srandmember myset 3 #隨機抽取3個成員
1) "set2"
2) "set3"
3) "hello"
127.0.0.1:6379[1]> spop myset  #隨機彈出一個成員
"set5"
127.0.0.1:6379[1]> spop myset 
"set1"
127.0.0.1:6379[1]> smove myset myset2 set4 #移動指定成員到myset2
(integer) 1
127.0.0.1:6379[1]> smembers myset2
1) "set4"
127.0.0.1:6379[1]> smembers myset
1) "set2"
2) "set3"
3) "hello"
127.0.0.1:6379[1]> sadd myset 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379[1]> sadd myset2 7 8 9 10
(integer) 4
127.0.0.1:6379[1]> sdiff myset myset2 #取差集
1) "5"
2) "set2"
3) "set3"
4) "4"
5) "3"
6) "hello"
7) "1"
8) "2"
9) "6"
127.0.0.1:6379[1]> sinter myset myset2 #取交集
1) "8"
2) "9"
3) "7"
127.0.0.1:6379[1]> sunion myset myset2 #取並集
 1) "5"
 2) "set2"
 3) "set3"
 4) "4"
 5) "6"
 6) "3"
 7) "8"
 8) "1"
 9) "2"
10) "set4"
11) "10"
12) "9"
13) "hello"
14) "7"

Set數據類型,利用交集可以實現b站粉絲共同關注的功能。

2.1.4 ZSet類型

有序的Set集合

127.0.0.1:6379[1]> zadd myzset 1 one 2 two 3 three #添加元素
(integer) 3
127.0.0.1:6379[1]> zrangebyscore myzset -inf +inf #顯示從小到大的排列
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[1]> zrevrangebyscore myzset +inf -inf #顯示從大到小的排列
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[1]> zrevrange myzset 0 -1 #顯示所有倒序排列的元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[1]> zrange myzset 0 -1 #顯示所有正序排列的元素
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[1]> zrem myzset two #移除指定元素
(integer) 1
127.0.0.1:6379[1]> zcard myzset #返回myset大小
(integer) 2
127.0.0.1:6379[1]> zcount myzset -inf +inf #區間計數
(integer) 2

2.1.5 List類型

List實際上是一個鏈表,可以當作隊列或者來用,可重

127.0.0.1:6379[1]> lpush list 1 #在左邊添加一個值
(integer) 1
127.0.0.1:6379[1]> rpush list 2 #在右邊添加一個值
(integer) 2
127.0.0.1:6379[1]> rpush list 3 
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1 #顯示所有值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> lpop list #在左邊彈出一個值
"1"
127.0.0.1:6379[1]> rpop list #在右邊彈出一個值
"3"
127.0.0.1:6379[1]> rpush list 3
(integer) 2
127.0.0.1:6379[1]> rpush list 4
(integer) 3
127.0.0.1:6379[1]> rpush list 5
(integer) 4
127.0.0.1:6379[1]> lpush list 1
(integer) 5
127.0.0.1:6379[1]> lindex list 1 #獲取指定索引的值
"2"
127.0.0.1:6379[1]> llen list #返回list的大小
(integer) 5
127.0.0.1:6379[1]> lpush list 1
(integer) 6
127.0.0.1:6379[1]> lrem list 1 1 #y移除1個value爲1的值
(integer) 1
127.0.0.1:6379[1]> ltrim list 0 2 #竊取0-2索引,直接回改變list
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]> rpoplpush list list1 #右邊出左邊進到另一個list1
"3"
127.0.0.1:6379[1]> rpoplpush list list #自身右邊出左邊進
"2"
127.0.0.1:6379[1]> lrange list 0 -1
1) "2"
2) "1"
127.0.0.1:6379[1]> lset list 0 1 #改變0位置的值
OK
127.0.0.1:6379[1]> lset list 2 3 #改變2位置的值,沒有值會報錯
(error) ERR index out of range
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "1"
127.0.0.1:6379[1]> linsert list after 1 3 #插入值,在list第一個1值的後邊插入值3
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1
1) "1"
2) "3"
3) "1"

2.2 三小數據類型

2.2.1 geospatial類型

geoadd key 經度 緯度 value #添加地理位置
geodist #顯示距離長度
georedius #以某地爲中心,查找範圍內的地點

2.2.2 Hyperloglog類型

基數統計的算法,2的64次冪,只要12KB內存,從內存的角度,Hyperloglog很好。

127.0.0.1:6379[1]> pfadd mykey 1 2 3 #添加元素
(integer) 1
127.0.0.1:6379[1]> pfadd mykey2 3 4 5 6
(integer) 1
127.0.0.1:6379[1]> pfmerge mykey mykey2 #取並集
OK
127.0.0.1:6379[1]> pfcount mykey #統計數量
(integer) 6

若在允許容錯的情況下,可以用於統計計數

2.2.3 Bitmaps類型

位圖,只有 0 1 兩種狀態,可以用於實現簽到、未簽到等

127.0.0.1:6379[1]> setbit bit 0 1 #設置0的狀態爲1
(integer) 0
127.0.0.1:6379[1]> setbit bit 1 1 #設置1的狀態爲1
(integer) 0
127.0.0.1:6379[1]> setbit bit 2 0 #設置2的狀態爲0
(integer) 0
127.0.0.1:6379[1]> getbit bit 2 #獲取2的狀態
(integer) 0
127.0.0.1:6379[1]> getbit bit 1 #獲取1的狀態
(integer) 1
127.0.0.1:6379[1]> bitcount bit  #獲取所有1狀態的數量
(integer) 2

在這裏插入圖片描述

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