【Redis】五大數據類型

Redis五大數據類型


查看當前進程

ps -ef |grep redis #當前進程

開啓redis服務

(base) flora@MAC-3DGroup:~$ cd ~/myredis
(base) flora@MAC-3DGroup:~/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

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