String
一、String 类型概述
Redis 的 String 类型并不仅仅是简单的"字符串"。它实际上是 二进制安全 的,意味着它可以存储任何形式的二进制数据,而不仅仅是可打印的文本。这使得 String 类型可以用来存储:
- 普通的文本字符串(例如:"hello world")
- 数字(整数或浮点数,例如:100, 3.14)
- 二进制数据(例如:一张图片的序列化内容或一个序列化的对象)
一个 String 类型的 value 最大可以存储 512MB 的数据。
二、基本方法
- 简单set get del
bash
127.0.0.1:6379> set name xiaozhang #设置key-value
OK
127.0.0.1:6379> get name #获得value
"xiaozhang"
127.0.0.1:6379> get age #获取失败
(nil)
127.0.0.1:6379> del name #删除key
(integer) 1
127.0.0.1:6379> del age #删除失败
(integer) 0
- 批量set get
bash
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"
127.0.0.1:6379> mdel k1 k2 #没有mdel
(error) ERR unknown command 'mdel', with args beginning with: 'k1' 'k2'
- 增与减
bash
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num #自增
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> decr num #自减
(integer) 1
127.0.0.1:6379> incrby num 10 #指定增加
(integer) 11
127.0.0.1:6379> decrby num 5 #指定减少
(integer) 6
- 特殊的get set: setex,setnx, getset
bash
127.0.0.1:6379> setex test 5 ok #设置key的过期时间
OK
127.0.0.1:6379> ttl test #检查key多久之后会过期
(integer) 3
127.0.0.1:6379> ttl test
(integer) 1
127.0.0.1:6379> ttl test
(integer) -2 #key=-2说明已过期
127.0.0.1:6379> setnx test ok #SET if Not eXists。只有在 key不存在时,才设置 key 的值。
(integer) 1
127.0.0.1:6379> setnx test no
(integer) 0
127.0.0.1:6379> get test
"ok"
127.0.0.1:6379> getset test no #设置key的新值,并返回key的旧值
"ok"
127.0.0.1:6379> get test
"no"
- 字符串操作
bash
127.0.0.1:6379> set name xiao
OK
127.0.0.1:6379> strlen name #获取value的长度
(integer) 4
127.0.0.1:6379> append name zhang #如果key已经存在并且是一个字符串,则将value追加到原有值的末尾
(integer) 9
127.0.0.1:6379> get name
"xiaozhang"
127.0.0.1:6379> getrange name 0 -1 #获取范围字符串的子字符串,但是不会改变原来的字符串
"xiaozhang"
127.0.0.1:6379> getrange name 0 3
"xiao"
127.0.0.1:6379> get name
"xiaozhang"
三、内部编码
Redis 会根据存储的 value 的不同,智能地采用不同的内部编码来节省内存和提高效率。对于 String 类型,主要有三种:
- int:当存储的值是 64 位有符号整数时,Redis 会直接使用整数存储。
- embstr:当存储的字符串长度较短(<= 44 字节)时,Redis 会使用一种优化的嵌入式字符串编码。
- raw:当存储的字符串长度较长(> 44 字节)或者是浮点数时,Redis 会使用标准的简单动态字符串(SDS)来存储。
你可以使用 OBJECT ENCODING key
命令来查看一个 key 的内部编码。
四、应用场景
String 类型的应用场景极其广泛:
- 缓存:最经典的用法。将数据库查询结果、页面内容、对象序列化后存储起来,加速访问。
- 计数器 :利用
INCR
,DECR
命令实现网站访问量、视频播放量、点赞数等。原子性操作保证了高并发下的准确性。 - 分布式会话(Session) :结合
SETEX
,将用户的 Session 信息存储在 Redis 中,实现多台应用服务器共享 Session。 - 分布式锁 :利用
SETNX
命令可以实现一个简单的分布式锁。 - 存储简单对象 :将对象序列化成 JSON 字符串后存储。例如:
SET user:1001 '{"name":"Alice", "age":30}'
。