字符串类型是Redis最基础的数据结构。首先key都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习打下基础。
字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
有关string类型的命令可以通过help @string
命令来查看。有关命令的使用可以通过help 命令
来查看,例如help set
。
参考文档:http://redisdoc.com/
字符串操作
GET
get:获取值。
语法:
GET key
使用:
127.0.0.1:6379> get hi
"hello"
SET
set:设置值
语法:
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
SET命令的选项:
-
EX seconds:为键设置过期时间,单位为秒。
-
PX milliseconds:为键设置过期时间,单位为毫秒。
-
EXAT timestamp:为键设置过期的时间戳,单位为秒。
-
PXAT milliseconds-timestamp:为键设置过期的时间戳,单位为毫秒。
-
NX:键必须不存在,才可以设置成功,用于添加。
-
XX:与-NX相反,键必须存在,才可以设置成功,用于更新。
-
GET:返回键中存储的旧字符串,如果键不存在则返回nil值。当使用此选项时,如果键中存储的值不是字符串,将返回错误并中止设置操作。
-
KEEPTTL:保留与键关联的剩余时间。如果键已经设置了过期时间,使用这个选项将不会改变其过期时间。
使用:
# 设置值
127.0.0.1:6379> set k1 v1
OK# 获取值
127.0.0.1:6379> get k1
"v1"# xx 当键不存在时,设置失败
127.0.0.1:6379> set k2 vv1 xx
(nil)# xx 当键存在时,设置成功
127.0.0.1:6379> set k1 vv1 xx
OK
127.0.0.1:6379> get k1
"vv1"# nx 当键不存在时,设置成功
127.0.0.1:6379> set k3 v3 nx
OK# nx 当键存在时,设置失败
127.0.0.1:6379> set k1 v3 nx
(nil)# ex 设置过期时间,单位秒
127.0.0.1:6379> set k4 v4 ex 60
OK
127.0.0.1:6379> ttl k4
(integer) 58# px 设置过期时间,单位毫秒
127.0.0.1:6379> set k5 v5 px 60000
OK
127.0.0.1:6379> ttl k5
(integer) 56# exat 设置过期时间戳,单位秒
127.0.0.1:6379> set k6 v6 exat 1736847643
OK
127.0.0.1:6379> ttl k6
(integer) 340# pxat 设置过期时间戳,单位毫秒
127.0.0.1:6379> set k7 v7 pxat 1736847643000
OK
127.0.0.1:6379> ttl k7
(integer) 281# get 获取到旧的value,相当于getset命令
127.0.0.1:6379> set k1 v1 get
"vv1"# keepttl 保留与键关联的剩余时间
127.0.0.1:6379> set k8 v8 ex 60000
OK
127.0.0.1:6379> ttl k8
(integer) 59997
127.0.0.1:6379> set k8 vv8 keepttl
OK
127.0.0.1:6379> ttl k8
(integer) 59968
# 不带keepttl会覆盖过期时间
127.0.0.1:6379> set k8 vv8
OK
127.0.0.1:6379> ttl k8
(integer) -1
时间戳工具网站:http://shijianchuo.wiicha.com/
SETNX
setnx:键必须不存在,才可以设置成功,类似于set
命令的nx
选项。
语法:
SETNX key value
使用:
127.0.0.1:6379> setnx k2 v2
(integer) 0127.0.0.1:6379> setnx k9 v9
(integer) 1
由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value
,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:
https://redis.io/docs/latest/develop/use/patterns/distributed-locks/
SETEX
setex:设置一个带过期时间(单位秒)的值。
语法:
SETEX key seconds value
使用:
127.0.0.1:6379> setex k10 60 v10
OK127.0.0.1:6379> ttl k10
(integer) 58
PSETEX
psetex:设置一个带过期时间(单位毫秒)的值
语法:
PSETEX key milliseconds value
使用:
127.0.0.1:6379> psetex k11 60000 v11
OK127.0.0.1:6379> ttl k11
(integer) 56
GETSET
getset:获取存储在指定键中的值,并将其设置为新值。
语法:
GETSET key value
使用:
127.0.0.1:6379> get k1
"v1"127.0.0.1:6379> getset k1 vv1
"v1"127.0.0.1:6379> get k1
"vv1"
GETDEL
getdel:获取存储在指定键中的值,并立即删除该键值对。。
语法:
GETDEL key
使用:
127.0.0.1:6379> getdel k1
"vv1"127.0.0.1:6379> exists k1
(integer) 0
GETEX
getex:获取键的值的同时,还可以选择设置或更新该键的过期时间。
语法:
GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]
选项说明:
-
key:要获取值的键。
-
EX seconds:设置键在指定秒数后过期。
-
PX milliseconds:设置键在指定毫秒数后过期。
-
EXAT timestamp-seconds:设置键在指定的 Unix 时间戳(秒)过期。
-
PXAT timestamp-milliseconds:设置键在指定的 Unix 时间戳(毫秒)过期。
-
PERSIST:移除键的过期时间。
使用:
127.0.0.1:6379> set mykey hello
OK127.0.0.1:6379> getex mykey ex 60
"hello"127.0.0.1:6379> ttl mykey
MSET
mset:批量设置值。
语法:
MSET key value [key value ...]
使用:
127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK
批量操作命令可以有效提高开发效率,mset还能保证这些key和value一次性设置成功,保证原子性。
MGET
mget:批量获取值。
语法:
MGET key [key ...]
使用:
127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"
MSETNX
msetnx:用于同时设置多个键值对,但仅当这些键都不存在时才会执行设置操作。如果有一个或多个键已经存在,那么MSETNX不会执行任何设置操作,并且会返回一个特定的结果来指示操作是否成功。
语法:
MSETNX key value [key value ...]
使用:
127.0.0.1:6379> mset a 1 b 2 c 3
OK127.0.0.1:6379> msetnx d 4 f 5 a 0
(integer) 0127.0.0.1:6379> msetnx d 4 f 5
(integer) 1
APPEND
append:追加字符串。
语法:
APPEND key value
使用:
127.0.0.1:6379> set k1 hello
OK127.0.0.1:6379> append k1 " word"
(integer) 10127.0.0.1:6379> get k1
"hello word"
SETRANGE
setrange:设置字符串范围的值。
语法:
SETRANGE key offset value
使用:
127.0.0.1:6379> set k1 hello
OK127.0.0.1:6379> setrange k1 3 world
(integer) 8127.0.0.1:6379> get k1
"helworld"
GETRANGE
getrange:获取字符串范围的值。
语法:
GETRANGE key start end
使用:
127.0.0.1:6379> getrange k1 0 3
"helw"
STRLEN
strlen:获取字符串的长度
语法:
STRLEN key
使用:
127.0.0.1:6379> strlen k1
(integer) 8
数值操作
INCR
incr:自增1。
语法:
INCR key
使用:
127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range127.0.0.1:6379> incr k2
(integer) 1
key不存在,则从0开始递增,key存在且不是整型会报错。
INCRBY
incrby:增加指定整数步长。
语法:
INCRBY key increment
使用:
127.0.0.1:6379> incrby k2 10
(integer) 11
INCRBYFLOAT
incrbyfloat:增加指定浮点数步长。
语法:
INCRBYFLOAT key increment
使用:
127.0.0.1:6379> incrbyfloat k2 0.5
"11.5"
DECR
decr:减1。
语法:
DECR key
使用:
127.0.0.1:6379> set k3 10
OK127.0.0.1:6379> decr k3
(integer) 9
DECRBY
decrby:减少指定整数步长。
语法:
DECRBY key increment
使用:
127.0.0.1:6379> decrby k3 5
(integer) 4
内部实现
字符串类型的内部编码有3种:
-
int:8个字节的长整型。
-
embstr:小于等于39个字节的字符串。
-
raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
127.0.0.1:6379> set kk 100
OK127.0.0.1:6379> object encoding kk
"int"127.0.0.1:6379> set kk 100.5
OK127.0.0.1:6379> object encoding kk
"embstr"127.0.0.1:6379> set ke abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmopqrstuvwxyz
OK127.0.0.1:6379> object encoding ke
"raw"
使用场景
-
缓存,将一些热点数据存储在redis中,当用户请求过来时直接查询redis,无需查询数据库,减少数据库的压力。
-
计数,可用于点赞数、评论数、访问数。
-
session共享。
-
分布式锁。