网盘搜索 网站开发,thinkphp网站开发实战教程,建站之家官网,一个产品营销策划方案一、Bit中不同命令使用的场景 二、什么是缓存击穿#xff0c;缓存穿透#xff0c;缓存雪崩#xff1f;
缓存击穿#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问key#xff0c;瞬间击穿服务器直接访问到数据库#xff0c;使得数据库处于负载情况 缓存穿透…一、Bit中不同命令使用的场景 二、什么是缓存击穿缓存穿透缓存雪崩
缓存击穿是指当某一个key的缓存过期时大并发量的请求同时访问key瞬间击穿服务器直接访问到数据库使得数据库处于负载情况 缓存穿透是指缓存服务器中没有缓存数据数据库中也没用符合条件的数据导致业务系统每次都绕过缓存服务器查询下游的数据库缓存服务器完全失去作用 缓存击穿是只击穿服务器端访问数据库而缓存穿透是服务器端和数据库都没有的情况 缓存雪崩是指当大量缓存同时过期或者缓存服务宕机所有请求都直接访问数据库造成数据高负载影响性能甚至数据库宕机
对于缓存击穿可以用异步加载、互斥锁和提前预热的办法解决
对于缓存穿透的防止常用的是布隆过滤器和黑名单的方式 布隆过滤器是一种比较巧妙的概率性数据结构它可以告诉你数据一定不存在或可能存在相比Map、Set、List等传统的数据结构它占用的内存少、结构更高效
对于缓存雪崩的情况可以设置不同的过期时间和集群的方法实现
三、Redis的集群方式是什么
典型回答
Redis有三种主要的集群模式用于在分布式环境中实现高可用性和数据复制模式主要是主从模式、哨兵模式和Redis Cluster模式
1. 主从模式
主从模式是Redis中最简单的集群模式这个模式主要是为了解决单点故障的问题所以将数据复制多个副本中这样即使有一台服务器出现故障其他服务器依旧可以继续提供服务。
主从模式中主要包括一个主节点和多个从节点主节点负责处理所有读和写操作而从节点则复制主节点的数据并且只处理读操作当主节点出现故障时可以将包含数据较多的从节点升级为主节点实现故障转移但是这个步骤需要手动实现
优点简单明了适用于读多写少的场景 缺点不具备自动转移功能的能力没办法容错和恢复
2.哨兵模式
为了解决主从模式的不能自动容错及恢复的问题Redis引入了一种哨兵模式的集群架构。
哨兵模式是在主从模式的基础上加入了哨兵节点哨兵节点是一种特殊的Redis节点用于监控主节点和从节点的状态。当主节点出现故障时哨兵节点可以自动进行故障转移选择一个包含数据较多的从节点升级为主节点并通知其他节点和应用程序进行更新。
优点解决了主从模式的不能自动转移故障的问题提供了自动化监控和故障恢复机制 缺点虽然可以自动故障转移但是还是不支持自动的数据分区并且随着节点数量的增加管理和配置的复杂性会增大
3.Cluster模式
Redis Cluster模式是Redis中推荐的一种分布式集群解决方案它将数据自动分片到多个节点上每个节点负责一部分数据
优点真正实现了分布式存储每个节点都可以处理读写请求具备良好的水平扩展能力内置数据分割、故障排查、和转移能力 缺点相比于其他模式更加复杂需要更多的网络资源和配置管理客户端需要支持集群特性跨slot的数据操作可能涉及多个节点有一定的复杂度
四、Redis过期键的删除策略
Redis的Key是可以设置过期时间的Redis的key有着两种删除策略1.惰性删除2.定期删除 1. 惰性删除当key过期时先放着不管当每次从键空间中获取key时检查取得的键是否已经过期如果已过期的话就删除该键如果没有过期就返回该键 2.定期删除每隔一段时间就对数据库进行一次扫描检查删除里面的过期键至于要删除多少键检查多少数据库要由算法决定
五、Redis的内存删除策略有哪些
Redis 内存数据集大小上升到一定大小的时候就会施行数据淘汰策略。 Redis提供了8种数据淘汰策略
LRU全称Least recently used, 淘汰的是最近最少被使用的数据项。时间概念 最近最少 LFU全称Least-frequently used,淘汰的是访问频率最低的数据项。 一直最少
默认策略 noeviction 不淘汰数据写不进去返回错误只针对设置过期的keys 1. volatile-lru 根据LRU算法挑选数据淘汰 2. volatile-lfu 根据LFU算法挑选数据淘汰 3. volatile-random 随机挑选数据淘汰 4. volatile-ttl 挑选越早过期的数据进行删除所有keys 1. allkeys-lru 根据LRU算法挑选数据淘汰 2. allkeys-lfu LFU算法挑选数据淘汰 3. allkeys-random 随机挑选数据淘汰
六、阐述Redis的主从同步机制
Redis的主从同步机制是一种特别重要的特性它允许数据从一个Redis主服务器复制到一个或多个从服务器。这种机制不仅可以提高系统的读取性能还可以用于数据备份和高可用架构的设计 主要步骤 第1-4步属于全量第5步属于增量
从服务器向主服务器发送同步命令sync主服务器接收到同步命令后会执行bgsave命令在后台生成一个rdb文件并使用一个缓存区记录从现在开始执行的所有写命令当主服务器执行完bgsave命令后会将生成的rdb文件发送给从服务器从服务器接收到这个rdb文件然后加载到内存之后主服务器会把刚刚在缓存区的命令同步过来从服务器就会执行这些命令以上处理完之后主数据库每执行一个写命令都将写命令发送给从数据库
七、Redis和Mysql数据库数据如何保持一致性
我们在实际项目中经常使用到Redis缓存用来缓解数据库压力但是当更新数据库时我们一般采用延时双删策略。目前常用的做法是查询一个接口先查询Redis如果不存在则查询数据库并将结果放入到Rdis中。
7.1 常见的更新策略
先删缓存再更新数据库先更新数据库再删缓存普通双删延时双删
7.1.1 先删缓存再更新数据库 线程A删除缓存数据此时还没有更新数据库线程B 查询缓存没有数据查询数据库还是旧数据放入缓存线程C以及其他线程使用旧缓存数据缓存和数据库不一致
7.1.2 先更新数据库再删除缓存 线程A更新数据库此时还没有删除缓存线程B以及其他线程此时还是使用的旧缓存数据和数据库不一致
7.1.3 普通双删 线程A先删除缓存再更新数据库然后再删除一次缓存线程B查询缓存时没有数据在线程A更新数据库之前查询到旧数据此时系统时间切换到线程A执行删除缓存然后又到线程B放入缓存旧数据线程C针对线程A查询到缓存没有数据查询数据库的旧数据然后将旧数据放入到缓存中 这些都不能满足缓存和数据一致性
7.1.4 延时双删 线程A先删除缓存之后再更新数据库线程B和线程C查询数据时才发现缓存中没有数据就去查询数据库线程B查询到的是旧数据线程C查询到的是新数据之后都放入到缓存中。线程A延时3-5秒时间一般要大于SQL执行时间线程切换时间后再将缓存删除。之后其他线程再次查询缓存发现没有数据再去查询数据库并且放入缓存都是新数据极端情况下就是如线程D延时时间超过线程A的延时时间后再次将旧数据放入到缓存中这时缓存和数据库的数据还不是一致的所以延时双删也不是一定能够保证缓存和数据保持一致的
7.2 建议的解决方案
当发现缓存没有数据后在执行查询数据库前对该key进行加锁查询数据库并放入缓存后再解锁这样可以避免缓存击穿问题当某个redis数据不存在时大量线程并发查询数据库。在需要执行双删前对该Key进行加锁之后执行删除缓存更新数据库放入新数据到缓存在解锁。保证缓存和数据一致性。加锁的Key都需要设置过期时间避免因为宕机造成死锁。