动态

详情 返回 返回

Redis數據結構之String - 动态 详情

1.概述

  • String是最常用的數據類型,一個key對應一個value。
  • String是二進制安全的,可以包含任何數據(例如圖片和序列化對象),支持序列化。
  • 單個Value最大512MB。

image

2.常見操作

2.1 SET/GET

語法:

[ ]是可選的參數

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

SET命令有EXPXNXXX以及KEEPTTL五個可選參數,其中KEEPTTL為6.0版本添加的可選參數,其它為2.6.12版本添加的可選參數。

  • EX seconds 以秒為單位設置過期時間
  • PX milliseconds 以毫秒為單位設置過期時間
  • EXAT timestamp 設置以秒為單位的UNIX時間戳所對應的時間為過期時間
  • PXAT milliseconds-timestamp 設置以毫秒為單位的UNIX時間戳所對應的時間為過期時間
  • NX 鍵不存在的時候設置鍵值
  • XX 鍵存在的時候設置鍵值
  • KEEPTTL 保留設置前指定鍵的生存時間
  • GET 返回指定鍵原本的值,若鍵不存在時返回nil

SET命令使用EXPXNX參數,其效果等同於SETEXPSETEXSETNX命令。根據官方文檔的描述,未來版本中SETEXPSETEXSETNX命令可能會被淘汰。

EXNX可用於分佈式鎖。

案例:最常用的set/get

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"

案例:NX,鍵不存在才能創建,否則不能創建

127.0.0.1:6379> set k1 v1 nx
OK
127.0.0.1:6379> set k1 v1 nx
(nil)

案例:XX,已存在的才創建,否則不能創建

127.0.0.1:6379> set k1 v1 
OK
127.0.0.1:6379> set k1 v1 xx
OK
127.0.0.1:6379> get k2
(nil)
127.0.0.1:6379> set k2 v2 xx
(nil)

案例:GET,設置新的值前先把舊的值返回

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k1 v2 get
"v1"

案例:EX,10秒過期

127.0.0.1:6379> set k1 v1 ex 10
OK
127.0.0.1:6379> ttl k1
(integer) 8
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> ttl k1
(integer) 4

set ex是原子操作,和先set key value然後expire key是不同的,後者不是原子的

案例:PX,9000毫秒過期

127.0.0.1:6379> set k1 v1 px 9000
OK
127.0.0.1:6379> ttl k1
(integer) 7
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) 4

案例:KEEPTTL

同一個key如果設置了新的值,又沒有追加過期時間,redis會令其立即過期

127.0.0.1:6379> set k1 v1 ex 40
OK
127.0.0.1:6379> ttl k1
(integer) 37
127.0.0.1:6379> set k1 v2
OK
127.0.0.1:6379> ttl k1
(integer) -1

如果需要續接過期時間,就需要用到參數KEEPTTL,設置新值後,過期時間會被續接下來

127.0.0.1:6379> set k1 v1 ex 50  
OK
127.0.0.1:6379> ttl k1
(integer) 46
127.0.0.1:6379> set k1 v1 keepttl
OK
127.0.0.1:6379> ttl k1
(integer) 33

2.2 MSET/MGET/MSETNX

案例: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"

案例 MSETNX,同時設置多個key的值,且key不存在才設置,只會同時成功或同時失敗

失敗,因為k1已經存在,k1沒有成功修改,k2也根本存不進去

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> msetnx k1 a1 k2 v2
(integer) 0
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
(nil)

成功,k1,k2都不存在,全部添加成功

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> msetnx k1 v1 k2 v2
(integer) 1
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"

2.3 GETRANGE/SETRANGE

GETRANGE,類似Java中的substring(),字符串截取, 0到-1代表不截取

案例:

127.0.0.1:6379> set k1 abcdefg
OK
127.0.0.1:6379> getrange k1 0 -1
"abcdefg"
127.0.0.1:6379> getrange k1 1 4
"bcde"

SETRANGE,從第幾個字符開始設置新的內容

案例:

127.0.0.1:6379> set k1 abcdefg
OK
127.0.0.1:6379> setrange k1 1 xxyy
(integer) 7
127.0.0.1:6379> get k1
"axxyyfg"

2.4 INCR(BY)/DECR(BY)

數值的加減,值一定要是數字才能進行這個操作

案例:INCR,每次執行加1

127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> incr k1
(integer) 101
127.0.0.1:6379> incr k1
(integer) 102
127.0.0.1:6379> incr k1
(integer) 103
127.0.0.1:6379> incr k1
(integer) 104

案例:INCRBY,修改步長為5

127.0.0.1:6379> set k1 0
OK
127.0.0.1:6379> incrby k1 5
(integer) 5
127.0.0.1:6379> incrby k1 5
(integer) 10
127.0.0.1:6379> incrby k1 5

案例:DECR,遞減1,DECRBY同理

127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> decr k1
(integer) 99
127.0.0.1:6379> decr k1
(integer) 98
127.0.0.1:6379> decr k1
(integer) 97

127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> decrby k1 5
(integer) 95
127.0.0.1:6379> decrby k1 5
(integer) 90
127.0.0.1:6379> decrby k1 5
(integer) 85

2.5 STRLEN

字符串長度

語法

strlen key

案例

127.0.0.1:6379> set k1 aaa
OK
127.0.0.1:6379> strlen k1
(integer) 3

2.6 APPEND

字符串追加

語法

APPEND key value

案例

127.0.0.1:6379> set k1 aaa
OK
127.0.0.1:6379> append k1 bbb
(integer) 6
127.0.0.1:6379> get k1
"aaabbb"

2.7 GETSET

getset,顧名思義,先取值在設置新的值進去,和set key value get命令相同

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> getset k1 v2
"v1"
127.0.0.1:6379> get k1
"v2"

3.小結

字符串是一個最基本的數據結構,可用於分佈式鎖,點贊數量統計等場景。

Add a new 评论

Some HTML is okay.