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

公共建设工程中心网站中国有没有开源社区

公共建设工程中心网站,中国有没有开源社区,网络营销推广的核心是什么,注册网站的免费网址comredis的应用 缓存什么是缓存1.为什么不使用本地内存而使用redis当作内存2.常见的缓存策略读策略缓存更新策略主动更新的三种策略旁路缓存#xff08;Cache Aside Pattern#xff09;1.什么是旁路缓存2.如何更新缓存2.在更新缓存和数据库时#xff0c;先更新数据库还是先更新… redis的应用 缓存什么是缓存1.为什么不使用本地内存而使用redis当作内存2.常见的缓存策略读策略缓存更新策略主动更新的三种策略旁路缓存Cache Aside Pattern1.什么是旁路缓存2.如何更新缓存2.在更新缓存和数据库时先更新数据库还是先更新缓存 1.缓存穿透什么是缓存穿透解决方案 2.缓存雪崩什么是缓存雪崩解决方案 3.缓存击穿什么是缓存击穿解决方案 缓存 什么是缓存 数据交换的缓冲区临时存储数据的地方读写性能高。可以减轻数据库的压力降低后端负载提高读写效率降低响应时间。但是同时我们要保持数据一致性也就要付出一定成本。 1.为什么不使用本地内存而使用redis当作内存 保持内存一致性不同服务器上的内存会导致数据不一致服务器内存有限redis性能好服务器宕机导致数据丢失 2.常见的缓存策略 读策略 查询一个数据时先从redis中查找如果命中了直接返回数据要是没有命中就从数剧库中查询数据更新redis缓存。 缓存更新策略 内存淘汰 当redis内存不足时利用redis内存淘汰机制机制自动淘汰部分数据下次查询时跟新缓存。 显然弊端很大数据一致性不能得到保证但是没有维护成本。超时剔出 给缓存数据加上ttl时间到期后自动删除缓存下次查询时更新缓存。 同理数据一致性也能得到很好保证维护成本也不高还有可能导致缓存雪崩。主动更新 自己编写业务逻辑在跟新数据库数据的同时更新缓存。 这样数据一致性可以得到很好的保证但是维护成本很高。选择哪一种缓存更新策略可以看业务需求。如果是低一致性需求例如商铺类型的查询缓存可以使用内存淘汰机制毕竟不怎么改变。高一致性需求就自己主动更新吧。 主动更新的三种策略 旁路缓存Cache Aside Pattern 1.什么是旁路缓存 由缓存的调用者在更新数据库的同时更新缓存 2.如何更新缓存 1.更新缓存 即每次更新数据库时都要跟新缓存中的数据如果进行100次更新这期间没有一次查询这会导致99次更新缓存都是无效的。所以更新缓存会导致多次无效的更新操作。 2.删除缓存更新数据库数据时把缓存中的数据直接删除等到下一次查询在往redis缓存中写入数据这样就避免了许多无效操作。 所以更新缓存就选则第二种 2.在更新缓存和数据库时先更新数据库还是先更新缓存 先更新数据库 更新缓存所需时间远小于更新数据库所以这种发放发生数据不一致的可能性很小 2. 先删除缓存 同上此时a进行更新操作若是先删除了缓存在进行数据库更新因为数据库跟新所需时间长在这期间b进行了查询操作缓存已被删除会从数据库中查询数据并写入缓存导致数据不一致。 所以一般选择第一种 1.缓存穿透 什么是缓存穿透 客户查询的数据在缓存和数据库中都不存在导致每次查询都会访问数据库给数据库带来压力 解决方案 缓存null值 public Shop queryWithPassThrough(Long id){String key cache:shop: id;//使用空值解决缓存击穿问题//1.从redis查询商铺缓存String value stringRedisTemplate.opsForValue().get(key);//2.判断是否存在存在直接返回if(StrUtil.isNotBlank(value)){Shop shop JSONUtil.toBean(value, Shop.class);return shop;}//判断是否存在空值如果时空值直接返回nullif(value ! null){return null;}//没有命中根据id查询数据库Shop shop getById(id);//不存在更新缓存redis防止缓存穿透if(shop null){stringRedisTemplate.opsForValue().set(key,,CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}//存在写入redisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));return shop;}布隆过滤增强id的复杂度加强热点参数校验做好热点参数的限流 2.缓存雪崩 什么是缓存雪崩 缓存中大量数据在同一时间失效、或者redis服务宕机大量请求到达数据库 解决方案 给不同的key的ttl添加随机值利用redis集群提高服务的可用性给缓存业务添加降级限流策略给业务添加多级缓存 3.缓存击穿 什么是缓存击穿 也叫热点key问题一个被高并发访问并且缓存重建业务复杂的key失效了无效的请求访问在瞬间给数据库带来巨大冲击 解决方案 互斥锁 public Shop queryWithMutex(Long id){String key cache:shop: id;String value stringRedisTemplate.opsForValue().get(key);Shop shop null;try {if (StrUtil.isNotBlank(value)) {shop JSONUtil.toBean(value, Shop.class);return shop;}//判断是否存在空值if (value ! null) {return null;}//解决缓存穿透问题//互斥锁解决缓存击穿问题String lockKey lock:shop: id;boolean flag getLock(lockKey);if (!flag) {Thread.sleep(50);queryWithMutex(id);}String shopJson stringRedisTemplate.opsForValue().get(key);if (StrUtil.isNotBlank(shopJson)) {shop JSONUtil.toBean(shopJson, Shop.class);return shop;}shop getById(id);if (shop null) {stringRedisTemplate.opsForValue().set(key, , CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop));} catch (InterruptedException e) {throw new RuntimeException(e);} finally {unLock(key);return shop;}}//获取锁private boolean getLock(String key){Boolean flag stringRedisTemplate.opsForValue().setIfAbsent(key, 1, 10, TimeUnit.SECONDS);return BooleanUtil.isTrue(flag);}//释放锁private void unLock(String key){stringRedisTemplate.delete(key);}设置逻辑过期时间 public static final ExecutorService CACHE_REBUILD_EXECUTOR Executors.newFixedThreadPool(10);public void saveShop2Redis(Long id,Long expireSeconds) throws InterruptedException {Shop shop getById(id);RedisData redisData new RedisData();redisData.setData(shop);redisData.setExpireTime(LocalDateTime.now().plusSeconds(expireSeconds));stringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_KEY id, JSONUtil.toJsonStr(redisData));}public Shop queryWithLogicalExpire(Long id){String key CACHE_SHOP_KEY id;String value stringRedisTemplate.opsForValue().get(key);//未命中返回空if(StrUtil.isBlank(value)){return null;}//命中需要先把json反序列化为对象RedisData redisData JSONUtil.toBean(value, RedisData.class);//判断是否过期LocalDateTime expireTime redisData.getExpireTime();Shop shop JSONUtil.toBean((JSONObject) redisData.getData(), Shop.class);//未过期直接返回if(expireTime.isAfter(LocalDateTime.now())){return shop;}//已过期缓存重建//获取锁String lockKey LOCK_SHOP_KEY id;boolean flag getLock(lockKey);//成功开启独立线程实现缓存重建if(flag){CACHE_REBUILD_EXECUTOR.submit(() - {try {this.saveShop2Redis(id,20l);} catch (InterruptedException e) {throw new RuntimeException(e);}finally {unLock(lockKey);}});}//失败返回过期的商铺信息return shop;}
http://www.hkea.cn/news/14499918/

相关文章:

  • 网站建设工作会议.购物商城类网站备案
  • 上海建设工程安全监理网站重庆智能网站建设
  • 网站建设源代码交付网站开发和游戏开发的区别
  • 网站收录工具培训班网站建设
  • 网站建设课程报告自定义网站建设团队
  • 淘宝网站代理怎么做wordpress 中文 相册插件
  • 久治县网站建设公司电影宣传类网页界面设计
  • 惠州网站策划建设政务网站建设目的_意义
  • 兰州网站定制公司中国建设银行网站 个人
  • 环保业网站建设的策划子网站域名ip地址查询
  • 百度收录正常网站流量下降荆州网络推广
  • 网站开发实习过程淘宝指数查询
  • 网站建设开发公司有哪些ps做游戏下载网站有哪些
  • 酒店网站设计方案wordpress slug
  • 为个人网站做微信服务号网站设计的内容以及步骤
  • 网站建设与网页设计专业的wordpress翻译升级失败
  • 网站建设昆山花桥建筑资料管理规程
  • 非交互式网站可以做商城吗社区团购卖货小程序
  • 酒店品牌设计网站建设有什么网站学做标书的
  • 白山网站seo互联网彩票网站开发
  • 想做一个公司的网站去哪可以做做网站asp
  • 宁波网站搜索引擎优化新开传奇网站刚开
  • 网站广告怎么赚钱上虞建设局网站
  • 昆明高端网站建设沙洋县住房和城乡建设局网站
  • 怎么兼职做网站wordpress arduino
  • 海纳企业网站建设模板织梦网站做瀑布流方便
  • 备案时的网站名称wordpress无法导入xml
  • 外贸网站建设专业定制wordpress抽奖插件
  • 超市网站建设app制作平台推荐
  • 做英文网站的心得成都工程建设信息网站