1.概述
- String是最常用的數據類型,一個key對應一個value。
- String是二進制安全的,可以包含任何數據(例如圖片和序列化對象),支持序列化。
- 單個Value最大512MB。
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命令有EX、PX、NX、XX以及KEEPTTL五個可選參數,其中KEEPTTL為6.0版本添加的可選參數,其它為2.6.12版本添加的可選參數。
EX seconds以秒為單位設置過期時間PX milliseconds以毫秒為單位設置過期時間EXAT timestamp設置以秒為單位的UNIX時間戳所對應的時間為過期時間PXAT milliseconds-timestamp設置以毫秒為單位的UNIX時間戳所對應的時間為過期時間NX鍵不存在的時候設置鍵值XX鍵存在的時候設置鍵值KEEPTTL保留設置前指定鍵的生存時間GET返回指定鍵原本的值,若鍵不存在時返回nil
SET命令使用EX、PX、NX參數,其效果等同於SETEX、PSETEX、SETNX命令。根據官方文檔的描述,未來版本中SETEX、PSETEX、SETNX命令可能會被淘汰。
EX,NX可用於分佈式鎖。
案例:最常用的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.小結
字符串是一個最基本的數據結構,可用於分佈式鎖,點贊數量統計等場景。