Redis
Redis十大数据类型
命令手册 :https://redis.com.cn/commands.html
string
string是redis中最基本的数据类型,一个redis中字符出value最多可以是512M

list
底层是双端链表,最多可以包含2^32-1个元素

hash
每个hash最多可以存储2^32-1个元素

set
每个set最多可以存储2^32-1个元素

zset
- 和zset一样都是string类型的几个,且不允许重复,不同的是每个元素都会关联一个double类型的分数(score),redis正是通过分数来为集合中的成员进行从小到大的排序
- zset成员唯一,但是分数(score)可以重复
- zset集合是通过哈希表实现的,所以添加、删除、查找的复杂度是O(1),最大可以存储2^32-1个元素
- 其底层由压缩表和跳表组成

GEO

HyperLogLog
- 再输入元素的数量或者体积非常大时,计算技术所需的空间总是固定的,并且时很小的
- 再redis中,每个HyperLogLog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数
- 只会根据输入元素来计算基数,不会存储输入元素本身
- 是去重复后的真实个数
- 但是有 0.81% 的误差,因为使用的哈希算法必然会有概率发生冲突
- 其底层实现依然是string类型

UV:独立访客,一般理解为客户端ip
bitmap
- 由0和1组成的二进制位的bit数组,只记录0和1
- 用string类型作为底层数据结构实现的一种统计二值状态的数据结构
- bitmap支持最大的位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿(就是2的32次方)的字节信息
setbit 键 偏移位 0或者1(只能)
getbit 键 偏移量
strlen 键
bitcount 键
bitop and destkey key [key...]对一个或者多个key求逻辑并,并将结果保存到destkey
bitop or destkey key [key...]对一个或者多个key求逻辑或,并将结果保存到destkey
bitop xor destkey key [key...]对一个或者多个key求逻辑异或,并将结果保存到destkey
bitop not destkey key [key...]对给定key求逻辑菲,并将结果保存到destkey
bitfield
Stream
Redis持久化
RDB (Redis Database)
- RDB持久性以指定的时间间隔执行数据集的时间点快照
- 文件名 dump.rdb
- 全量快照
- 默认配置文件中配置的是
save 900 1
、 save 300 10
、save 60 10000
分别表示15分钟有一个修改、5分钟有10次修改、一分钟有10000次修改时,保存一次rdb快照 - 手动生成rdb命令save和bgsave(默认),使用save会阻塞redis主线程、bgsave是异步执行
- RDB在内存中的加载速度比AOF快,但是RDB及时性不如AOF
- 修复rdb文件:使用redis-check-rdb工具
- 会触发rdb的情况:1、配置文件中快照配置;2、手动bgsave;3、执行flushall/flushab命令但是里面是空的;4、执行shutdown且没有开启AOF持久化时;5、主从复制时,主节点自动触发
- 配置文件里设置
save " "
表示禁用RDB
AOF(Append Only File)
- 以日志的形式记录每个写操作
- 默认没开,配置文件
appendonly yes
开启 - 文件名 appendonly.aof
- AOF缓冲区会根据同步文件的三种写回策略(Always(立刻回写)、everysec(每秒回写)、no(操作系统控制))将命令写入磁盘上的AOF文件,配置文件
appendfsync everysec
- AOF会将越来越大的命令进行重写,合并命令,手动合并命令bgrewriteaof
- 修复aof文件:使用redis-check-aof工具
- 文件大、aof比rdb慢
混合模式
- 设置aof-use-rdb-preamble的值为yes,开始混合模式
- rdb全量,aof增量
Redis事务

- 一次执行多个命令,按顺序的串行化执行而不会被其他命令插入
- 不保证原子性,也就是不保证所有命令同时成功或者失败
Redis管道
问题:如何优化频繁命令往返造成的性能瓶颈?
管道解释:一次性发送多条命令给服务端,服务端依次处理完毕后通过一条响应一次性将结果返回,减少通信次数降低往返花费的时间
cat cmd.txt | redis-cli -a 密码 --pipe
Redis发布订阅
略,功能参考mq
Redis复制(主从)
Redis哨兵

- 哨兵监控后台master主机是否故障,如果故障了根据投票数自动将某个从库转为主库
- 主观下线:单个哨兵自己主观检查到master的状态没有收到回复
- 客观下线:多个哨兵认为下线,法定人数/法定票数
- 选举出兵王(Raft算法),由兵王切换master
Redis集群

- 有多个master,读写分离
- Cluster自带Sentinel的故障转移机制,内置高可用,无需哨兵功能
- 槽位slot复制分配各个物理服务节点,集群分配了16384个槽位,通过算法
CRC16(key) mod 16384
计算存入key的槽位在哪
Redis单线程 VS 多线程
单线程为什么快
- 基于内存、数据结构专门设计大部分时间复杂度都是0(1)
- redis性能瓶颈不在cpu,而是在于io和网络,故使用IO多路复用监听多个socket连接客户端
- redis工作线程是单线程,持久化、异步删除、集群数据同步时由额外的线程执行的
BigKey相关问题
redis里禁用命令配置
rename-command 命令名字 ""
MoreKey(读取大量key)
SCAN 用于迭代当前数据库中数据键
SSCAN 用于迭代集合
HSCAN用于迭代哈希键中的键值对
ZSCAN用于迭代有序集合中的元素(包括元素成员和元素分值)
大key问题
- value控制在10kb以内,hash、list、set、zset元素不要超过5000个
- 非字符串的bigkey不要使用del删除,使用上述SCAN方式渐进式删除,同时要方式bigkey过期时间自动删除
- 如何发现bigkey:1、redis-cli --bigkeys;2、MEMORY USAGE 键
- 如何删除:string使用unlink删除,其他类型使用对应的SCAN命令渐进式删除
缓存双写一致性问题
- 保证的是数据的最终一致性
- 使用canal同步更新redis
- 延迟双删
- 更新redis过程加锁
分布式锁
- 分布式锁的特性:独占性、高可用、防死锁、不乱抢、重入性
- setnx
- redisson框架中看门狗机制
缓存过期淘汰策略
redis内存配置
- 在redis配置文件中 maxmemory 0 表示机器有多少就占用多少
内存淘汰
- key过期后不是立即删除,而是惰性删除,下次访问后发现过期了就删除这个key,开启惰性删除lazyfree-lazy-eviction=yes
淘汰算法