山东省品牌专业群建设网站,网站开发后端是什么,浙江华企做的网站怎么样,wordpress 不能拖动了目录
一、Redis缓存
二、Redis使用缓存遇到的问题
2.1 数据一致性
2.2缓存雪崩
2.3 缓存穿透
2.4 缓存击穿 一、Redis缓存 数据缓存是Redis最重要的一个场景#xff0c;为缓存而生#xff0c;在springboot中#xff0c;一般有两种使用方式#xff1a; 直接通过RedisT…目录
一、Redis缓存
二、Redis使用缓存遇到的问题
2.1 数据一致性
2.2缓存雪崩
2.3 缓存穿透
2.4 缓存击穿 一、Redis缓存 数据缓存是Redis最重要的一个场景为缓存而生在springboot中一般有两种使用方式 直接通过RedisTemplate使用 通过Spring Cache集成Redis(也就是注解的方式) 二、Redis使用缓存遇到的问题 2.1 数据一致性 在分布式环境下缓存和数据库很容易出现数据一致性问题如果项目对缓存的要求是强一致性那就不要使用缓存。 我们只能在项目中使用策略降低缓存与数据库一致性的概率是无法保障两者的强一致性一般策略包括缓存更新机制更新数据库后及时更新缓存、缓存失败时增加重试机制 2.2缓存雪崩 在了解雪崩溃之前我们先了解什么是缓存雪崩现象假设A系统每秒需要处理5000个请求但数据库每秒只能处理4000个请求某一天缓存机器出现了宕机挂了这时候所有的请求一下子全部落在数据库上数据库肯定扛不住报警挂掉了这时候如果没有采取缓存设施数据库又急着用重新重启数据库刚重启完成(有可能没启动完)请求又来数据库立马挂掉。这就是雪崩事件是Redis缓存中最致命问题之一(有一个是穿透)。大家可以看看下图 出现雪崩事件后不要急不要慌我们可以在事故前中后三个方面来思考解决方案 事故前redis高可用方案主从哨兵集群方案避免全盘崩溃 事故中较少数据库的压力本地Ehcache缓存限流及降级避免超过数据库承受压力 事故后做redis持久化一旦Redis重启可从磁盘中快速恢复数据 我们来看看改造后的数据流程假设用户A发送一个请求系统先请求本地Ehcache是否有数据如果没有再去Redis请求数据如果没有再去数据库请求数据获取到数据后同步到Ehcache和redis 限流组件的作用可以设置每秒请求数次有多少通过请求剩余的未通过的可以走降级处理返回一些默认的值或者友情提示等默认操作。具体流程可以看看下图 这样做的好处是: 数据库安全在限流组件可用的情况下数据库不会挂掉限流根据确保了每秒多少请求能通过。 部分请求可以被处理数据库没挂就意味着至少2/5的请求可以被处理掉 高峰时期部分请求无法处理到需要用户多次点击因为只有2/5的请求被处理剩下的请求用户刷不出来界面需要多点击几次 redis设置的缓存失效时间不是设置成同一个时间可根据功能、业务、请求接口灵活设置缓存时间setRediskey, value, timeMath.random()*10000; 2.3 缓存穿透 缓存穿透是指缓存和数据库中都没有的数据用户(黑客)不断发起请求导致请求直接查询数据库这种恶意行为攻击场景的会直接导致数据库挂掉数据流程如下图所示 image 处理这种情况相对比较简单点这种情况是绕过redis或本地缓存直接到达数据库可以采取以下方案 在请求接口层可以做一些校验比如用户签权、参数校验不合法的请求直接return 还可以针对有效id做认证或直接拦截不符合的id直接过滤或采用统一key保存到redis下次不合法的id请求时直接到缓存中获取数据 采用redis的高级接口Bloom Filter利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在不存在你 return 就好了存在你就去查 DB 刷新 KV 再 return 2.4 缓存击穿 上面讲的穿透是针对大面积数据请求那么击穿是针对一点(一个key)来导致redis异常但某个key是非常热点请求非常频繁处于集中式访问现象当这个key失效(过期)时大量的请求就会击穿了缓存直接请求数据库就像在屏障中凿开了一个洞。 不同场景下缓存击穿解决方案 数据基本不变热点数据value基本不更新时可以设置成永不过期 数据更新不频繁缓存刷新流程耗时较少时可采用redis、zookeeper等分布式中间件的分布式互斥锁或者本地互斥锁保证少量的请求能请求到数据库并重新更新缓存其他的流程等锁释放后才可以访问新缓存 数据更新频繁采用定时线程在缓存过期前主动重新构建缓存或延长过期时间保证所有的请求能一直访问缓存