一、缓存
缓存基于内存的存储的,内存的读写速率比硬盘块,因此可以缓解数据库压力,提升响应速率
后台缓存适用的是对数据一致性不是特别高的业务,web客户端通常缓存如css,js等静态资源,来提高带宽利用率,提升应用用户体验
一般缓存应用场景在读多写少数据 比如热点数据的配置数据或数据字典、用户信息等
具体可根据缓存工具自带提供的功能都可运用 如redis提供了计数器、过期失效,incr、watch等 都是很好的功能
二、缓存雪崩
缓存服务宕机导致所有请求大军直接抵达后台攻城略地导致系统崩溃,处理方法1在缓存上一层限流 2缓存集群
三、缓存穿透
用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,请求都会落到数据库
1、判断如果一个查询返回的数据为空,果发现为空,设置个默认值,也缓存起来
2、布隆过滤器 将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,避免了对底层存储系统的查询压力
四、redis布隆过滤器
布隆过滤器一种bitmap数据结构,是由一串很长的二进制向量组成,初始默认值都是0,能快速的判断某个数据是否在大数据量集合中
向布隆过滤器中添加一个元素key时,我们通过多个hash函数,算出一个值,然后将这个值所在的方格置为1,判断数据是否存在,分别算出各个值,然后看其对应的地方是否都是1
由于hash函数会有可能重复的特性 所以布隆过滤器可以判断某个数据一定不存在,但是无法判断一定存在
五、缓存与数据库数据不一致
多线程高并发的场景下修改数据会有可能导致缓存和数据库数据不一致问题
如写数据时 更新缓存或数据库其中一个环节更新失败则回造成不一致问题
1、可先删除缓存数据 再更新数据库 根据更新数据库结果 再决定是否同步至缓存 即可避免不一致问题
2、读请求只访问缓存,写请求只修改数据库和缓存 (读写分离) 但是写请求更新数据库成功,更新缓存失败 则回滚数据库 之间有时差,
为了解决时差问题,可把写请求放到队列中处理 写请求处理成功,则从队列中删除。当有一个读请求过来时,到队列查询,是否有对应的写请求,如果有则放入队列中,等待写请求执行完之后再执行读请求