【Redis】五大資料型別
阿新 • • 發佈:2021-01-06
Redis五大資料型別
檢視當前程序
ps -ef |grep redis #當前程序
開啟redis服務
(base) [email protected]:~$ cd ~/myredis
(base) [email protected] :~/myredis$ redis-server ./redis.conf
連線
redis-cli -p 6379
String
使用場景:
- 計數器
- 統計多單位的數量
- 粉絲數
- 物件快取儲存
設定key 獲取key
get獲取 set設定
get
獲得key值
set
設定key值
exists
是否存在
set k1 v1
get key
127.0.0.1:6379> set k1 v1 # 設定值
OK
127.0.0.1:6379> get k1 # 獲得值
"v1"
127.0.0.1:6379> exists k1 #判斷key 是否存在
(integer) 1
getset 先get再set
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #獲取原來值 並設定新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
mget mset 同時設定、獲取多個值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量設定值
OK
127.0.0.1:6379> mget k1 k2 k3 #批量獲取值
1) "v1"
2) "v2"
3) "v3"
mset 設定物件值的例子
setnx msetnx 不存在設定
setnx key
不存在設定
一般在分散式鎖使用
127.0.0.1:6379> setnx k3 djsa #k3不存在 設定成功
(integer) 1
127.0.0.1:6379> setnx k3 aaaa #k3存在 設定失敗
(integer) 0
msetnx k1 v1 k2 v2
批量設定
msetnx 是原子性操作,要麼一起成功要麼一起失敗
也就是設定的key只要有一個是存在的,那所有的key都不能設定
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 #不存在key 設定 k1存在 設定失敗
(integer) 0
127.0.0.1:6379> get k4 # 設定失敗
(nil)
127.0.0.1:6379> get k1 #k1 還是原來的值
"v1"
setex 設定過期時間
setex(set with expire)
設定過期時間
ttl
剩餘的時間
127.0.0.1:6379> setex key3 30 hello #設定key3 的過期時間是30s
OK
127.0.0.1:6379> ttl key3 # key3剩餘的時間
(integer) 25
append 追加
append 在key後追加字串,如果key不存在 相當於set key
127.0.0.1:6379> append k1 hahahas
(integer) 9
127.0.0.1:6379> get k1
"v1hahahas"
strlen 獲取長度
127.0.0.1:6379> strlen k1
(integer) 9
i++
- incr 加1
127.0.0.1:6379> set views 0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views # 加1操作 (integer) 1 127.0.0.1:6379> incr views (integer) 2
- decr 減1
127.0.0.1:6379> decr views # 減1操作 (integer) 1 127.0.0.1:6379> decr views (integer) 0
- incrby 加指定的值 decrby 減指定的值
127.0.0.1:6379> decr views (integer) -1 127.0.0.1:6379> incrby views 9 #指定增量 (integer) 8 127.0.0.1:6379> decrby views 5 # 指定減量 (integer) 3
字串範圍
getrange 獲得指定範圍字串
127.0.0.1:6379> set key1 hello,hahaha
OK
127.0.0.1:6379> get key1
"hello,hahaha"
127.0.0.1:6379> getrange key1 0 3 # 擷取字串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #獲取全部字串,等價於get key
"hello,hahaha"
setrange 替換 指定位置開始的字串
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx #把從1開始的字串換成xx
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
127.0.0.1:6379>
list
所有的list命令都是以l開頭(也有r)的
實際是一個雙向連結串列
使用場景:
- 訊息排隊
- 訊息佇列
- 棧
插入
lpush 從左邊插入,插入到列表頭部
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
rpush 從右邊插入
將一個值或者多個值,插入到列表尾部(右)
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
linsert 指定值 前/後插入
linsert
在指定值的前面 或後面插入值
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert mylist before world other #在world前插入other
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new # 在world 後插入new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
rpoplpush 移除列表的最後一個元素
rpoplpush mylist myotherlist
把mylist 的最後一個元素移除,移到myotherlist中
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
127.0.0.1:6379>
移除
lpop rpop 從頭或尾移除
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list # 移除list的第一個元素
"three"
127.0.0.1:6379> rpop list # 移除list的最後一個元素
"four"
lrem 移除指定的值
lrem key count value
移除list集合中指定個數的value
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "three"
3) "three"
4) "two"
127.0.0.1:6379> lrem list 1 one #移除list中one
(integer) 1
127.0.0.1:6379> lrem list 2 three #移除兩個 值為 three的
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
ltrim 擷取區間內的值
ltrim 通過下標擷取指定的長度,這個list已經被改變了,截取了只剩下擷取的元素
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim mylist 1 2 #擷取[1,2] 內的值
OK
127.0.0.1:6379> lrange mylist 0 -1 # 擷取後的值
1) "hello1"
2) "hello2"
更新
lset
將列表中指定下標的值替換為另外一個值
如果指定下標不存在 就會報錯
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lset mylist 0 hahaha #更新下標為0的值
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hahaha"
2) "hello1"
127.0.0.1:6379> lset mylist 2 hahaha #索引不存在報錯
(error) ERR index out of range
獲取值
lrange 獲取區間內的值
127.0.0.1:6379> lrange list 0 -1 #獲取list中所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #可以看到是 符合先進後出
1) "three"
2) "two"
lindex 通過下標獲取值
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 2
(nil)
127.0.0.1:6379> lindex list 0
"two"
llen 獲取長度
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> llen list
(integer) 2
Set(集合)
set中的值不能重複
set 都是以s開頭的
新增
sadd 新增元素
127.0.0.1:6379> sadd myset hello #向set中新增值
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset loveworld
(integer) 1
127.0.0.1:6379> smembers myset #檢視所有值
1) "world"
2) "hello"
3) "loveworld"
移除
srem 移除指定元素
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> srem myset hello # 移除元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "loveworld"
spop 隨機刪除元素
127.0.0.1:6379> SMEMBERS myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> spop myset
"world"
smove 將一個指定的值移到另一個集合
127.0.0.1:6379> smembers myset2
1) "set2"
127.0.0.1:6379> smembers myset
1) "hhaha"
2) "loveworld"
127.0.0.1:6379> smove myset myset2 loveworld #將myset 的loveworld移到myset2
(integer) 1
127.0.0.1:6379> smembers myset
1) "hhaha"
127.0.0.1:6379> smembers myset2
1) "set2"
2) "loveworld"
獲取
smembers 檢視指定set的所有值
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
sismember 判斷一個值是不是在set中
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> sismember myset hello #hello是否在集合myset中
(integer) 1
srandmember 隨機抽取指定個數的元素
127.0.0.1:6379> smembers myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> SRANDMEMBER myset #隨機抽取一個元素
"hhaha"
127.0.0.1:6379> SRANDMEMBER myset #隨機抽取一個元素
"world"
127.0.0.1:6379> SRANDMEMBER myset 2 # 隨機抽取兩個元素
1) "world"
2) "hhaha"
scard 獲取set集合中的個數
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> scard myset
(integer) 3
交併補
sdiff 差集
sunion 並集
sinter 交集
127.0.0.1:6379> SMEMBERS set1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SMEMBERS set2
1) "f"
2) "d"
3) "c"
127.0.0.1:6379> sdiff set1 set2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sinter set1 set2 #交集
1) "c"
127.0.0.1:6379> sunion set1 set2 #並集
1) "f"
2) "b"
3) "c"
4) "a"
5) "d"
hash
map集合 key -map 這時候值是一個map集合
應用場景:
hash變更的資料 ,如使用者資訊的儲存 user name age
hash更適合物件的儲存
設定
hset
127.0.0.1:6379> hset myhash field1 ks
(integer) 1
hmset 同時設定多個值
127.0.0.1:6379> HMSET myhash field1 hello field2 world
OK
hsetnx 不存在設定
127.0.0.1:6379> hsetnx myhash field4 hello #不存在field4 設定成功
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello2 #存在field4 設定失敗
(integer) 0
獲取
hget
127.0.0.1:6379> hget myhash field1
"ks"
hmget 同時獲取多個值
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
獲取鍵、值
hgetall 獲取所有鍵值對
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
hkeys 獲取所有key
127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field3"
3) "field1"
hvals 獲取所有值
127.0.0.1:6379> hvals myhash
1) "hhaha"
2) "hhaha"
3) "11hhaha"
hexists 指定key是否存在
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> HEXISTS myhash field1
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379>
hlen 獲取長度
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
刪除
hdel 刪除指定key
key刪除了 指定的值也就沒有了
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 #刪除指定key
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
自增 自減
127.0.0.1:6379> hset myhash field9 5
(integer) 1
127.0.0.1:6379> hincrby myhash field9 1 # 自增1
(integer) 6
127.0.0.1:6379> hincrby myhash field9 -1 #減1
(integer) 5
Zset(有序集合)
在set的基礎上,增加了一個值 set k1 v1
應用場景:
- 排行榜應用實現
- 普通訊息、重要訊息 帶權重進行判斷
- 儲存班級成績表,工資表排序進行判斷
新增
zadd
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
移除
zrem
127.0.0.1:6379> zrange salary 0 -1
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> zrem salary ks
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xi"
2) "xixi"
獲取
zrange 獲取指定區間的值
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
排序
zrangebyscore 按score從小到大排序
127.0.0.1:6379> zadd salary 2500 xi
(integer) 1
127.0.0.1:6379> zadd salary 25200 xixi
(integer) 1
127.0.0.1:6379> zadd salary 200 ks
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #從小到大排序
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #排序且顯示score
1) "ks"
2) "200"
3) "xi"
4) "2500"
zrevrange 從大到小排序
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores
1) "xixi"
2) "25200"
3) "xi"
4) "2500"
5) "ks"
6) "2222"
獲取數量
zcard 獲取整個set的個數
127.0.0.1:6379> zcard salary
(integer) 2
zcount 獲取指定區間的成員數量
127.0.0.1:6379> zcount salary 200 300 # 這個區間內沒有符合的
(integer) 0
127.0.0.1:6379> zcount salary 200 3009 # 整個區間內有兩個符合條件的
(integer) 2