什么是Redis
Redis 是一种基于内存的数据库。对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
Redis的数据类型
常见五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。后续增加的:BitMap,HyperLogLog,GEO,Stream。
Redis的应用有哪些
缓存、分布式锁、限流、消息队列、延时队列、分布式Session、复杂的业务场景(Bitmap 统计活跃用户、通过 Sorted Set 维护排行榜)。
Redis的持久化
三种:AOF日志、RDB快照、混合持久化。
AOF日志:在执行完一条写操作后,将该命令以追加的方式写到一个文件(磁盘);当Redis重启时,读取该文件,逐一执行命令恢复数据。
RDB快照:记录某一个瞬间的内存数据。
混合持久化:混合持久化工作在 AOF 日志重写过程。AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。
Redis的线程模型
Redis不是单线程的。
Redis集群
主从复制:一主多从模式,将主服务器上的数据同步到多台从Redis服务器上。读写分离:主服务器进行读写操作,写操作时同步到从服务器;从服务器一般只读(或接受主服务器同步过来的写操作)。同步写命令是异步的,无法实现数据的强一致性。
哨兵模式:实现主从节点故障转移。三步:监控、选主节点、通知。
切片集群模式:一个切片集群有16384个哈希槽,数据根据key被映射到哈希槽中,哈希槽被分配到各个节点(平均分配和手动分配)。
脑裂:在主从模式中,网络问题导致主节点断联并持续写入,从节点中选出新的主节点;恢复联系后,原主节点降级并清空本地数据(为了同步新主节点的数据)导致数据丢失。解决办法:断联后拒绝写入。
Redis过期删除
用过期字典保存过期时间。删除策略:惰性删除+定期删除。
惰性删除:不主动删除数据,每次访问key时,查询是否过期,若过期则删除。
定期删除:每个一段时间随机从数据库中取出一定数量的key进行检查,删除其中过期的key。若删除的key超过一定比例(25%)则再来一次(但总操作时长不超过上限)。
持久化时:RDB不保存也不载入过期键;AOF写入时对过期键追加删除命令,AOF重写时不保存过期键。
Redis内存淘汰
不进行数据淘汰:写入报错,其它操作正常。
进行数据淘汰:淘汰设置了过期时间数据:随机、剩余时间最少、LRU(时间)、LFU(次数);从所有数据中淘汰:随机、LRU、LFU。
Redis缓存设计
缓存击穿:热点数据过期了。不过期、提前预热(合理的过期时间)、缓存失效后加锁。
缓存穿透:数据不在缓存也不在数据库中。缓存空值、接口限流、布隆过滤器。
缓存雪崩:大量缓存数据同一时间过期。缓存过期时间打乱、缓存不过期。
Redis实战
延时队列:Zset
大key(value很大):
事务回滚:
分布式锁:setnx命令
共享session:
消息队列:List、Stream(专门为此设计)
点赞、共同关注:Set
排行榜、电话姓名排序:Zset(Sorted Set)
签到打卡、登录状态:Bitmap