解决 Redis 击穿问题之黑名单

以商品列表为例:

主要思想:

/*
1.先查黑名单是否存在当前商品,如果有就抛出异常
2.检查redis里面是否有该商品,如果有就直接返回,
3.如果没有就查询数据库,将数据缓存到redis
4.判断数据库中是否有该商品,如果有就直接返回,如果没有就将查询的数据放入黑名单中*/

代码示例:

 

    @Resource(name = "redisTemplate")private HashOperations<String ,String,String> hashOperations;@Resource(name = "redisTemplate")private ValueOperations<String ,Product> valueOperations;//黑名单keyprivate static final String BLACK_LIST_KEY = "product.blacklist";//商品详情keyprivate static final String PRODUCT_DETAIL_KEY = "product.";public Product selectById(Integer id) {// 1.先查黑名单是否存在当前商品,如果有就抛出异常Boolean b = hashOperations.hasKey(BLACK_LIST_KEY, id.toString());if (b){log.error("商品被拉黑,已经存在黑名单中,id=》{}" ,id);throw new BizException(101,"商品被拉黑,已经存在黑名单中,id=》{}" + id);}//2.检查redis里面是否有该商品,如果有就直接返回,Product product = valueOperations.get(PRODUCT_DETAIL_KEY+id);if (ObjectUtil.isNotEmpty(product)){log.debug("redis里面有该商品,直接返回,id=》{}" ,id);return product;}//3.如果没有就查询数据库,将数据缓存到redisproduct = productDao.selectById(id);//  4.判断数据库中是否有该商品,如果有就直接返回,如果没有就将查询的数据放入黑名单中if (ObjectUtil.isNotEmpty(product)){log.debug("数据库中有该商品,直接返回,id=》{}" ,id);//为了防止雪崩,做错峰int i = RandomUtil.randomInt(-60,60);valueOperations.set(PRODUCT_DETAIL_KEY+id,product,24*60+i, TimeUnit.MINUTES);return product;}else {log.error("数据库中没有该商品,将查询的数据放入黑名单中,id=》{}" ,id);hashOperations.put(BLACK_LIST_KEY,id.toString(), DateUtil.now());throw new BizException(102,"商品不存在数据库中,id=》{}" + id);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪个网盘最适合个人文件长期储存?用派盘最好

派盘是一款面向个人和企业的本地云存储解决方案,专为长期文件存储而设计。这种存储方式利用了本地硬盘的存储容量,通过“云化”的方式,可以将本地硬盘变成云存储空间。它具有强大的数据保护功能,确保了数据的私密性和安全性。 派盘的主要特点 高效的存取速度:由于使用本地…

这种电脑原来这么耗电……震惊了粉丝小姐姐

前言 在今年1月份的时候&#xff0c;一位来自重庆的小姐姐加了小白&#xff0c;咨询电脑的问题&#xff1a; 哦豁&#xff0c;这个电脑看着确实闪闪发光&#xff0c;是真的很漂亮&#xff5e;&#xff08;嗯&#xff0c;小姐姐也很漂亮&#xff09; 电脑无法开机&#xff0c;按…

什么是流量削峰?如何解决秒杀等业务的削峰场景

文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的a…

【Python设计模式02】设计原则

1.单一职责原则 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是面向对象编程中SOLID原则的第一个原则。它强调每个类应该只有一个引起变化的原因&#xff0c;即一个类只负责一项职责。这一原则有助于提高代码的可维护性、可读性和可复用性。 单…

mysql锁表查看

命令 &#xff1a; show full processlist;//显示哪些线程正在运行

数字驱动,教育先行——低代码揭秘教育机构管理数字化转型

数字化时代为教育带来了许多变革和挑战&#xff0c;同时也为教育创新提供了无限可能。数字化转型可以帮助教育机构应对这些变革和挑战&#xff0c;提高教育效率和质量&#xff0c;满足学生个性化需求&#xff0c;优化教育管理和服务&#xff0c;并提高教育机构的竞争力。 并且…

docker 安装 yapi

文章目录 docker 安装 yapi一、拉取镜像二、创建目录三、添加配置文件四、初始化数据库表五、启动 yapi六、测试以及修改默认密码 没有 MongDB 的可以先看这个教程&#xff1a;MongDB安装教程 docker 安装 yapi 版本&#xff1a; 1.9.5 一、拉取镜像 docker pull yapipro/y…

以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?

以及Spring中为什么会出现IOC容器&#xff1f;Autowired和Resource注解&#xff1f; IOC容器发展史 没有IOC容器之前 首先说一下在Spring之前&#xff0c;我们的程序里面是没有IOC容器的&#xff0c;这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢&#xff1f;…

Flutter 中的 AnimatedSwitcher 小部件:全面指南

Flutter 中的 AnimatedSwitcher 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;动画是增强用户体验的重要工具。AnimatedSwitcher 是一个用于在两个 widget 之间执行平滑过渡动画的小部件。它可以自动处理两个状态之间的转换&#xff0c;提供丰富的动画效果。本文将详…

小白如何从零开始学新媒体运营三

最近有好多宝子私信问我是在哪里学习运营方面的相关知识的&#xff0c;那今天我就给大家整理了8个口碑较好的新媒体运营课程自学网站&#xff0c;帮大家快速入门新媒体运营. 1、考拉新媒体导航 实时热点、排版工具、运营干货、在线作图、高清图库、协作工具、数据平台&#xf…

三元组的最短距离

前言 个人小记 一、简介 定义三元组&#xff08;a,b, c&#xff09;&#xff08;a,b,c 均为正数&#xff09;的距离 D|a-b||b-c||c-a|。给定 3 个非空整数集合 S1, S2 ,S3, 按升序分别存储在 3 个数组中。请设计一个尽可能高效的算法&#xff0c;计算并输出所有可能的三元组&…

131. 面试中关于架构设计都需要了解哪些内容?

文章目录 一、社区系统架构组件概览1. 系统拆分2. CDN、Nginx静态缓存、JVM本地缓存3. Redis缓存4. MQ5. 分库分表6. 读写分离7. ElasticSearch 二、商城系统-亿级商品如何存储三、对账系统-分布式事务一致性四、统计系统-海量计数六、系统设计 - 微软1、需求收集2、顶层设计3、…

【Django】从零开始学Django(持续更新中)

PyCharm的版本必须为专业版&#xff0c;社区版不具备Web开发功能的。 一. Django建站基础 Django采用MTV的框架模式&#xff0c;即模型(Model)、模板(Template)和视图(Views)&#xff0c;三者之间各自负责不同的职责。 ●模型&#xff1a;数据存取层&#xff0c;处理与数据相关…

【网络】cookie

cookie 的组成 cookie是浏览器中特有的一个概念&#xff0c;它就像浏览器的专属卡包&#xff0c;管理着各个网站的身份信息。 每个cookie就相当于是属于某个网站的一个卡片&#xff0c;它记录了下面的信息&#xff1a; key: 键&#xff0c;比如「身份编号」value: 值&#x…

vivado Miscellaneous Net-Related Constraints

Miscellaneous Net-Related Constraints KEEP Applied To Nets Constraint Values • TRUE • FALSE UCF Example net x_int KEEP TRUE; XDC Example set_property DONT_TOUCH true [get_nets x_int] SAVE NET FLAG Applied To Nets Constraint Values N/A …

Element-UI快速入门指南

一、引言 在前端开发领域&#xff0c;Vue.js以其简洁的API和灵活的组件系统受到了广泛的欢迎。Element-UI则是一套基于Vue.js 2.0的桌面端组件库&#xff0c;它提供了丰富的组件和友好的API&#xff0c;帮助开发者快速构建出美观且功能强大的Web应用。本文将带你快速入门Eleme…

信号:MSK调制和GMSK调制

目录 一、MSK信号 1. MSK信号的第k个码元 2.MSK信号的频率间隔 3.MSK信号的相位连续性 3.1 相位路径 3.2初始相位ψk 4.MSK信号的产生 原理框图 5.MSK信号的频谱图 二、高斯最小频移键控(GMSK) 1.频率响应 2.GMSK调制产生方式 2.1 高斯滤波器法 2.2 正交调制器法…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP&#xff1f;什么是原生IP&#xff1f; 1、海外私人IP&#xff1a; 海外私人IP是由专门的服务提供商提供的IP地址&#xff0c;这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP广泛应用与跨境电商中&#x…

【Qt】修改QToolButton图标颜色

1. 目的 修改QToolButton的图标颜色&#xff0c;单一颜色&#xff0c;效果类似于Qt Creator左边选项卡。 2. 代码 QIcon MainWindow::setIconColor(QIcon icon, QColor color) {QPixmap pixmap icon.pixmap(QSize(64,64));QPainter painter(&pixmap);painter.setCompo…

DockerK8s

Docker&K8s 1. Docker 1.1 Docker是什么 用于构建容器化平台的软件&#xff0c;进程管理软件&#xff0c;主要用于部署应用程序并守护应用进程。容器是由docker软件启动的业务集成&#xff0c;该进程由docker全权管理。容器是进程&#xff0c;由内核机制来完成容器隔离。…