Skip to main content

Redis 字符串(String)

1. 简介​

字符串是 Redis 最基本的数据类型,也是最常用的类型。Redis 的字符串是二进制安全的,可以存储任何数据,包括图片、序列化对象等。一个字符串值最大可以是 512MB。

2. 基本命令​

命令描述说明
SET key value设置字符串值如果 key 已经存储其他值, SET 就覆写旧值,且无视类型
GET key获取字符串值如果 key 不存在,返回 nil 。如果 key 储存的值不是字符串类型,返回一个错误
GETSET key value设置新值并返回旧值当 key 没有旧值时,即 key 不存在时,返回 nil
当 key 存在但不是字符串类型时,返回一个错误
STRLEN key获取字符串长度当 key 不存在时,返回 0
APPEND key value追加字符串到末尾如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
GETRANGE key start end获取字符串子串字符串的截取范围为 [start, end]
SETRANGE key offset value从指定位置开始覆写字符串当 key 不存在时,先将其值补零到指定偏移量,再写入 value 。
返回修改后的字符串长度

2.1 示例​

127.0.0.1:6379> set key "value"
OK
127.0.0.1:6379> get key
"value"

127.0.0.1:6379> set key "aaa"
OK
127.0.0.1:6379> get key
"aaa"

# get不存在的key
127.0.0.1:6379> get name
(nil)

127.0.0.1:6379> getset key "new-value"
"aaa"
127.0.0.1:6379> get key
"new-value"

127.0.0.1:6379> strlen key
(integer) 9

127.0.0.1:6379> append key " aaa"
(integer) 13

127.0.0.1:6379> getrange key 10 13
"aaa"

127.0.0.1:6379> setrange key 0 "BBB"
(integer) 13
127.0.0.1:6379> get key
"BBB-value aaa"

3. 数值操作命令​

当字符串存储的是数字时,Redis 提供了原子性的数值操作。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

命令描述说明
INCR key将数值递增 1如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
INCRBY key increment将数值增加指定值如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
INCRBYFLOAT key increment将数值增加指定浮点数如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
DECR key将数值递减 1如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
DECRBY key decrement将数值减少指定值如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

3.1 示例​

127.0.0.1:6379> incr page
(integer) 1
127.0.0.1:6379> get page
"1"

127.0.0.1:6379> incrby page 5
(integer) 6
127.0.0.1:6379> get page
"6"

127.0.0.1:6379> incrbyfloat page 0.1
"6.1"
127.0.0.1:6379> decr page
(error) ERR value is not an integer or out of range

127.0.0.1:6379> set page 10
OK
127.0.0.1:6379> get page
"10"

127.0.0.1:6379> decr page
(integer) 9

127.0.0.1:6379> decrby page 5
(integer) 4

4. 批量操作命令​

Redis 支持批量操作多个字符串,提高操作效率:

命令描述示例
MSET key value [key value ...]批量设置多个键值对MSET k1 v1 k2 v2 k3 v3
MGET key [key ...]批量获取多个键的值MGET k1 k2 k3
MSETNX key value [key value ...]批量设置(仅当所有键都不存在时)MSETNX k4 v4 k5 v5

4.1 示例​

127.0.0.1:6379> mset key1 'hello' key2 'world'
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
"world"
127.0.0.1:6379> mget key1 key2
1) "hello"
2) "world"

127.0.0.1:6379> msetnx rmdbs 'mysql' nosql 'mongodb' key-value-store 'redis'
(integer) 1
127.0.0.1:6379> mget rmdbs nosql key-value-store
1) "mysql"
2) "mongodb"
3) "redis"
127.0.0.1:6379> msetnx rmdbs 'sqlite' language 'java'
(integer) 0

5. 条件设置命令​

Redis 提供了带条件的设置命令,常用于实现分布式锁。

命令描述示例
SETNX key value仅当键不存在时设置设置成功,返回 1 。
设置失败,返回 0 。
SETEX key seconds value设置值并指定过期时间如果 key 已经存在, SETEX 命令将会替换旧的值
PSETEX key milliseconds value设置值并指定过期时间(毫秒)PSETEX cache:key 60000 "data"
`SET key value [EX seconds] [PX milliseconds] [NXXX]`设置值(支持多种选项)

5.1 示例​

# 分布式锁实现
SET lock:order:1001 "locked" EX 30 NX
# 如果返回OK,表示获取锁成功
# 如果返回nil,表示锁已被其他进程持有

# 会话管理
SETEX session:user123 3600 "{\"user_id\": 123, \"role\": \"admin\"}"

# 缓存设置
SET cache:article:1001 "article_content" EX 1800 # 30分钟过期