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

做网站的软件有哪些建设局查询网站首页

做网站的软件有哪些,建设局查询网站首页,农药化肥网站建设,公司网站功能缓存击穿(热点key): 部分key(被高并发访问且缓存重建业务复杂的)失效,无数请求会直接到数据库,造成巨大压力 1.互斥锁:可以保证强一致性 线程一:未命中之后,获取互斥锁,再查询数据库重建缓存,写…

缓存击穿(热点key): 部分key(被高并发访问且缓存重建业务复杂的)失效,无数请求会直接到数据库,造成巨大压力

1.互斥锁:可以保证强一致性

      线程一:未命中之后,获取互斥锁,再查询数据库重建缓存,写入缓存,释放锁

      线程二:查询未命中,未获得锁(已由线程一获得),等待一会,缓存命中

互斥锁实现方式:redis中setnx key value:改变对应key的value,仅当value不存在时执行,以此来实现互斥锁,防止出现锁得不到释放,设置有效期

public Shop queryWithMutex(Long id) throws InterruptedException {Shop shop;//实现互斥锁,解决缓存击穿String key=CACHE_SHOP_KEY+id;//1.从redis查询商铺缓存String shopJson=stringRedisTemplate.opsForValue().get(key);//2.判断是否存在,isNotBlank("")也为falseif(StrUtil.isNotBlank(shopJson)){//3.存在,返回商铺对象return JSONUtil.toBean(shopJson,Shop.class);}//判断命中的是否为空值if(shopJson != null && shopJson.isEmpty()){return null;}//4.实现缓存重建String lockKey=LOCK_SHOP_KEY+id;//4.1.获取互斥锁boolean isLock=tryLock("lockKey");//4.2.判断互斥锁是否成功if(!isLock){//4.3.未成功,等待Thread.sleep(50);//递归shop=queryWithMutex(id);}else{//4.4.成功,从mysql数据库中查询shop=getById(id);//5.判断是否存在if(shop==null){//缓存空值,处理缓存穿透stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);return null;}//6.存在,向redis中缓存店铺数据stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),LOGIN_USER_TTL, TimeUnit.MINUTES);//7.释放互斥锁unlock(lockKey);}//8.返回return shop;}

2.逻辑过期:

      不存TTL,添加上逻辑过期时间,判断逻辑上有没有过期,以此来更新数据

      线程一:查询缓存,逻辑已过期,获取互斥锁,开启新线程,返回过期数据

               新线程:查询数据库并重建缓存,重置逻辑过期时间,释放锁

      线程二:查询未命中,未获得锁(已由线程一获得),返回过期数据

 private boolean tryLock(String key){//尝试获得互斥锁Boolean flag=stringRedisTemplate.opsForValue().setIfAbsent("key","1",LOCK_SHOP_TTL,TimeUnit.SECONDS);return BooleanUtil.isTrue(flag);//通过工具类将其转化为基本类型}private void unlock(String key){//删除锁stringRedisTemplate.delete("key");}

实现互斥锁相关的方法

//线程池,有10个线程private static final ExecutorService CACHE_REBUILD_EXECUTOR= Executors.newFixedThreadPool(10);

创建线程池

public Shop queryWithLogicalExpire(Long id) {//实现逻辑过期,解决缓存击穿(不存在缓存穿透问题)String key=CACHE_SHOP_KEY+id;String lockKey=LOCK_SHOP_KEY+id;//1.从redis查询商铺缓存String shopJson=stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if(StrUtil.isBlank(shopJson)){//3.不存在,返回nullreturn null;}//4.存在,判断是否过期//将Json反序列化成RedisDate对象RedisData redisData=JSONUtil.toBean(shopJson,RedisData.class);Shop shop=JSONUtil.toBean((JSONObject)redisData.getData(),Shop.class);//5.过期if(LocalDateTime.now().isAfter(redisData.getExpireTime())){//6.缓存重建//6.1.获取互斥锁boolean isLock=tryLock(lockKey);//6.2.获取成功if(isLock){//开启新线程CACHE_REBUILD_EXECUTOR.submit(()->{try {saveShopToRedis(id, 20L);}catch(Exception e){throw new RuntimeException(e);}finally {//释放锁unlock(lockKey);}});}//6.3.获取失败return shop;}return shop;}

逻辑删除相关方法

http://www.yayakq.cn/news/318999/

相关文章:

  • 企业品牌网站制作微信代运营合作方案
  • 网站建设中 切片指什么开发公司工程部经理述职报告
  • 视频网站主持人什么叫商城网站
  • 怎么查网站备案公司网站一般是怎么做
  • 具有价值的网站建设平台中国政务网站建设绩效评估
  • 站群网站和做seo那个号做网站开发找哪家公司
  • 美食网站设计的基本思路jsp做的网站效果
  • 哈尔滨快速建站案例seo sem培训
  • 个人网站不备案做经营性质网站建设部继续教育网站
  • 科技网站建设的调研如何在网上建立自己的网站
  • 江苏省建筑网站网站主机服务器
  • 深圳专门网站制作惠安网站建设费用
  • html5做静态网站网络建站培训
  • 网址查询网站莲湖免费做网站
  • 绥芬河网站建设做网站用宋体有版权问题吗
  • 阿里巴巴国际站每年的基础费用是国内知名设计工作室
  • 网站页面格式网页设计难学吗有技术含量吗
  • 通州区网站制作免费搭建自己的网站
  • 做直播网站需要什么资质网站开发环境的安装说明
  • 榆林网站建设电话抖音广告投放收费标准
  • 野外美食网站设计欣赏微网站建设哪家强
  • 宁波做亚马逊网站江门网页设计培训价格
  • 资料下载网站建设常州门户网站建设
  • 新加坡的网站域名做网站需要什么样的服务器
  • 网站建设软件有哪些上海整站优化公司
  • 手机网站整站源码下载厦门网站建设培训
  • php做的购物网站代码药企做网站需要哪些手续
  • 求个没封的a站2022东台做网站公司
  • 英文网站建设华容网站
  • 沧州营销型网站建设建站教程流程图