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

长春建站宣传手淘网站建设需求分析

长春建站宣传,手淘网站建设需求分析,做网站哪里找,东莞电商网站建设#x1f44f;作者简介#xff1a;大家好#xff0c;我是爱发博客的嗯哼#xff0c;爱好Java的小菜鸟 #x1f525;如果感觉博主的文章还不错的话#xff0c;请#x1f44d;三连支持#x1f44d;一下博主哦 #x1f4dd;社区论坛#xff1a;希望大家能加入社区共同进步… 作者简介大家好我是爱发博客的嗯哼爱好Java的小菜鸟 如果感觉博主的文章还不错的话请三连支持一下博主哦 社区论坛希望大家能加入社区共同进步 ‍个人博客智慧笔记 系列专栏Redis 文章目录 前言一、问题前引二、缓存穿透1. 问题描述2. 问题解决2.1 缓存空数据2.2 布隆过滤器 三、缓存击穿1. 问题描述2. 问题解决2.1 设置逻辑过期2.2 设置互斥锁 四、缓存雪崩1. 问题描述2. 问题解决2.1 设置随机过期时间2.2 缓存高可用 总结结语 前言 一聊到redis必不可少的就是缓存三兄弟的问题即缓存穿透、缓存击穿和缓存雪崩这三个问题在业务场景中相对来说比较常见的也是比较基础的三种问题。那么这三种问题是如何引起的并且应该如何解决就是本章探讨的话题。 一、问题前引 大家都知道Redis一般搭配MySQL来使用来充当缓存处理一些业务数据。但为什么要Redis用来充当缓存呢不能直接使用MySQL吗 当然是可以的但是对于一些请求量大并发次数高的场景就有问题了。 MySQL是基于磁盘的请求查询速度偏慢所以就需要一个基于内存的速度快的工具来缓存这些数据Redis就应运而生了。而且当大量请求到来时只有MySQL的话有可能承受不住大量请求导致MySQL宕机此时就会影响到整个服务器所以Redis此时又充当了一个保护缓冲的作用。 二、缓存穿透 1. 问题描述 缓存穿透主要体现在穿透两个字上穿透即为穿过缓存打到数据库上。 当一个请求访问的时候此时Redis没有缓存该数据然后去数据库查询该数据也查询到说明没有该数据。 此时你或许还不以为然不就一个空数据吗多稀罕啊。 但如果该请求是恶意请求此时无数条请求同时访问缓存中没有全部都会打在数据库上刚好还是类似于 select * from table where name 李白表中有1000万条数据name字段也没有创建索引。这时候问题是不是就大了服务器稍微差一点就会直接宕机。 这时你或许该问了那该如何解决呢不要急机智的程序猿肯定有应对之法。 2. 问题解决 2.1 缓存空数据 如果此时将请求的数据缓存起来是不是就可以避免请求打到数据库了 你现在或许又要问了空数据怎么缓存呢没错就是缓存空数据。 如果请求的数据查询数据为空的话就将该数据为空值缓存到Redis中以后每次请求都直接访问Redis查询到该数据直接返回空值。这样就避免恶意请求全部打到数据库了。 2.2 布隆过滤器 不了解布隆过滤器的同学可以看这篇文章硬核 | Redis 布隆Bloom Filter过滤器原理与实战 布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出它是一种 space efficient 的概率型数据结构用于判断一个元素是否在集合中。 当布隆过滤器说某个数据存在时这个数据可能不存在当布隆过滤器说某个数据不存在时那么这个数据一定不存在。 哈希表也能用于判断元素是否在集合中但是布隆过滤器只需要哈希表的 1/8 或 1/4 的空间复杂度就能完成同样的问题。 布隆过滤器可以插入元素但不可以删除已有元素。 其中的元素越多false positive rate(误报率)越大但是 false negative (漏报)是不可能的。 布隆过滤器原理 BloomFilter 的算法是首先分配一块内存空间做 bit 数组数组的 bit 位初始值全部设为 0。 加入元素时采用 k 个相互独立的 Hash 函数计算然后将元素 Hash 映射的 K 个位置全部设置为 1。 检测 key 是否存在仍然用这 k 个 Hash 函数计算出 k 个位置如果位置全部为 1则表明 key 存在否则不存在。 如下图所示 三、缓存击穿 1. 问题描述 缓存击穿一般常见于电商场景在双十一和六一八这种大促活动中缓存中会缓存一些热点数据随时都有大量的请求访问这个数据。 当某个时刻这个数据突然过期大量请求就会集中打到MySQL数据库中。 如何解决这个问题呢 2. 问题解决 该问题导致的原因是因为该缓存数据过期了但却有大量请求访问该数据 有两条思路去解决 不让该数据过期不让大量请求访问数据库 2.1 设置逻辑过期 热点数据随时都会有变化不设置过期时间的话会导致更多问题不能因此失彼。 但可以换一个思路在数据过期时无缝衔接一个新数据在请求看来这就是没有过期时间的一个数据。 此时如果大量请求访问该数据刚好该数据缓存逻辑过期但没有设置物理过期时间所以数据并不会被redis清除。 此时由业务代码去判断该缓存是否过期如果过期则获取互斥锁新建一个子线程去访问数据库重新设置缓存主线程返回过期数据没有获取互斥锁的都返回过期数据。 完整代码如下 //逻辑过期public Shop queryWithLogicalExpire(Long id) {String key CACHE_SHOP_KEY id;//1.从redis查询商铺缓存String shopJson stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if (StrUtil.isBlank(shopJson)) {//3.未命中return null;}//4.命中需要先把json反序列化为对象RedisData redisData JSONUtil.toBean(shopJson, RedisData.class);Shop shop (Shop) redisData.getData();LocalDateTime expireTime redisData.getExpireTime();//5.判断是否过期if (expireTime.isAfter(LocalDateTime.now())) {//5.1还未过期return shop;}//5.2已经过期需要缓存重建//6.缓存重建//6.1获取互斥锁String lockKey LOCK_SHOP_KEY id;boolean isLock tryLock(lockKey);//6.2判断是否获取锁成功if (isLock) {// 6.3成功开启独立线程实现缓存重建CACHE_REBUILD_EXECUTOR.submit(() - {try {//重建缓存this.saveShop2Redis(id, 20L);} catch (Exception e) {e.printStackTrace();} finally {//释放锁unlock(lockKey);}});}//6.4返回过期的店铺信息//7.返回return shop;} 2.2 设置互斥锁 怎么才能不让大量数据去访问数据库呢 或许大家已经想到了上面设置逻辑过期用到过的一个功能互斥锁。 请求首先访问缓存如果命中的话直接返回该数据。 如果未命中的话则去获取互斥锁获取成功则查询数据库重新设置缓存获取失败则重试获取缓存数据。 完整代码如下 /*** 通过互斥锁机制查询商铺信息* param key*/private Shop queryShopWithMutex(String key, String cityCode) {Shop shop null;// 1.查询缓存String shopJson stringRedisTemplate.opsForValue().get(key);// 2.判断缓存是否有数据if (StringUtils.isNotBlank(shopJson)) {// 3.有,则返回shop JSONObject.parseObject(shopJson, Shop.class);return shop;}// 4.无,则获取互斥锁String lockKey RedisConstants.LOCK_SHOP_KEY shopCode;Boolean isLock tryLock(lockKey);// 5.判断获取锁是否成功try {if (!isLock) {// 6.获取失败, 休眠并重试Thread.sleep(100);return queryShopWithMutex(key, shopCode);}// 7.获取成功, 查询数据库shop baseMapper.getByCode(shopCode);// 8.判断数据库是否有数据if (shop null) {// 9.无,则将空数据写入redisstringRedisTemplate.opsForValue().set(key, , RedisConstants.CACHE_NULL_TTL, TimeUnit.MINUTES);return null;}// 10.有,则将数据写入redisstringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(shop), RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (Exception e) {throw new RuntimeException(e);} finally {// 11.释放锁unLock(lockKey);}// 12.返回数据return shop;}关于两种方案各有各的优缺点 逻辑过期 及时性高但数据不是最新数据适合最终一致性的业务互斥锁 一致性高但会有数据延迟适合强一致性的业务 四、缓存雪崩 1. 问题描述 缓存雪崩可以简单的理解为大范围的缓存击穿。 有两个可能引起缓存雪崩问题 有大量的热门缓存同时失效。会导致大量的请求访问数据库。而数据库很有可能因为扛不住压力而直接挂掉。缓存服务器down机了可能是机器硬件问题或者机房网络问题。造成了整个缓存的不可用。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/332236c568114666ae63f7ad3e20ea9e.png 2. 问题解决 2.1 设置随机过期时间 为了解决缓存雪崩问题我们首先要尽量避免缓存同时失效的情况发生。 这就要求我们不要设置相同的过期时间。 可以在设置的过期时间基础上再加个1~60秒的随机数。 实际过期时间 过期时间 1~60秒的随机数 这样即使在高并发的情况下多个请求同时设置过期时间由于有随机数的存在也不会出现太多相同的过期key。 2.2 缓存高可用 针对缓存服务器down机的情况在前期做系统设计时可以做一些高可用架构。 可以使用哨兵机制或者集群模式当一个Redis宕机随时会有一个Redis补充上来避免一个Redis宕机而导致大量请求去访问数据库而使数据库压力过载。 比如使用哨兵模式之后当某个master服务下线时自动将该master下的某个slave服务升级为master服务替代已下线的master服务继续处理请求。 总结 缓存穿透、缓存击穿和缓存雪崩是三种与缓存相关的常见问题它们的概念和影响有所不同。 关于Redis缓存三兄弟的问题及解决主要就是以下几个方面 缓存穿透 缓存穿透指的是对于一个不存在于缓存和数据库中的数据的请求每次请求都会穿过缓存层直接访问数据库。 恶意的攻击者可以通过构造不存在的数据请求导致大量请求直接访问数据库增加数据库负载压力。 解决缓存穿透可以采用存储空数据和合适的校验技术例如使用布隆过滤器等技术在缓存层进行初步过滤避免无效请求直接访问数据库。 缓存击穿 缓存击穿指的是在高并发情况下一个热点数据过期或失效时大量请求同时涌入数据库造成数据库压力激增。 由于热点数据没有命中缓存而直接访问数据库使得缓存无法发挥作用增加了数据库的负载。 解决缓存击穿可以采取设置热点数据永不过期或者使用互斥锁等机制来控制只有一个线程去加载数据。 缓存雪崩 缓存雪崩指的是在某个时间点缓存中的大量数据同时失效或过期或者缓存服务宕机导致大量请求直接访问后端数据库造成数据库压力过大。当缓存中的数据集中过期或失效时没有缓存可用导致大量请求直接访问数据库可能引起数据库负载激增甚至崩溃。解决缓存雪崩可以采用合理的缓存失效时间设置、使用高可用架构等方式来减少缓存失效的风险。 当然能解决的方式有很多这里只是列举出来常见的解决方法。如果有更好的建议可以发在评论区。 结语 每个人都有自己独特的才华和潜能在这个广袤的世界上你的存在是有意义的。无论你是谁你的背景如何你所处的环境怎样只要你敢于跨出舒适区付出努力追求卓越你就能够开创属于自己的辉煌。 我们下期见。 每一次努力都是一次进步即使进展缓慢也要坚持不懈。 往期文章推荐 消息中间件相关面试题Java集合相关面试题Java集合详解微服务相关面试题redis相关面试题图解 Paxos 算法Spring相关面试题Mysql相关面试题
http://www.hkea.cn/news/14432135/

相关文章:

  • 中国六冶的网站谁做的怎么使用模板建设网站
  • 襄阳网站建设企业制作广告
  • 网站建设的市场需求app开发流程 网站开发
  • 鹿泉市建设局网站wordpress搬家 中文图片
  • 网站开发信息文档怎么进入网络管理系统
  • 中国建设建筑教育网站电商培训方案
  • 承德专业做网站的公司网页设计网站开发需要什么软件
  • 协会网站建设计划书阿里巴巴代加工平台
  • 怎么注册公司的网站网站建设与维护 许宝良 课件
  • 佛山网站建设与设计公司长沙推广网络营销公司
  • 焦作建设网站的公司网页源代码快捷键
  • 忻州市住房城乡建设局网站惠州网站开发
  • flex 做网站宝塔面安装wordpress
  • 在线呼叫网页版seo免费视频教程
  • 企业网站优化解决方案如何做电商网站 昆明
  • 南宁网站建设升上去网站分页设计
  • 网上国网app官方下载seo关键词是什么
  • 一个网站如何创建多个页面赤峰网站建设培训
  • 网站推广 方法石家庄有没有销售做被用的网站
  • 新网站建设平台西安做网站的云阔
  • 专业制作网站是什么网站建设的一般流程是怎样的
  • 做购物网站流程充电网站建设方案
  • 襄阳电商网站建设福建省建设工程信息网
  • 购物商城外贸网站建设网站建设全攻略
  • 小米手机做网站服务器吗关于建设网站的图片素材
  • 长沙做最好网站网站防采集 如何采集
  • 中国建设银行内部网站建筑模板的价格一览表
  • 纺织网站建设网页布局实训心得体会
  • 优秀品牌网站案例分析网站平台开发报价表怎么做
  • cdr里做网站超级链接网站代码关键词标题