定义
动态字符数组
有专门存放长度的成员,无需使用类似C的特定结束符’\0’
二进制安全:可以存储图片、二进制协议等二进制数据
动态扩容
length < 1M 每次*2
length > 1M 每次+1M
最大长度 <= 512M
存储结构
存储结构
int:字符串长度小于等于20且能转成整数
embstr:字符串长度小于等于44
raw:字符串长度大于44
命令
- SET
- SETNX
- SETEX
- PSETEX
- GET
- GETSET
- STRLEN
- APPEND
- SETRANGE
- GETRANGE
- INCR
- INCRBY
- INCRBYFLOAT
- DECR
- DECRBY
- MSET
- MSETNX
- MGET
应用
1. 对象存储
127.0.0.1:6379> SET role:10001 '{["name"]:"Joe",["sex"]:"male",["age"]:25}'
OK
127.0.0.1:6379> GET role:10001
"{[\"name\"]:\"Joe\",[\"sex\"]:\"male\",[\"age\"]:25}"
与hash对比
2. 累加器
# 统计阅读量 自动累计加1
127.0.0.1:6379> INCR reads
(integer) 1
127.0.0.1:6379> GET reads
"1"
127.0.0.1:6379> INCR reads
(integer) 2
127.0.0.1:6379> GET reads
"2"
# 累计加50
127.0.0.1:6379> INCRBY reads 50
(integer) 52
127.0.0.1:6379> GET reads
"52"
3. 分布式锁
# 加锁
127.0.0.1:6379> SETNX lock 1
(integer) 1
127.0.0.1:6379> GET lock
"1"
# 释放锁
127.0.0.1:6379> DEL lock
(integer) 1
127.0.0.1:6379> DEL lock
(integer) 0
4. 位运算
签到打卡
# 实现月签到功能 设置用户10001在2022年1月签到
127.0.0.1:6379> SETBIT sign:10001:202201 1 1
(integer) 1
127.0.0.1:6379> SETBIT sign:10001:202201 2 1
(integer) 0
127.0.0.1:6379> SETBIT sign:10001:202201 5 1
(integer) 0
# 统计2022年1月签到情况
127.0.0.1:6379> BITCOUNT sign:10001:202201
(integer) 3
# 查看2022年1月某天签到情况
127.0.0.1:6379> GETBIT sign:10001:202201 5
(integer) 1
127.0.0.1:6379> GETBIT sign:10001:202201 6
(integer) 0
面试
- 为什么redis字符串存储小于等于44字节时,是embstr类型,而超过44是raw类型?
每个KEY和VALUE都是redisObject对象类型,redisObject占用16个字节; sdshdr8占用3+X+1个字节(后面加1是因为char buf[]要预留一个“\0”) redis内存分配器认为 大于64个字节为大字符串;所以留给小字符串的大小为64-16-3-1=44个字节