黑龙江省垦区建设协会网站,产品页面设计模板,中国突然宣布一重磅消息,长沙网站建设建1、缓存
1.1、穿透
查询一个空数据#xff0c;mysql也查不到也不会写入缓存可能导致多次请求数据库
方案一#xff1a;缓存设空即可#xff08;可能发生数据不一致就是这条数据有了但此时缓存是空#xff0c;消耗内存#xff09;
方案二#xff1a;布隆过滤器#x…1、缓存
1.1、穿透
查询一个空数据mysql也查不到也不会写入缓存可能导致多次请求数据库
方案一缓存设空即可可能发生数据不一致就是这条数据有了但此时缓存是空消耗内存
方案二布隆过滤器实现复杂容易产生误判 1.2、击穿
一个key缓存过期重建过程中来了大量请求缓存无数据全来到了数据库
方案一互斥锁强一致、性能差、一个线程进来其他线程都得等待 方案二逻辑过期高可用、性能优、不能保证数据一致性 添加逻辑过期expire字段 1.3、雪崩
同一时段大量key失效或redis宕机导致大量请求来到数据库
方案一给不同的key的TTL添加随机值
方案二利用redis集群提高可用性哨兵模式、集群模式
方案三缓存业务添加降级限流策略nginx、gateway
方案四给添加多级缓存Guava或Caffeine
1.4、双写一致mysql数据与redis同步
当修改了数据库的数据同时也要更新缓存的数据缓存要与数据库数据保持一致
读操作缓存命中直接返回、未命中查询数据库写入缓存设置超时时间
写操作延时双删删除缓存–修改数据库–删除缓存双删防止脏数据、延时为了让主从模式把数据同步到从节点延时过程中可能出现脏数据不能保证强一致性
分布式锁强一致性
共享锁读锁readLock加锁过后其他线程共享读操作 排他锁独占锁writeLock加锁过后阻塞其他线程读写操作底层setnx保证同一时刻只能一个线程操作锁住的方法 1.5、持久化
1.5.1、RDB
Redis Database Backup fileredis数据备份文件、数据快照把内存所有数据存到磁盘当redis故障重启后从磁盘快速读取快照文件恢复数据命令1、save2、bgsave子进程redis.config也可设置自动备份策略bgsave 1.5.2、AOF
Append Only File追加文件redis处理的每一个写命令都会记录在AOF文件可以看作命令日志文件AOF默认关闭在redis.config配置文件把appendonly的值改为yes也可修改AOF文件的名称 由于AOF是记录命令文件要比RDB大得多。且AOF会记录同一个key的多次写操作但实际上只有最后一次才有意义。通过bgrewriteaof命令重写。也可在配置文件设置重写阈值。
对比 1.6、数据过期策略
惰性删除该key过期后不管它当需要该key后检查是否过期若过期就删掉反之返回该key对cpu友好对内存不友好存在大量用不到的key一直占内存定期删除每隔一段时间检查一定量的key删除其中过期的keySLOW、FAST
》redis默认两种策略配合使用
1.7、淘汰策略
当redis的内存不够用此时再添加key那么redis会按照某一逻辑将内存中的数据删除掉 面试数据库1000万数据redis只能存20万如何保证redis的数据都是热点数据LRU
2、集群
2.1、主从
主从全量同步 主从增量同步 2.2、哨兵
实现主从集群的自动故障修复监控、恢复、通知
1秒一个ping哨兵选主slave-priority越小优先级越高offset越大优先级越高
脑裂由于网络波动发现ping不了master之后选了个slave作为master这就出现了两个master但client还是向老master写数据老master网络恢复后无新增数据的新master把自个数据同步到老master那么就丢失了此段时间的数据。更改配置文件解决 2.3、分片集群
多个master集群每个master数据不同一个master有多个slavemaster之间通过ping相互心跳检测
解决海量数据存储问题、高并发写的问题
redis分片引入了哈希槽的概念redis集群有16384个哈希槽每个key通过 CRC16 hash校验后对16384取模来决定放置在那个槽集群每个节点负责一部分hash槽 3、分布式锁
本地锁只对本地起作用因为jvm限制
3.1、setnx
添加锁SET lock value NX EX 10过期时间防止死锁业务超时或服务宕机会自动释放锁
释放锁DEL key
控制锁时长1.根据业务执行时间预估不推荐2.给锁续期redisson
3.2、redisson
执行流程新特性重试机制高并发下增加分布式锁的使用性能 基于Lua脚本保证命令执行原子性 可重入跟据线程id判断add1与add2属于同一线程所以add2会获取到锁 利用hash结构记录线程id和重入次数 主从一致性当获取锁业务没结束后突然redis主节点写、改、删数据宕机数据没来得及同步到子节点读数据那么集群默认选出一个子节点当作主节点替换掉宕机的当另一个请求获取锁也是能够获取成功的这样两个线程公用一把锁就丧失了锁的互斥性可能出现脏数据方案RedLock红锁复杂、性能差