1. 程式人生 > 其它 >【Redis】五大資料型別

【Redis】五大資料型別

技術標籤:redis資料型別string

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++

  1. 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
    
  2. decr 減1
    127.0.0.1:6379> decr views # 減1操作
    (integer) 1
    127.0.0.1:6379> decr views
    (integer) 0
    
  3. 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