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

公司做网站价格新媒体运营师证书

公司做网站价格,新媒体运营师证书,北京比较好的网站开发公司,建网站需要多少钱石家庄一、场景介绍 我们平时做数据缓存的时候,一般套路是在项目启动时,将热点数据加载到缓存中,请求接口时,如果缓存中存在,优先从缓存中获取返回,如果缓存中不存在,才会从数据库中查询并设置到缓存中…

一、场景介绍

        我们平时做数据缓存的时候,一般套路是在项目启动时,将热点数据加载到缓存中,请求接口时,如果缓存中存在,优先从缓存中获取返回,如果缓存中不存在,才会从数据库中查询并设置到缓存中,通过这种方式来提升系统的相应性能、减少数据库访问压力。

        缓存穿透的意思就是,一些恶意请求故意去获取缓存和数据库都不存在的数据,导致每次都会跳过缓存直击数据库,当这种恶意请求数量巨大时,首先会导致其他正常请求无法得到响应,第二是有可导致数据库崩溃导致系统不可用,危害巨大。

二、不合法数据存入redis

        将恶意请求的key存入redis中,等下次同样的请求再次请求时,就可以直接从redis中获取并返回,减少数据库访问压力。

        这是一种好办法,不过既然都是恶意请求了,肯定不可能只发一个缓存和数据库都不存在的key,一定是大量不重复的请求数据,这就是个问题了,redis空间是有限的,一直往redis中存储这种恶意请求的数据,那么redis迟早也会被占满,到时候redis就算不挂(redis内存被占满时,可以配置合适的淘汰策略防止redis无法对外服务),里面也就剩些垃圾数据了,到时候数据库还是得完蛋。所以这种方案不可靠。

三、布隆过滤器

3.1、布隆过滤器介绍

        布隆过滤器就是在redis前在挡一层,请求先经过布隆过滤器,如果布隆过滤器中存在,再走查缓存或者数据库的逻辑,否则就直接返回。

3.2、布隆过滤器设计理念

        布隆顾虑器本质上是由一个int数组和多个hash方法组成,具体的工作流程是这样的:初始化状态下,数组中的元素都为0。数据需要存到布隆过滤器时,先经过N个hash方法计算出N个下标,将这些下标的数组元素设置为1。数据读取时也是一样,通过N个hash方法计算出下标,查看所有命中的下标元素是否都是1,如果是,说明数据是合法的,运行进行后续的逻辑,否则直接返回。

        布隆顾虑器有缺点吗?没有完美的技术,缺点那必然是有的,比如说key1设置的数组下标是1、2、3;key2设置数组下标是1、3、5;key3设置的数组下标是2、6、7;此时如果正好有一个恶意的key4,他经过hash后,计算出的下标是2、5、6。这三个下标中的元素已经被设置成1了,所以虽然key4虽然不存在,但是也能通过布隆过滤器的校验,这个问题学名叫做误判率,使用布隆过滤器,这个误判率是一定存在的,默认情况下,这个误判率是百分之五,一般项目都是可以接受的,如果要减少误判率,可以通过增大数组的方式来做。

3.3、布隆过滤器使用

        3.3.1、我们先用代码简单模拟一下缓存穿透的样子,我们先获取缓存中存在的数据,如下图所示,在缓存中存在时,控制台不会打印查询sql,说明没走数据库,直接从缓存中获取到了数据。

@Testpublic void requestSearchCodeRuleTest(){String data = findData(1L);System.out.println(data);}/*** 功能描述: 通过id查询* @Author:huhy* @Date: 2025/3/21 21:49*/private String findData(Long id){String key = "dataConsistent:" + id;Object dataObj = redisTemplate.opsForValue().get(key);//如果缓存中不存在,则从数据库中查询if(Objects.isNull(dataObj)){return searchCodeRuleAndSetRedis(id);}else {//如果缓存中存在,直接返回return dataObj.toString();}}/*** 功能描述: 查询并设置到缓存* @Author:huhy* @Date: 2025/3/21 20:56*/private String searchCodeRuleAndSetRedis(Long id){//通过id查询编码规则TSCodeRule tsCodeRule = codeRuleService.selectTSCodeRuleById(id);if(Objects.isNull(tsCodeRule)){hrow new RuntimeException("id【"+id+"】 不存在!");}String roleJson = JSON.toJSONString(tsCodeRule);//将测试数据保存到redis中String key = "dataConsistent:"+tsCodeRule.getId();redisTemplate.opsForValue().set(key,roleJson);return roleJson;}

          

        此时我们开始搞点事情,请求一个缓存不存在的数据看看控制台的效果。为了效果更明显一点,我在代码中故意抛出了异常,其实实际开发时不需要这么写,这个需要注意。

        如下图所示,故意请求一个id不存在的,日志打印了sql,说明数据库被访问了。

3.3.2、真正振奋人心的时候到了,我们使用布隆过滤器来解决这个问题,还记得前两期我们使用过的分布式锁框架redisson吗?redisson为我们提供了布隆过滤器的API,我们可以直接使用,简直太方便了(让我还掏着了,嘿嘿嘿)。

@Testpublic void requestSearchCodeRuleTest(){String data = findData(100L);System.out.println(data);}/*** 功能描述: 通过id查询* @Author:huhy* @Date: 2025/3/21 21:49*/private String findData(Long id){//创建布隆顾虑器RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom-filter");//设置误判率bloomFilter.tryInit(100967256, 0.01);//初始化数据bloomFilter.add("dataConsistent:" + 1L);bloomFilter.add("dataConsistent:" + 2L);String key = "dataConsistent:" + id;//先判断布隆过滤器中是否存在boolean bloomContains = bloomFilter.contains(key);if(!bloomContains){System.out.println("id ["+id+"] 查无数据!");return null;}Object dataObj = redisTemplate.opsForValue().get(key);//如果缓存中不存在,则从数据库中查询if(Objects.isNull(dataObj)){return searchCodeRuleAndSetRedis(id);}else {//如果缓存中存在,直接返回return dataObj.toString();}}/*** 功能描述: 查询并设置到缓存* @Author:huhy* @Date: 2025/3/21 20:56*/private String searchCodeRuleAndSetRedis(Long id){//通过id查询编码规则TSCodeRule tsCodeRule = codeRuleService.selectTSCodeRuleById(id);String roleJson = JSON.toJSONString(tsCodeRule);//将测试数据保存到redis中String key = "dataConsistent:"+tsCodeRule.getId();redisTemplate.opsForValue().set(key,roleJson);return roleJson;}

四、结语

        本次简单介绍了缓存穿透的问题,这只是缓存三部曲第一个,后续我会继续和大家分享缓存击穿和雪崩问题,希望可以和大家一起学习进步,谢谢大家。

http://www.dtcms.com/a/512967.html

相关文章:

  • Python爬虫第8课:代理池与反反爬虫技术
  • 做网站有视频教吗营销推广型网站价格
  • 济南网站建设优化公司域名备案网站购买
  • 关于 DeepSeek-OCR 的猜想
  • Rademacher复杂度:衡量机器学习模型复杂度的利器
  • 西矿文旅:以自然之道开启研学新篇,为文旅产业注入“芯”动力
  • 攻防世界—easyupload
  • 合肥网站公司企业营销策划方案
  • 地方网站发展方向抖音代运营 深圳
  • 怎么做网站推广和宣传济南网站建设首选传承网络
  • 项目开发手册-项目结构
  • 数据库原理实验报告:数据库查询操作实现
  • 学习网站开发流程wordpress采集附件
  • 网站开发招标参数三亚市建设局网站公示
  • 网站后台iis配置立陶宛与俄罗斯最新消息
  • 【AI】AI评测入门(五):Evaluation 跑起来
  • GSFE层错能计算(DFT)
  • 数据结构——二十八、图的基本操作(王道408)
  • 百度分公司 网站外包中文在线っと好きだった最新版
  • 【Python OOP Diary 1.1】题目二:简单计算器,改错与优化
  • 如何用记事本做网站php网站开发工程师
  • 企业网站群建设的原因网站优化检查
  • 【JVM】详解 Class类文件的结构
  • 珠海市住房和建设局网站微网站开发 php
  • 欧美做爰视频网站工业品一站式采购平台
  • 中位数贪心|
  • 红海eHR全面智能化升级,重塑全角色智慧体验
  • 建设通网站联系电话谷歌浏览器怎么关闭2345网址导航
  • Xshell效率实战系列四:内置Xftp快速启动——从1分钟到10秒的传输革命
  • 贷款做网站公众号制作教程视频