1. 限制
最大512M,可通过proto-max-bulk-len配置
2. 场景
缓存场景、计数场景(Redis处理命令是单线程,所以执行命令的过程是原子的。如计算访问次数、点赞、转发、库存数量等)
3. 使用
创建: SET、SETNX(key不存在时插入,插入失败返回0)
SET参数:EX(过期时间为n秒)
PX(过期时间为n毫秒)
NX(key不存在时插入,插入失败返回null。SET key value NX 等同于 SETNX key value)
XX(key存在时插入)
查询: GET、MGET(同时查询多个key,如果key不存在,对应位置值为null)
更新: SET
删除: DEL
4. 编码方式
-
INT:整型,可以用long表示的整数。
如果更新后数值超long的大小或存在字符串==>EMBSTR。
-
EMBSTR:短字符串。
长度超过阈值(3.2前是39字节,3.2后是44字节),或被修改过==>RAW。
-
RAW:长字符串。
5. SDS(Simple Dynamic String 简单动态字符串)
-
EMBSTR、RAW都是由 redisObject + SDS 两个结构组成。
-
EMBSTR 下 redisObject + SDS 内存是连续的,可一次性分配,但若需再分配,整体都要重新分配。所以 EMBSTR 的设计为只读,任何写操作都会使 EMBSTR 转换为 RAW (认为其是易变的)。
-
RAW 下 redisObject + SDS 内存是分开的,
-
EMBSTR内存
-
-
RAW 内存
-
6. 为什么使用 SDS
-
C 语言中,字符串以 `\0` 结尾,每次计算字符串长度时间复杂度为 O(n) ,每次追加内容需要重新分配内存,二进制不安全。
-
所以 Redis 封装了 SDS 结构,其中 len 表示长度,alloc 表示分配的空间,(alloc - len)即为预留空间大小。len 可以用于快速计算字符串长度,预留空间为字符串内容追加保留余地,且不在以 `\0` 作为判断标准,二进制安全。
-
预留空间大小规则,len 小于 1M 时,预留大小为 len。len 大于 1M 时,预留大小为 1M。