redis 五大資料結構
Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。
它支援多種型別的資料結構,如 字串(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 的基本命令
- ping
檢視客戶端是否連線成功
- set key value
設定 key 和 value
- get key
獲取 key 的值
- keys *
獲取所有 key
- move key 1
刪除 key
- expire key number
對 key 設定過期時間
- ttl key
檢視 key 的剩餘有效時間
- type key
檢視 key 的型別
- EXISTS key
檢視是否存在 key
root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name xiaomotong
OK
127.0.0.1:6379> get name
"xiaomotong"
127.0.0.1:6379> type name
string
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS xiaozhu
(integer) 0
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> set hobby sports
OK
127.0.0.1:6379> EXPIRE hobby 20
(integer) 1
127.0.0.1:6379> ttl hobby
(integer) 14
127.0.0.1:6379> ttl hobby
(integer) 13
127.0.0.1:6379> get hobby
(nil)
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379>
string 字串
設定單個值
- APPEND key value
在字串後面追加字串
- STRLEN key
計算 key 對應 value 的長度
- incr key
對 key 的值 +1
- decr key
對 key 的值 -1
- INCRBY key number
對 key +number
- DECRBY key number
對 key -number
- GETRANGE key start end
獲取字元範圍,獲取 key 對應 value 的 第 start 到 end 的字串
GETRANGE key 0 -1
和 get key
是一個效果
- setrange key offset value
替換 key 對應 value 從左到有 offset 個偏移量後面的字串
127.0.0.1:6379> set name xiaozhu
OK
127.0.0.1:6379> get name
"xiaozhu"
127.0.0.1:6379> APPEND name xiaopang
(integer) 15
127.0.0.1:6379> get name
"xiaozhuxiaopang"
127.0.0.1:6379> STRLEN name
(integer) 15
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> incr views
(integer) 3
127.0.0.1:6379> decr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> INCRBY views 20
(integer) 22
127.0.0.1:6379> get views
"22"
127.0.0.1:6379> DECRBY views 10
(integer) 12
127.0.0.1:6379> get views
"12"
127.0.0.1:6379> set words "hello wrold"
OK
127.0.0.1:6379> GETRANGE words 2 5
"llo "
127.0.0.1:6379> set key1 xiaozhupeiqi
OK
127.0.0.1:6379> GETRANGE key1 0 -1
"xiaozhupeiqi"
127.0.0.1:6379>
127.0.0.1:6379> setrange key1 4 pangziyo
(integer) 12
127.0.0.1:6379> get key1
"xiaopangziyo"
- setex key second value (set with expire)
設定 key 對應的過期時間 ,
- ttl key
檢視 key 的有效時間
- setnx key value (if not exist)
如果 key 不存在,那就設定 , 這個指令通常用於分散式鎖
127.0.0.1:6379> setex call 30 xiaomotong
OK
127.0.0.1:6379> ttl call
(integer) 24
127.0.0.1:6379> ttl call
(integer) 21
127.0.0.1:6379> setnx call xiaozhu
(integer) 1
127.0.0.1:6379> get call
"xiaozhu"
127.0.0.1:6379> setnx call xiaoming
(integer) 0
127.0.0.1:6379> get call
"xiaozhu"
批量設定多個值
- mset key value [key value ...]
設定多個 key value
- mget key [key ...]
獲取多個 key 對應的值
- MSETNX key value [key value ...]
設定多個值,如果 key 不存在,則設定值,這是一個原子操作,要麼全部成功,要麼全部失敗
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k4"
3) "k3"
4) "k1"
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> msetnx k4 44
(integer) 0
127.0.0.1:6379> msetnx k4 44 k5 55
(integer) 0
設定物件
設定物件,我們們可以將 redis 的 key 設計成為我們業務需要的字元 key ,例如下面的例子
127.0.0.1:6379> set student:1:name xiaozhuy
OK
127.0.0.1:6379> set student:2:name xiaopangzi
OK
127.0.0.1:6379> mset student:3:name xiaopeiqi student:3:age 18 student:3:hobby basketball
OK
127.0.0.1:6379> keys student:3*
1) "student:3:hobby"
2) "student:3:age"
3) "student:3:name"
127.0.0.1:6379> mget student:3:hobby student:3:age student:3:name
1) "basketball"
2) "18"
3) "xiaopeiqi"
- getset
先 get 值,再 set 值
127.0.0.1:6379> getset location beijing
(nil)
127.0.0.1:6379> get location
"beijing"
127.0.0.1:6379> getset location changsha
"beijing"
127.0.0.1:6379> get location
"changsha"
string 字串的使用場景
string 型別的使用場景非常多,如下列舉一些:
- 計數器
- 統計多個單位的數量
- 物件快取儲存
- 分數,粉絲數,點贊量 等等
List
List 是基本資料型別,即列表
在 redis 的 List 裡面,我們們可以模擬棧,佇列,阻塞佇列等等
- LPUSH key element [element ...]
從左邊插入資料到 key 中,這個 key 是有個list , list 型別的指令都是 l
開頭
RPUSH key element [element ...]
從右邊插入資料到 key 中
- LRANGE key start stop
檢視 list 的範圍,
LRANGE key 0 1
檢視當前 list 的全部值
127.0.0.1:6379> LPUSH mylist k1
(integer) 1
127.0.0.1:6379> LPUSH mylist k2
(integer) 2
127.0.0.1:6379> LPUSH mylist k3
(integer) 3
127.0.0.1:6379> LRANGE 0 -1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> LRANGE mylist 0 1
1) "k3"
2) "k2"
127.0.0.1:6379> RPUSH mylist 4
(integer) 4
127.0.0.1:6379> RPUSH mylist 5
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "k3"
2) "k2"
3) "k1"
4) "4"
5) "5"
- LPOP key [count]
從 list 的左邊移除資料,預設是 1 個 ,即為移除 list 的第一個元素
- RPOP key [count]
從 list 的右邊移除資料 , 即為移除 list 的最後一個元素
127.0.0.1:6379> LPOP mylist
"k3"
127.0.0.1:6379> LPOP mylist 2
1) "k2"
2) "k1"
127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "5"
127.0.0.1:6379> RPOP mylist
"5"
127.0.0.1:6379> lrange mylist 0 -1
1) "4"
- LINDEX key index
檢視 list 中第 index 個值,從 0 開始
127.0.0.1:6379> keys *
1) "mylist"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "4"
127.0.0.1:6379> LINDEX mylist 1
(nil)
127.0.0.1:6379> LINDEX mylist 0
"4"
- LLEN key
檢視 list 的長度
127.0.0.1:6379> LLEN mylist
(integer) 1
127.0.0.1:6379> LPUSH mylist k6
(integer) 2
127.0.0.1:6379> LPUSH mylist k7
(integer) 3
127.0.0.1:6379> LLEN mylist
(integer) 3
- LREM key count element
刪除 list 中指定的元素,可以指定刪除多少個
127.0.0.1:6379> lpush mylist one two three four five
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> LREM mylist 1 five
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lpush mylist one
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 -1
1) "one"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> LREM mylist 2 one
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
127.0.0.1:6379> LREM mylist 4 ll
(integer) 0
LREM 刪除 list 中不存在的資料,返回 0 ,0 為失敗,
LREM 刪除 list 中存在的資料,若期望刪除 5 個,實際上只有 2 個,那麼redis 會返回 2 ,刪除成功
- LTRIM key start stop
裁剪,剪枝,獲取 list 的某一段,並裁剪下來
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k5"
2) "k4"
3) "k3"
4) "k2"
5) "k1"
6) "four"
7) "three"
8) "two"
127.0.0.1:6379> LTRIM mylist 3 5
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k2"
2) "k1"
3) "four"
- RPOPLPUSH source destination
從源 list 中的右邊取出資料,從目的 list 的左邊加入資料
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k2"
2) "k1"
3) "four"
127.0.0.1:6379> RPOPLPUSH mylist newlist
"four"
127.0.0.1:6379>
127.0.0.1:6379> lrange newlist 0 -1
1) "four"
- LSET key index element
將 list 中的對應索引的資料,替換成 element ,如果索引本沒有資料,則會報錯
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "k1"
127.0.0.1:6379> LSET mylist 1 hello
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "hello"
127.0.0.1:6379> LSET mylist 10 world
(error) ERR index out of range
LINSERT key BEFORE|AFTER pivot element
list 中在指定元素的前面或者後面新增資料
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "hello"
127.0.0.1:6379> LINSERT mylist before hello xiaozhu
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "xiaozhu"
3) "hello"
127.0.0.1:6379> LINSERT mylist after hello bottom
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "k2"
2) "xiaozhu"
3) "hello"
4) "bottom"
- list 實際是一個連結串列,before node , after node ,left ,right 都是可以插入資料的
- 如果 key 不存在,會建立新的 key ,即建立新的連結串列
- 如果 key 存在,正常加入資料
- 如果移除了所有的值,那麼 key 就不存在了
- 在 list 的兩邊插入和刪除資料效率最高,從中間運算元據,效率相對較低
list 列表的應用場景:
list 可以做訊息佇列(FIFO),也可以做棧(FILO)
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~