使用io多路复用模型。(io多路复用模型利用select,poll和epoll来监听多个io流事件,从而让单个线程来处理多个连接请求)
Redis是基于内存的操作,cpu不是redis的瓶颈,redis的瓶颈要么是内存大小要么是网络带宽。多线程的时候线程切换会消耗cpu的性能,并且多线程会导致数据不一致问题,需要加锁,从而造成性能消耗。
Redis进行持久化的时候,系统会fork一个子进程来进行处理。linux使用fork产生的父子进程读时共享,写时复制。例如:一个变量在没有被修改的时候,父子进程访问的是同一份数据。但如果数据被修改后,那么这份数据会被存储两份,父子进程各拥有一份副本。
Redis过期策略
定期删除(每隔100ms随机抽取key来检查和删除)和惰性删除(查找key的时候检查是否过期)
缺点:大量过期的key堆积在内存,导致内存耗尽。
Redis内存淘汰策略
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
1.RDB
RDB默认开启(在配置文件中配置rdb文件位置和触发方式)
触发机制:
save 60 5 (60秒内key刷新5次)执行flush all命令退出redis优点:
适合大规模数据恢复对数据的完整性要求不高缺点:
需要一定时间间隔操作,如果意外宕机,就会丢失最后一次修改的数据fork进程的时候会占用一定的内容空间过程:
2.AOF
优点:
每一次修改都同步,文件完整性更好每秒同步一次,可能会丢失一秒数据从不同步,效率最高缺点:
相对于数据文件来说,aof远远大于rdb,修复速度也比rdb慢aof运行效率比rdb慢,所以默认rdb持久化就是aof哨兵作用:1.通过发送命令,让redis服务器返回运行状态,包括主服务器和从服务器。2.监测master宕机,自动将salve切换成master,然后通过发布订阅模式通过其他服务器,修改配置文件,切换主机。
哨兵集群:一个哨兵可能会出问题,多个哨兵相互监控更稳定。当一定数量的哨兵检测到master宕机,哨兵就会发起投票,进行故障转移,通过发布订阅模式让各个哨兵监控的服务器修改配置文件,切换主机。
优点:1.哨兵集群基于主从复制,主从配置优点都有。2.主从切换,自动故障转移,系统高可用。
缺点:1.redis不好在线扩容。2.哨兵模式配置很麻烦。
Redis缓存存在的问题:
缓存穿透(redis内存没有,mysql数据库也没有)
布隆过滤器(布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层进行校验,不符合规则丢弃)采用二进制数组,将可能的参数以多次hash形式存储,然后查询时搜索二进制数组是否都为1,如果是则可能存在。缓存空对象(返回的空对象缓存起来,同时设置一个过期时间)[1.空值被缓存,意味着需要更多的空间存储更多的键2.空值设置过期时间,会导致缓存和存储层的数据在一段时间内数据不一致]缓存雪崩(某个时间段,缓存集中过期,redis宕机)
redis高可用限流降级(rocketmq)数据预热缓存击穿(量太大,缓存过期)
设置热点数据永不过期分布式锁(保证每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限