当前位置: 首页 > news >正文

孝感织云网站建设官方网站娱乐游戏城

孝感织云网站建设,官方网站娱乐游戏城,wordpress图片外链转内链,有什么交易网站源码缓存击穿问题也叫热点Key问题#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案… 缓存击穿问题也叫热点Key问题就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io)  目录 解决方案 互斥锁 实现 逻辑过期  实现 解决方案 互斥锁 实现 需求修改根据id查询商铺的业务基于互斥锁方式来解决缓存击穿问题 操作锁的代码 核心思路就是利用redis的setnx方法来表示获取锁如果redis没有这个key则插入成功返回1如果已经存在这个key则插入失败返回0。在StringRedisTemplate中返回true/false我们可以根据返回值来判断是否有线程成功获取到了锁 ShopServiceImpl public Shop queryWithMutex(Long id) {//先从Redis中查这里的常量值是固定的前缀 店铺idString shopJson stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY id);//如果不为空查询到了则转为Shop类型直接返回if (StrUtil.isNotBlank(shopJson)) {Shop shop JSONUtil.toBean(shopJson, Shop.class);return shop;}if (shopJson ! null) {return null;}Shop shop null;try {//否则去数据库中查boolean flag tryLock(LOCK_SHOP_KEY id);if (!flag) {Thread.sleep(50);return queryWithMutex(id);}//查不到则将空值写入Redisshop getById(id);if (shop null) {stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY id, , CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}//查到了则转为json字符串String jsonStr JSONUtil.toJsonStr(shop);//并存入redis设置TTLstringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY id, jsonStr, CACHE_SHOP_TTL, TimeUnit.MINUTES);//最终把查询到的商户信息返回给前端} catch (InterruptedException e) {throw new RuntimeException(e);} finally {unLock(LOCK_SHOP_KEY id);}return shop;} // 尝试获取锁private boolean tryLock(String key){Boolean flag stringRedisTemplate.opsForValue().setIfAbsent(key, 1, 10, TimeUnit.SECONDS);return BooleanUtil.isTrue(flag);}// 释放锁private void unLock(String key){stringRedisTemplate.delete(key);} 逻辑过期  直接在redis中设计一个永久的热点key当发现逻辑时间已过期则采用类似互斥锁方式解决缓存击穿  实现 需求根据id查询商铺的业务基于逻辑过期方式来解决缓存击穿问题思路分析当用户开始查询redis时判断是否命中 如果没有命中则直接返回空数据不查询数据库如果命中则将value取出判断value中的过期时间是否满足 如果没有过期则直接返回redis中的数据如果过期则在开启独立线程后直接返回之前的数据独立线程去重构数据重构完成后再释放互斥锁 封装数据因为现在redis中存储的数据的value需要带上过期时间此时要么你去修改原来的实体类要么新建一个类包含原有的数据和过期时间 步骤一这里我们选择新建一个实体类包含原有数据(用万能的Object)和过期时间这样对原有的代码没有侵入性 Data public class RedisDataT {private LocalDateTime expireTime;private T data; } 步骤二在ShopServiceImpl中新增方法 public void saveShop2Redis(Long id, Long expirSeconds) {Shop shop getById(id);RedisData redisData new RedisData();redisData.setData(shop);redisData.setExpireTime(LocalDateTime.now().plusSeconds(expirSeconds));stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY id, JSONUtil.toJsonStr(redisData)); } 步骤三正式代码 正式代码我们就直接照着流程图写就好了 //这里需要声明一个线程池因为下面我们需要新建一个现成来完成重构缓存 private static final ExecutorService CACHE_REBUILD_EXECUTOR Executors.newFixedThreadPool(10);Override public Shop queryWithLogicalExpire(Long id) {//1. 从redis中查询商铺缓存String json stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY id);//2. 如果未命中则返回空if (StrUtil.isBlank(json)) {return null;}//3. 命中将json反序列化为对象RedisData redisData JSONUtil.toBean(json, RedisData.class);//3.1 将data转为Shop对象JSONObject shopJson (JSONObject) redisData.getData();Shop shop JSONUtil.toBean(shopJson, Shop.class);//3.2 获取过期时间LocalDateTime expireTime redisData.getExpireTime();//4. 判断是否过期if (LocalDateTime.now().isBefore(expireTime)) {//5. 未过期直接返回商铺信息return shop;}//6. 过期尝试获取互斥锁boolean flag tryLock(LOCK_SHOP_KEY id);//7. 获取到了锁if (flag) {//8. 开启独立线程CACHE_REBUILD_EXECUTOR.submit(() - {try {this.saveShop2Redis(id, LOCK_SHOP_TTL);} catch (Exception e) {throw new RuntimeException(e);} finally {unlock(LOCK_SHOP_KEY id);}});//9. 直接返回商铺信息return shop;}//10. 未获取到锁直接返回商铺信息return shop; }
http://www.w-s-a.com/news/596149/

相关文章:

  • 企业网站制作运营彩虹云主机官网
  • 如何建设废品网站如何在阿里云云服务器上搭建网站
  • 如何建立网站后台程序wordpress 后台管理
  • 山东外贸网站建设怎么样wordpress首页左图右文
  • 志丹网站建设wordpress 形式修改
  • 南通seo网站推广费用网站建设就业前景
  • 自适应网站做mip改造浏览器广告投放
  • 网站meta网页描述网站的推广费用
  • 偃师市住房和城乡建设局网站网站个人主页怎么做
  • 做网站要实名认证吗wordpress去掉仪表盘
  • 在哪做网站好Python建网站的步骤
  • 卢松松的网站办公室设计布局
  • 住房城乡建设干部学院网站织梦网站0day漏洞
  • 企业网站seo优帮云手机桌面布局设计软件
  • 无证做音频网站违法吗智能建站加盟电话
  • 鹿泉专业网站建设做网站为什么要建站点
  • 加强网站建设和维护工作新闻大全
  • 红鱼洞水库建设管理局网站左右左布局网站建设
  • 手机网站建设地址做网站公
  • 贵州建设厅网站首页网络公司除了做网站
  • 运动鞋建设网站前的市场分析wordpress 搜索框代码
  • app开发网站开发教程平台网站开发的税率
  • 百度网站优化排名加强服务保障满足群众急需i
  • 宁夏建设职业技术学院网站安徽网站优化建设
  • 四川关于工程建设网站硬盘做网站空间
  • 桂林网站制作培训学校外包seo公司
  • 莱州网站建设方案北京装修公司口碑
  • 大型网站建设济南兴田德润团队怎么样韩国女足出线了吗
  • 南通做网站找谁重庆网络推广网站推广
  • ps网站主页按钮怎么做怎样做网站的用户分析