小说网站签约作者应该怎么做,南宁市网络推广公司哪家好,在线长图生成器,网站 建设 场地 资金缓存
缓存穿透
当查询一个不存在的数据#xff0c;mysql查询不到数据#xff0c;无法写入缓存#xff0c;导致每次都请求数据库
解决方法
缓存空数据#xff0c;当查询结果未空#xff0c;将结果进行缓存。 简单但是会消耗内存#xff0c;而且会出现不一致情况。布隆…缓存
缓存穿透
当查询一个不存在的数据mysql查询不到数据无法写入缓存导致每次都请求数据库
解决方法
缓存空数据当查询结果未空将结果进行缓存。 简单但是会消耗内存而且会出现不一致情况。布隆过滤器检索一个元素是否在集合中缓存预热时也要预热过滤器。 内存占用少不会产生多余key但是实现复杂且存在误判情况。
缓存击穿
给key设置了过期时间当该key过期时出现大量针对该key的请求可能会瞬间将数据库压垮。
解决方法
添加互斥锁 强一致性但是性能差逻辑过期 热点key不设置过期时间设置一逻辑过期时间对于逻辑过期的key启用新线程更改数据原线程仍然返回过期数据。
缓存雪崩
同一时间大量key过期或redis服务宕机导致大量请求同时达到数据库。
解决方法
给不同key的TTL添加随机值Redis集群 哨兵模式、集群模式缓存业务添加降级限流机制业务多级缓存
双写一致性
设置前提介绍背景业务
实现方法
高一致性
延迟双删
修改数据库的同时也要更新缓存的数据缓存于数据库保持一致。
读命中直接返回未命中则查询DB将结果写入缓存设定超时时间
写延迟双删依旧存在脏数据风险
Quetion
-先删缓存还是先删数据库 无论先删除哪个都存在不一致性问题
为何要删除两次 防止在修改数据库期间其他线程将旧的结果写入缓存为何延时删除 保证redis集群的主从一致性。
分布式锁 保证缓存和数据库的绝对一致性但是性能低。适用于读多写少的情况。
最终一致性
异步通知保证数据的最终一致性
二进制日志记录binlog中记录所有 DDl数据定义语言和 DML数据操纵语言但不包括查询语言。
Redis持久化
RDB
RDB (Redis Database Backup file, Redis数据备份文件)也叫redis数据快照将数据记录到磁盘中每次redis实列故障重启后都会从磁盘中读取快照回复数据。
备份方式
主动备份
save #主线程备份
bgsave #启用子线程备份内部触发 通过redis.conf文件中修改配置项实现
save 900 1 #900s内有一次修改
save 300 10
save 60 10000RDB执行原理
bgsave开始时通过fork主进程得到子进程。子进程共享fork内部数据完成fork后读取内存写入RDB文件。
fork操作采用copy-on-write技术
当主进执行读操作时访问共享内存当主进程执行写操作时会拷贝一份数据再进行写操作
AOF
AOF(Append Only File, 追加文件)Redis处理的每一个写命令都会被记录再AOF文件中。 默认关闭可以再redis.conf中配置选项。
AOF记录频率
模式频率优点缺点always同步可靠性高几乎不会出现数据丢失现象对性能影响大everysec每秒适中最多丢失1s数据no由操作系统控制最好可靠性差可能丢失大量数据
由于是记录文件会比RDB大很多。AOF会记录对于同一个key的多次写操作但是只有最后一个才有意义。可以使用bgrewriteaof命令来使AOF执行重写操作确保最少的命令达到相同效果。
也可以通过再conf文件中进行配置使系统内部自动触发。
# AOF文件比上次增长百分之多少重写
auto-aof-rewrite-percentage 100
# AOF文件大小超过多少重写
auto-aof-rewrite-min-size 64mbRDB与AOF之间比较
RDBAOF持久化定期对内存进行快照记录每次执行的写操作完整性不完整两次备份之间会存在丢失相对完整取决于刷新策略文件大小小大宕机恢复快慢数据恢复优先级低高系统资源占用高大量CPU和内存消耗低主要为磁盘IO资源但是重写时会占用大量内存资源使用场景可容忍数分钟的数据丢失追求更快的启动速度对数据安全性要求更高
数据过期策略
Redis中设置有效期后的key在数据过期后需要将数据从内存中删除。Redis中有惰性删除和定期删除两种不同的数据过期策略一般二者配合使用。
惰性删除
需要使用某key时检查其是否过期如过期则删除该key反之直接返回该key对应值。
优点CPU友好只有需要使用该key时才会进行过期检查缺点 对内存不友好过期的key如果不被访问会一直存在于内存中永远不会释放。
定期删除
每隔一段时间从一定数量的数据库中随机选择一部分key进行检查并删除过期key。 定期删除有两种模式 SLOW: 定时任务执行频率默认10hz每次不超过25msFAST执行频率不固定但每次间隔不会低于2ms优缺点
优点 限制删除操作的时长和频率减少对CPU影响。定期删除能有效释放过期key占用的内存。缺点 难以确定删除操作花费的时长和频率。
Redis数据淘汰策略
Redis内存不够时接收到新的key按照一定规则删除其中的数据。
8种淘汰策略
noeviction 不淘汰任何key但内存写满时不写入默认模式。volatile-ttl 对设置ttl的keyttl越小越先淘汰allkeys-random 对所有key随机淘汰volatile-random: 对所有设置ttl的key随机淘汰allkeys-lru: 对所有key基于LRU算法淘汰volatile-lru 对所有设置ttl的key按照LRU算法淘汰allkeys-lfu 对所有key基于LFU算法淘汰volatile-lfu 对设置了ttl的key基于LFU算法淘汰。
LRU最近最少使用LFU最少频率使用
使用场所
allkeys-lru 有明显冷热数据区分allkeys-random 无明显冷热数据区分volatile-lru 有置顶需求置顶数据不设过期时间allkeys-lfu / volatile-lfu 有短时高频访问数据
分布式锁
用于集群下定时、抢单功能
setnx
redis中自带命令用于创建不存在的key, 如果key存在返回null
获取锁
set lock value nx ex 10释放锁
del key如何控制有效时长
根据业务执行时间预估给锁续期
如何实现
使用redisson实现分布式锁底层为setnx和lua脚本。通过watchdog和给锁续期的方式来控制时长。
Redisson
实现分布式锁的流程 可重入性质
判断是否是同一个线程同一个线程可重入。利用hash结构记录线程id和重入次数。
主从一致性
不能解决主从一致性问题当主节点宕机后watchdog看门狗会选择一个从节点提升为主节点。
红锁
在不止一个实例上加锁一般加锁实例数量大于等于n/21。可以一定程度上实现主从一致性但是实现复杂并发性差运维复杂。
如果必须要实现主从一致性使用基于CP思想的缓存工具如zookeeper。
Redis集群
主从复制
单节点Redis并发能力有上限要进一步提高Redis并发能力需要搭建组从集群实现读写分离。一般是一主多从主节点负责写数据从节点负责读数据。
原理
全量同步 replid 数据集的标记id一致说明数据集一致offset偏移量。slave的offset小于master的说明slave的数据落后于master需要同步
增量同步
slave重启或者后期数据变化
哨兵机制sentinel
Redis提供哨兵机制来实现主从集群的自动故障恢复。
特点
监控 sentinel不断检查master和slave是否按预期工作自动恢复 如果master节点故障哨兵集群会将一个新的slave节点提升为master节点并在之后一直以该master节点为主通知redis客户端 哨兵充当客户端的服务通知来源当集群发生故障转移时会将最新信息推送道redis客户端。
作用机制 服务状态监控 哨兵基于心跳机制监测服务状态每个1s向集群中的每个实例发送ping命令 判断redis节点下线 主观下线 某个sentinel节点发现某一个实例未在规定时间内进行响应认为该实例主观下线。 客观下线 超过指定数量quorum一般超过哨兵节点数量的一半的哨兵节点都认为某一实例主观下线则认为该实例已经客观下线。 哨兵挑选新主节点规则
1. 判断主节点与从节点断开时间长短排除超过阈值的从节点
2. 判断从节点的slave-priority值值越小优先级越高
3. 如果slave-priority值相同则判断从节点的offset值offset值越大的优先级越高。
4. 在优先级相同的节点中随机选择一个节点。如何解决redis集群脑裂
集群脑裂是由于主节点、从节点和sentinel集群不在同一分区使得sentinel无法通过心跳感知到主节点通过选举提升了一个新的主节点。同时由于旧主节点没有真实下线客户端还在向旧主节点写入数据新主节点无法同步数据。当网络回复后sentinel讲旧的主节点降为从节点再从新主节点中同步数据。这会导致客户端向旧主节点中写入的数据丢失。
解决方法 可以通过修改redis配置文件设置最少从节点数量和主从数据同步要求数据复制和同步的延迟阈值达不到要求就拒绝请求由此避免大量数据的损失。
分片集群
用于解决海量数据存储和高并发写的问题
特点
集群中有多个master每个master节点保存不同数据每个master节点有多个slave节点master节点之间通过ping值监测彼此的健康状态客户端可以向任意节点发送请求最终都会被转发到正确节点
redis分片集群如何读写
引入哈希槽的概念redis集群有16384个哈希槽将16384个插槽分配到不同实例读写数据时利用key的有效部分计算hash对16384取余余数作为插槽最后寻找插槽所属实例。
其它
Redis是单线程的但是为什么速度快
最主要原因是Redis是纯内存操作执行速度快采用单线程避免了不必要的上下文切换可竞争条件使用多路I/O复用模型非阻塞IO。例如bgsave和bgwriteaof都是在后台执行不影响主线程的正常使用不会产生阻塞
I/O多路复用模型
I/O多路复用模型是指利用单个线程来同时监听多个socket并在某个Socket可读、可写时得到通知从而避免了无效的等待充分利用CPU资源。目前的I/O多路复用模型都是通过epoll实现它会在通知用户Socket就绪的同时将已就绪的Socket写入用户空间不需要挨个遍历Socket来判断是否就绪提升了性能。
其中Redis的网络模型就是使用I/O多路复用结合时间的处理器来应对多个Socket的请求比如提供了连接应答处理器、命令回复处理器命令请求处理器在Reids6.0之后为了更好提升性能在命令回复处理器中使用了多线程来处理回复事件在命令请求处理器中将命令的转换使用了多线程增加命令转换速度在命令执行的时候也依然是单线程。