Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现

缓存击穿:也称热点key问题,大量访问一个key,而这个key恰巧到期了,导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决此问题。

流程图:

第一点需要进行缓存预热,把经常用的key预先缓存到redis中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    /** 缓存数据KEY */private final String CACHE_SHOP_KEY = "CACHE_SHOP_KEY:";/** 缓存互斥锁KEY */private final String CACHE_SHOP_LOCK_KEY = "CACHE_SHOP_LOCK_KEY:";@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ExecutorService CACHE_REBUILD_EXECUTOR = Executors.newFixedThreadPool(10);/*** redis缓存* 缓存击穿*/@Overridepublic BooksVo selectById(Long bookId) {// 缓存击穿-互斥锁// return tryCacheMutex(bookId);// 缓存击穿-逻辑过期时间return tryCacheMutex2(bookId);}/*** redis缓存* 缓存击穿-逻辑过期版本* @param bookId*/private BooksVo tryCacheMutex2(Long bookId) {// RedisKeyString cacheKey = CACHE_SHOP_KEY + bookId;// 1.从Redis查询商铺缓存// 获取缓存数据String contentBook = stringRedisTemplate.opsForValue().get(cacheKey);// 2.判断缓存是否命中if (StringUtils.isBlank(contentBook)){// 3.1缓存未命中 直接返回结果return null;}// 3.2缓存命中-获取数据RedisData redisData = JSONUtil.toBean(contentBook, RedisData.class);BooksVo booksVo = JSONUtil.toBean((JSONObject) redisData.getData(), BooksVo.class);LocalDateTime expireSecond = redisData.getExpireSecond();//  4.缓存未过期 直接返回数据if (expireSecond.isAfter(LocalDateTime.now())){return booksVo;}// 5.缓存过期-获取互斥锁if (tryLock(bookId)){// check doubleString s = stringRedisTemplate.opsForValue().get(cacheKey);RedisData redisData1 = JSONUtil.toBean(s, RedisData.class);if (BooleanUtil.isFalse(redisData1.getExpireSecond().isAfter(LocalDateTime.now()))){// 获取互斥锁成功,开启独立线程,缓存重建CACHE_REBUILD_EXECUTOR.submit(() -> {try {// 重建缓存saveCacheBook(bookId, 20L);} catch (Exception e) {throw new RuntimeException(e);} finally {// 释放互斥锁stringRedisTemplate.delete(CACHE_SHOP_LOCK_KEY + bookId);}});}}// 返回已过期的数据return booksVo;}/*** 保存缓存信息*/public void saveCacheBook(Long bookId, Long expireSeconds){// 1.查询数据库数据BooksVo booksVo = this.queryById(bookId);// 2.封装逻辑过期时间RedisData redisData = new RedisData();redisData.setData(booksVo);// 获取当前的时间 + 指定秒数redisData.setExpireSecond(LocalDateTime.now().plusSeconds(expireSeconds));// 3.写入redisstringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + bookId, JSONUtil.toJsonStr(redisData));}

redisData实体类

@Data
public class RedisData {/** 逻辑过期时间 */private LocalDateTime expireSecond;/** 拓展实体类 */private Object data;
}

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

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

相关文章

基于微信小程序的苏州博物馆文创产品售卖系统

前言 基于小程序的苏州博物馆文创产品售卖系统的设计与实现能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知基于小程序的苏州博物馆文创产品售卖系统的设计与实现的便捷高效,不仅为群众提供了服务,而且也推广了自己&#…

leetcode209--长度最小的子数组

1. 题意 找到最小满足和大于 t a r g e t target target的子数组长度。 长度最小的子数组 2. 题解 2.1 滑动窗口 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int l 0;int sum 0;int sz nums.size();int ans INT_MAX;for (…

【leetcode面试经典150题】37. 矩阵置零(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

堆 和 优先级队列

目录 一、堆 二、优先级队列 1、初识优先级队列 2、实现一个优先级队列 3、PriorityQueue &#xff08;1&#xff09;实现了Comparable接口&#xff0c;重写了compareTo方法 &#xff08;2&#xff09;实现了Comparator接口&#xff0c;重写了compare方法 4、 Prio…

Django+Celery框架自动化定时任务开发

本章介绍使用DjCelery即DjangoCelery框架开发定时任务功能&#xff0c;在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等&#xff0c;从而取代Jenkins上的定时执行脚本和发送…

windows安装Redis,Mongo,ES并快速基本掌握开发流程

前言 这里只是一些安装后的基础操作&#xff0c;后期会学习更加深入的操作 基础操作 前言RedisRedis启动idea集成Redisjedis技术 Mongodbwindows版Mongodb的安装idea整合Mongodb ES(Elasticsearch)ESwindows下载ES文档操作idea整合ES低级别ES整合高级别ES整合 Redis Redis是…

深入理解JVM后端优化技术-方法内联

相关系列 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客 深入理解JVM后端优化技术-锁消除&#xff08;Lock Elision)-CSDN博客 深入理解JVM后端优化技术-锁粗化(Lock Coarsening)-CSDN博客 jvm只是负责依次将字节码指令逐次转换成机器码。而在转换过程中&#x…

计算机网络----第五天

广域网基本原理 局域网问题&#xff1a; 问题&#xff1a;以太网等局域网技术无法支持远程传输 广域网目的&#xff1a; 目的&#xff1a;基于电信运营商的通信网络设施建立远程连接 在相聚遥远的局域网之间建设连接性 广域网连接方式&#xff1a; 方式&#xff1a;电路交…

【THM】Net Sec Challenge(网络安全挑战)-初级渗透测试

介绍 使用此挑战来测试您对网络安全模块中获得的技能的掌握程度。此挑战中的所有问题都可以仅使用nmap、telnet和来解决hydra。 挑战问题 您可以使用Nmap、 Telnet 和Hydra回答以下问题。 2.1小于10000的最大开放端口号是多少? 8080 nmap -p- -T4 10.10.234.218 2.2普通…

gurobi不同版本切换

每年年底&#xff0c;gurobi都会推出新版本。新版本是大的迭代更新&#xff0c;求解问题的效率和精度都会提升。官方人员一般会建议我们安装最新的版本&#xff0c;此外&#xff0c;写论文审稿专家也会建议我们使用较新的版本。 从我们现装的版本切换到新版本。我以往的做法是…

App测试收集总结

Monkey monkey是安卓的命令行工具&#xff0c;可以运行在虚拟机或者实际设备中。 monkey的目的就是为了测试app的稳定性&#xff0c;看App是否会崩溃 monkey的特点:只能对程序包进行测试&#xff0c;无法对源码进行测试&#xff1b;moneky的事件数据流是随机的&#xff0c;无法…

接口自动化测试利器,使用Rest Assured进行REST API测试

我们在做接口测试时&#xff0c;一般在代码中会使用HttpClient&#xff0c;但是HttpClient相对来讲还是比较麻烦的&#xff0c;代码量也相对较多&#xff0c;对于新手而言上手会比较难一点&#xff0c;今天我们来看下另一个接口测试工具包REST Assured REST Assured是一个流行…

麒麟V10安装Redis6.2.6

1、下载redis安装包 Redis各版本下载&#xff1a;https://download.redis.io/releases/ 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 3、 解压文件 tar -zxvf redis-6.2.6.tar.gzmv redis-6.2.6 redis4、安装redis 在redis文件夹下输入make指令 cd /opt/redi…

MoCo 算法阅读记录

论文地址&#xff1a;&#x1f430; 何凯明大神之作&#xff0c;通过无监督对比学习预训练Image Encoder的表征能力。后也被许多VLP算法作为ITC的底层算法来使用。 一方面由于源代码本身并不复杂&#xff0c;但是要求多GPU分布式训练&#xff0c;以及需要下载ImageNet这个大规模…

Ubuntu 20.04.06 PCL C++学习记录(二十一)【切记使用rm * -rf前先确认是否是对应文件夹】

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;测试点云下载地址 学习内容 根据欧几里得距离和需要保持的用户可自定义条件对点进…

在服务器部署MySQL

在服务器opt 新建文件夹 mysql/data&#xff0c;新建文件 mysql/conf.d/my.cnf 其中my.cnf 内容如下 [mysqld] log_timestampsSYSTEM default-time-zone8:00server-id1log-binmysql-binbinlog-do-db mall # 要监听的库binlog_formatROW 配置解读&#xff1a; ① server-id &…

【分析 GClog 的吞吐量和停顿时间、heapdump 内存泄漏分析】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容GClog分析以优化吞吐量和停顿时间步骤1: 收集GClog步骤2: 分析GClog步骤3: 优化建议步骤4: 实施优化 Heapdump内存泄漏分析步骤1: 获取Heapdump步骤2: 分析Heapdump步骤3: 定位泄漏对象步骤4: 分析泄漏原因步骤5: 修复泄漏…

2024.4.3力扣每日一题——找出克隆二叉树中的相同节点

2024.4.3 题目来源我的题解方法一 深度优先搜索方法二 广度优先遍历 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1379 我的题解 方法一 深度优先搜索 同时对二叉树 original 与 cloned 进行深度优先搜索&#xff0c;如果 original当前搜索的节点的引用等于 target 节…

预训练的启蒙:浅谈BERT、RoBERTa、ALBERT、T5

文章目录 Transformer揭开预训练序幕为什么RNN/LSTM需要从头训练&#xff1f; BERT核心特点预训练任务架构应用和影响 RoBERTa改进点BERT和RoBERTa的MASK策略对比BERT的静态MASK策略RoBERTa的动态MASK策略效果 总结 ALBERT改进点参数共享因式分解嵌入参数和LoRa对比 总结 T5核心…

Electron打包vue+java+nginx 踩坑记录

记录下遇到的问题&#xff1a; ⚠注意&#xff1a;64位系统和32位系统的配置不太一样 1、运行npm run packager失败 原因&#xff1a;在package.json没有对应命令 解决&#xff1a;在package.json 中添加对应命令&#xff0c;其中testApp是你想要的输入的项目名称&#xff0…