定义

动态字符数组
有专门存放长度的成员,无需使用类似C的特定结束符’\0’
二进制安全:可以存储图片、二进制协议等二进制数据

动态扩容

length < 1M 每次*2
length > 1M 每次+1M
最大长度 <= 512M

存储结构

存储结构
int:字符串长度小于等于20且能转成整数
embstr:字符串长度小于等于44
raw:字符串长度大于44

命令

2. 累加器

  1. # 统计阅读量 自动累计加1
  2. 127.0.0.1:6379> INCR reads
  3. (integer) 1
  4. 127.0.0.1:6379> GET reads
  5. "1"
  6. 127.0.0.1:6379> INCR reads
  7. (integer) 2
  8. 127.0.0.1:6379> GET reads
  9. "2"
  10. # 累计加50
  11. 127.0.0.1:6379> INCRBY reads 50
  12. (integer) 52
  13. 127.0.0.1:6379> GET reads
  14. "52"

3. 分布式锁

  1. # 加锁
  2. 127.0.0.1:6379> SETNX lock 1
  3. (integer) 1
  4. 127.0.0.1:6379> GET lock
  5. "1"
  6. # 释放锁
  7. 127.0.0.1:6379> DEL lock
  8. (integer) 1
  9. 127.0.0.1:6379> DEL lock
  10. (integer) 0

4. 位运算

签到打卡

  1. # 实现月签到功能 设置用户10001在2022年1月签到
  2. 127.0.0.1:6379> SETBIT sign:10001:202201 1 1
  3. (integer) 1
  4. 127.0.0.1:6379> SETBIT sign:10001:202201 2 1
  5. (integer) 0
  6. 127.0.0.1:6379> SETBIT sign:10001:202201 5 1
  7. (integer) 0
  8. # 统计2022年1月签到情况
  9. 127.0.0.1:6379> BITCOUNT sign:10001:202201
  10. (integer) 3
  11. # 查看2022年1月某天签到情况
  12. 127.0.0.1:6379> GETBIT sign:10001:202201 5
  13. (integer) 1
  14. 127.0.0.1:6379> GETBIT sign:10001:202201 6
  15. (integer) 0

面试

  1. 为什么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个字节