1.多级缓存架构
2.缓存设计
3.键值设计
3.1 命令使用
3.2 客户端使用
1.多级缓存架构
目标:让数据尽可能直接返回到前端,而不会击中后端数据库。
主要分为nginx缓存,本地缓存,web层ehcache缓存,redis缓存
2.缓存设计
:缓存层找不到数据,直接到达数据库层。当大量未找到的数据绕过数据库层时,数据库就会崩溃。
解决方案如下:伪代码设计:当缓存找不到时,将缓存到一个value为null并设置过期时间。
第二种解决方案:布隆过滤器,当get如果不存在值时,则不存在值。
:在秒杀场景中,大量数据设置了过期时间。数据过期失效后,大量请求到数据库,导致数据库压力过大。
解决方案:将过期时间设置为随机时间,以减少大量数据故障时的数据库请求。伪代码如下。
:当redis由于异常情况崩溃,大量前端请求直接请求到数据库,导致数据库挂断。异常包括超过redis服务请求范围。
解决方案:
1.保证redis集群高可用
2.使用限流组件,例如sentinel或者hytrix,或者用队列提示前面等了多少人。
3.提前练习,缓存层泵机后,提前做好后端问题预案。
:当一个冷数据在特殊情况下突然变成热数据时,缓存层不能直接向数据库要求太多,导致数据库挂断。
解决方案:使用redis制作一个分布式锁,从数据库中找到数据,并设置过期时间删除分布式锁,以便重建缓存。下次查询前休眠一段时间,获得缓存key值。
:由于时间轴不同,线程更新缓存结果不一致
解决方案:
1.很少有并发数据需要考虑这个问题
2.缓存和过期时间仍然可以解决大量并发数据的业务需求
3. 转型为串行化,但成本太高。
4. 推荐方案加分布式锁,加读写锁
5.阿里开源也可以使用canal通过监听binlog及时修改日志缓存
对于读多写少的场景,基本上可以增加缓存过期时间。建议放弃缓存,直接操作数据库。
3.键值设计
千兆网卡一般除以8张128张左右MB/S
3.1 命令使用
3.2 客户端使用
三个最重要的参数:maxTotoal,maxIdle,minIdle
淘汰算法是根据应用场景选择的。
采用热点数据LFU算法。大多数其他场景使用。LRU算法。