【Redis 系列】redis 學習三,redis 資料結構之 string 和 list 基本使用及熟悉

小魔童哪吒發表於2022-01-19

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 -1get 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 是基本資料型別,即列表

image-20210818201443260

在 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)

歡迎點贊,關注,收藏

朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這裡

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~

相關文章