考题分析redis与缓存题目主要集中在案例分析主要会考察缓存数据一致性缓存与数据库数据操作等相关问题此部分比较重要NoSQLNoSQLNot-only SQL:不仅仅只是SQL泛指非关系型数据库用于解决传统关系型数据库难以应对的大数据、高并发、分布式场景NoSQL分类NoSQL与关系型数据库对比RedisRedis与MemcacheRedis数据类型redis数据类型包括String字符串、Hash字典、List列表、Set集合、Sorted SetZset有序集合其中Zset主要可以用于排行榜场景Redis数据淘汰算法Redis持久化redis持久化有两种方式RDB和AOFRDB借鉴传统数据库中快照的思想指定时间间隔将数据进行快照存储AOF把每条改变数据集的命令追加到AOF文件末尾Redis允许同时启用RDB和AOF持久化这种方式能够兼顾性能和数据安全性AOF 重写时先写 RDB 全量数据再追加增量命令。Redis主从同步初次全量同步从节点发送 PSYNC 命令请求同步主节点 bgsave 生成 RDB 快照同时缓存新的写命令主节点将 RDB 发送给从节点从节点清空数据加载 RDB主节点将缓存的增量命令发送给从节点从节点执行命令完成全量同步后续增量同步主节点每执行一个写命令就异步发送给从节点使用 复制偏移量、复制积压缓冲区、运行 ID 保证同步缓存与数据库同步cache-aside模式读先读缓存缓存命中直接返回缓存miss读取数据库同时放入缓存写先更新数据库再直接删除缓存异步队列同步方案使用kafka等消息队列将数据库更新事件异步传递给Redis进行缓存更新mysql写入后发送更新事件到消息队列消费者从消息队列消费消息从而更新redisBinlog解析同步方案使用canal工具监听mysql的binlog日志将数据库的增删改操作同步到redis缓存常见问题缓存雪崩缓存雪崩是指大量缓存同一时间集体失效比如一批缓存过期时间一样到点全部失效或者redis宕机导致所有请求全部打到数据库数据库压力暴增甚至宕机解决方案过期时间增加随机值开启多级缓存比如本地缓存Redis缓存使用锁或队列保证不会有大量线程同时对数据库进行读写从而避免缓存失效时大量并发请求落到底层数据库缓存穿透缓存穿透是指查询根本不存在的数据即缓存中没有数据库也没有请求每次都穿透到DB解决方案缓存空值针对查询不存在的数据缓存null同时设置较短的过期时间布隆过滤器将所有可能存在的key进行哈希映射查询前先检查布隆过滤器是否key存在如果key不存在则直接返回空结果如果key存在则查询缓存或数据库布隆过滤器是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。优点空间效率和查询时间都比一般的算法要好得多缺点有一定的误识别率和删除困难。缓存击穿缓存击穿是指一个热点key突然过期大量并发请求同时击穿到数据库与雪崩的区别雪崩是大量key击穿是单个热点key解决方案热点key用不过期加互斥锁只允许一个线程去数据库查询并重建缓存