1. 总体介绍
- String属于最常被使用的数据类型,一个键对应着一个值。
- String具有二进制安全的属性,能够包含诸如图片和序列化对象等各类数据,并且支持序列化操作。
- 单个值最大可以达到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. 总结
字符串是一种基础的数据结构,可应用于分布式锁、点赞数量统计等场景。
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12578.html