天天看點

Redis學習筆記03--五大資料類型

來源參考,b站狂神說:https://space.bilibili.com/95256449

官網文檔

Redis學習筆記03--五大資料類型

全段翻譯:

Redis 是一個開源(BSD許可)的,記憶體中的資料結構存儲系統,它可以用作資料庫、緩存和消息中間件MQ。 它支援多種類型的資料結構,如 字元串(strings), 散列(hashes), 清單(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間

(geospatial) 索引半徑查詢。 Redis 内置了 複制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級别的 磁盤持久化(persistence), 并通過Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

Redis-Key

127.0.0.1:6379> keys * # 檢視所有的key
(empty list or set)
127.0.0.1:6379> set name kuangshen # set key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> EXISTS name # 判斷目前的key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1 # 移除目前的key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name qinjiang
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> clear
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"qinjiang"
127.0.0.1:6379> EXPIRE name 10 # 設定key的過期時間,機關是秒
(integer) 1
127.0.0.1:6379> ttl name # 檢視目前key的剩餘時間
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name # 檢視目前key的一個類型!
string
127.0.0.1:6379> type age
string
           

String(字元串)

##########################################################################
127.0.0.1:6379> set key1 v1 # 設定值
OK
127.0.0.1:6379> get key1 # 獲得值
"v1"
127.0.0.1:6379> keys * # 獲得所有的key
1) "key1"
127.0.0.1:6379> EXISTS key1 # 判斷某一個key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" # 追加字元串,如果目前key不存在,就相當于setkey
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 # 擷取字元串的長度!
(integer) 7
127.0.0.1:6379> APPEND key1 ",kaungshen"
(integer) 17
127.0.0.1:6379> STRLEN key1
(integer) 17
127.0.0.1:6379> get key1
"v1hello,kaungshen"
##########################################################################
# i++
# 步長 i+=
127.0.0.1:6379> set views 0 # 初始浏覽量為0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 自增1 浏覽量變為1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views # 自減1 浏覽量-1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> INCRBY views 10 # 可以設定步長,指定增量!
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
127.0.0.1:6379> DECRBY views 5
(integer) 14
##########################################################################
# 字元串範圍 range
127.0.0.1:6379> set key1 "hello,kuangshen" # 設定 key1 的值
OK
127.0.0.1:6379> get key1
"hello,kuangshen"
127.0.0.1:6379> GETRANGE key1 0 3 # 截取字元串 [0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 擷取全部的字元串 和 get key是一樣的
"hello,kuangshen"
# 替換!
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 # 替換指定位置開始的字元串!
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
##########################################################################
# setex (set with expire) # 設定過期時間
# setnx (set if not exist) # 不存在在設定 (在分布式鎖中會常常使用!)
127.0.0.1:6379> setex key3 30 "hello" # 設定key3 的值為 hello,30秒後過期
OK
127.0.0.1:6379> ttl key3
(integer) 26
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" # 如果mykey 不存在,建立mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "mykey"
3) "key1"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB" # 如果mykey存在,建立失敗!
(integer) 0
127.0.0.1:6379> get mykey
"redis"
##########################################################################
mset
mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同時設定多個值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
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 # msetnx 是一個原子性的操作,要麼一起成功,要麼一起
失敗!
(integer) 0
127.0.0.1:6379> get k4
(nil)
# 對象
set user:1 {name:zhangsan,age:3} # 設定一個user:1 對象 值為 json字元來儲存一個對象!
# 這裡的key是一個巧妙的設計: user:{id}:{filed} , 如此設計在Redis中是完全OK了!
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
##########################################################################
getset # 先get然後在set
127.0.0.1:6379> getset db redis # 如果不存在值,則傳回 nil
(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"
           

資料結構是相同的!

String類似的使用場景:value除了是我們的字元串還可以是我們的數字!

計數器

統計多機關的數量

粉絲數

對象緩存存儲!

List(清單)

基本的資料類型,清單

Redis學習筆記03--五大資料類型

在redis裡面,我們可以把list玩成 ,棧、隊列、阻塞隊列!

所有的list指令都是用l開頭的,Redis不區分大小指令

##########################################################################
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
127.0.0.1:6379> LRANGE list 0 -1 # 擷取list中值!
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 # 通過區間擷取具體的值!
1) "three"
2) "two"
127.0.0.1:6379> Rpush list righr # 将一個值或者多個值,插入到清單位部 (右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "righr"
##########################################################################
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "righr"
127.0.0.1:6379> Lpop list # 移除list的第一個元素
"three"
127.0.0.1:6379> Rpop list # 移除list的最後一個元素
"righr"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
##########################################################################
Lindex
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 # 通過下标獲得 list 中的某一個值!
"one"
127.0.0.1:6379> lindex list 0
"two"
##########################################################################
Llen
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
127.0.0.1:6379> Llen list # 傳回清單的長度
(integer) 3
##########################################################################
移除指定的值!
取關 uid
Lrem
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除list集合中指定個數的value,精确比對
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
##########################################################################
trim 修剪。; list 截斷!
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> Rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> Rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 # 通過下标截取指定的長度,這個list已經被改變了,截斷了
隻剩下截取的元素!
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"
##########################################################################
rpoplpush # 移除清單的最後一個元素,将他移動到新的清單中!
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
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"
##########################################################################
lset 将清單中指定下标的值替換為另外一個值,更新操作
127.0.0.1:6379> EXISTS list # 判斷這個清單是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item # 如果不存在清單我們去更新就會報錯
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item # 如果存在,更新目前下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other # 如果不存在,則會報錯!
(error) ERR index out of range
##########################################################################
linsert # 将某個具體的value插入到列把你中某個元素的前面或者後面!
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "world"
(integer) 2
127.0.0.1:6379> LINSERT mylist before "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
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
           

他實際上是一個連結清單,before Node after , left,right 都可以插入值

如果key 不存在,建立新的連結清單

如果key存在,新增内容

如果移除了所有值,空連結清單,也代表不存在!

在兩邊插入或者改動值,效率最高! 中間元素,相對來說效率會低一點~

消息排隊!消息隊列 (Lpush Rpop), 棧( Lpush Lpop)!

Set(集合)

##########################################################################
127.0.0.1:6379> sadd myset "hello" # set集合中添加勻速
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset # 檢視指定set的所有值
1) "hello"
2) "lovekuangshen"
3) "kuangshen"
127.0.0.1:6379> SISMEMBER myset hello # 判斷某一個值是不是在set集合中!
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 0
##########################################################################
127.0.0.1:6379> scard myset # 擷取set集合中的内容元素個數!
(integer) 4
##########################################################################
rem
127.0.0.1:6379> srem myset hello # 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen2"
2) "lovekuangshen"
3) "kuangshen"
##########################################################################
set 無序不重複集合。抽随機!
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen2"
2) "lovekuangshen"
3) "kuangshen"
127.0.0.1:6379> SRANDMEMBER myset # 随機抽選出一個元素
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随機抽選出指定個數的元素
1) "lovekuangshen"
2) "lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "lovekuangshen"
2) "lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset # 随機抽選出一個元素
"lovekuangshen2"
##########################################################################
删除定的key,随機删除key!
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen2"
2) "lovekuangshen"
3) "kuangshen"
127.0.0.1:6379> spop myset # 随機删除一些set集合中的元素!
"lovekuangshen2"
127.0.0.1:6379> spop myset
"lovekuangshen"
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
##########################################################################
将一個指定的值,移動到另外一個set集合!
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen" # 将一個指定的值,移動到另外一個set集
合!
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379> SMEMBERS myset2
1) "kuangshen"
2) "set2"
##########################################################################
微網誌,B站,共同關注!(并集)
數字集合類:
- 差集 SDIFF
- 交集
- 并集
127.0.0.1:6379> SDIFF key1 key2 # 差集
1) "b"
2) "a"
127.0.0.1:6379> SINTER key1 key2 # 交集 共同好友就可以這樣實作
1) "c"
127.0.0.1:6379> SUNION key1 key2 # 并集
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"
           

微網誌,A使用者将所有關注的人放在一個set集合中!将它的粉絲也放在一個集合中!

共同關注,共同愛好,二度好友,推薦好友!

Hash(哈希)

Map集合,key-map! 時候這個值是一個map集合! 本質和String類型沒有太大差別,還是一個簡單的

key-vlaue!

##########################################################################
127.0.0.1:6379> hset myhash field1 kuangshen # set一個具體 key-vlaue
(integer) 1
127.0.0.1:6379> hget myhash field1 # 擷取一個字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field1 hello field2 world # set多個 key-vlaue
OK
127.0.0.1:6379> hmget myhash field1 field2 # 擷取多個字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 擷取全部的資料,
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 # 删除hash指定key字段!對應的value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
##########################################################################
hlen
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> HGETALL myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash # 擷取hash表的字段數量!
(integer) 2
##########################################################################
127.0.0.1:6379> HEXISTS myhash field1 # 判斷hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3
(integer) 0
##########################################################################
# 隻獲得所有field
# 隻獲得所有value
127.0.0.1:6379> hkeys myhash # 隻獲得所有field
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash # 隻獲得所有value
1) "world"
2) "hello"
##########################################################################
incr decr
127.0.0.1:6379> hset myhash field3 5 #指定增量!
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在則可以設定
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world # 如果存在則不能設定
(integer) 0
           

Zset(有序集合)

在set的基礎上,增加了一個值,set k1 v1 zset k1 score1 v1

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"
##########################################################################
排序如何實作
127.0.0.1:6379> zadd salary 2500 xiaohong # 添加三個使用者
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kaungshen
(integer) 1
# ZRANGEBYSCORE key min max
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 顯示全部的使用者 從小到大!
1) "kaungshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZREVRANGE salary 0 -1 # 從大到進行排序!
1) "zhangsan"
2) "kaungshen"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 顯示全部的使用者并且附帶成
績
1) "kaungshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores # 顯示工資小于2500員工的升
序排序!
1) "kaungshen"
2) "500"
3) "xiaohong"
4) "2500"
##########################################################################
# 移除rem中的元素
127.0.0.1:6379> zrange salary 0 -1
1) "kaungshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong # 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "kaungshen"
2) "zhangsan"
127.0.0.1:6379> zcard salary # 擷取有序集合中的個數
(integer) 2
##########################################################################
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 kuangshen
(integer) 2
127.0.0.1:6379> zcount myset 1 3 # 擷取指定區間的成員數量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
           

案例思路:set 排序 存儲班級成績表,工資表排序!

普通消息,1, 重要消息 2,帶權重進行判斷!

排行榜應用實作,取Top N 測試!

繼續閱讀