Redis设置hash,为不同的field设置不同的过期时间

Redis设置hash,为不同的field设置不同的过期时间

  • 一、背景需求
  • 二、具体要求
  • 三、代码实现

一、背景需求

最近做了一个小需求,由于系统对接,导致我们的系统在高峰的时候CPU飙升,所以需要在高峰的时候保护系统进程不受影响。
而且还需要我们知道当前对接的数据总量,并且可以实时释放,如果释放失败了,还需要定时释放,减少系统卡顿的同时,不能对第三方产生影响。

此处肯定有人想到令牌桶算法,或者redission。
SpringBoot基于guava集成令牌桶算法:https://blog.csdn.net/qq_38254635/article/details/126398730
SpringBoot集成Redisson:https://blog.csdn.net/qq_38254635/article/details/126398716
集成的虽好,但我们用的场景单一,集成还需要引入jar导致部署包变大,所以我们需要手动搞一个。

二、具体要求

1、可以知道当前存在的总量
2、可实时对每个变量进行调整
3、变量的关闭失败后,有自修复机制

三、代码实现

了解redisson的应该知道,可以参考其做一个简易版。

package com;import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;public class Test {@Resourceprivate StringRedisTemplate redisTemplate;private final static Integer SWITCH_COUNT = 3;public static final String BUSINESS = "business:";public static final String CHECK = "check";public static final String BUSINESS_CHECK = BUSINESS + CHECK;public Result doLink(String strJson) {if(!getCheck(strJson)) return Result.error("当前调用超上限,请稍后重试!");return Result.success();}private boolean getCheck(String code){Map<Object, Object> objectMap = redisTemplate.opsForHash().entries(BUSINESS_CHECK);//如果为空,则视为第一次使用,直接放行if(null == objectMap || objectMap.size() == 0) {this.setKey(code);return true;}//清洗数据,清理过期redisInteger count = 0;//当前有效总量for(Map.Entry<Object, Object> entry : objectMap.entrySet()){String user = entry.getKey().toString();if(StringUtils.isEmpty(redisTemplate.opsForValue().get(BUSINESS_CHECK + "_" + user))) {redisTemplate.opsForHash().delete(BUSINESS_CHECK, user);continue;}count++;}//校验是否超过上限if(count >= SWITCH_COUNT) return false;this.setKey(code);return true;}private void setKey(String code){redisTemplate.opsForHash().put(BUSINESS_CHECK, code, JSONObject.toJSONString(code));redisTemplate.opsForValue().set(BUSINESS_CHECK + "_" + code, code,1, TimeUnit.MINUTES);}//清理当前调用线程redisprivate void after(String code){redisTemplate.opsForHash().delete(BUSINESS_CHECK, code);redisTemplate.delete(code);}}

仅提供一个思路:
大致思路,redis存一个hash,把hash中的field当做key再存一个有效期的key。
当线程结束时,手动回收hash中的field,及对应的key。
考虑回收会存在失败的情况,所以在使用的时候,需做一遍数据清洗。

此方式,仅适用于count较小时使用,允许调用次数较多时,数据清洗会很消耗性能。

整理不易,点个赞吧!☺☺☺

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

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

相关文章

烘焙小程序蛋糕店烘焙店源码点心店小程序源码

本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持微信小程序 &#xff0c;对接打印机&#xff0c;对接第三方同城跑腿平台 用户端使用&#xff1a;uniapp 管理端使用&#xff1a;vueelementui 后台服务使用&#xff1a;springbootjpa

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

科大讯飞-鸟类分类挑战赛-测试【1】

科大讯飞-鸟类分类挑战赛-测试【1】 1. 比赛说明2. EfficientNet测试2.1 **模型搭建:**2.2 **模型训练:**2.3 训练过程可视化2.4 一些报错解决:1. 比赛说明 背景: 随着生态环境的不断变化和人类对自然资源的过度开发,世界各地的鸟类数量和种类正在发生着巨大的变化。为了更…

网络OSI七层模型解析

在整理笔记时发现了该文章&#xff0c;也不记得是当时自己学习时的感悟还是记录的别人的精华了&#xff0c;感觉写的挺好&#xff0c;就放到博客上了&#xff0c;自己闲时可以看看&#xff0c;其他人有需求也可以瞅瞅。 1 物理层【比特】 首先解决两台物理机之间的通信需求&a…

不同语言操作符的优先级

看到标题&#xff0c;可能会心生疑惑: 这么基础且重要的操作&#xff0c;不同语言不应该是一致的吗&#xff1f; 并不一定&#xff0c;比如对于右移运算和加法运算&#xff0c;Go就与其他多数语言表现得不一致&#xff1a; Go: package mainimport "fmt"func main() …

Vault数据备份恢复-MySQL

前言 Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护…

分布式天梯图算法在 Redis 图数据库中的应用

分布式天梯图算法在 Redis 图数据库中的应用 一、简介1 天梯图算法2 天梯图算法在Redis的应用 二、Redis分布式天梯图算法设计与优化1 基于天梯图的分布式算法设计2 多节点扩展与负载均衡优化3 数据存储方案与压缩策略 三、技术实现3.1 系统架构设计3.2 技术选型3.3 关键实现细…

前端工作常见数组数据处理的一些场景总结

一.对于数组进行修饰返回一个新的数组&#xff1b; 01.描述。 我们工作常常会发现后端传过来的数据有些不仅仅键值为空&#xff0c;甚至都没有键&#xff0c;也就是我们常说的属性名&#xff0c;那我们就需要去修改一下&#xff0c;返回一个结构正常的数据&#xff1b; 02.代…

iOS——Block two

Block 的实质究竟是什么呢&#xff1f;类型&#xff1f;变量&#xff1f;还是什么黑科技&#xff1f; Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件&#xff0c;并写好 block 的相关代码。打开「终端」&#xff0c;执行 cd XX…

k8s新建集群官方指导文档

官方文档可能标的不清晰&#xff0c;在create cluster里面没有给具体怎么操作。 他主要是用这个kubeadm插件来进行新建集群的&#xff0c;我问过网站作者。 官方的tutorial在这里&#xff0c;其实还是步骤蛮多的。

[C++]01.基础,数据类型,运算符

01.基础,数据类型,运算符 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWo…

Ubuntu新装系统报错:sudo: vim:找不到命令

问题&#xff1a; 新安装的老版本Ubuntu系统&#xff0c;发现在使用vim命令的时候报错&#xff1a; sudo&#xff1a;vim&#xff1a;找不到命令 解决办法 这是因为没有安装vim&#xff0c;直接运行下面命令安装vim sudo apt-get install vim

webshell详解

Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页后门。黑客在入侵了一个网站后&#xff0c;通常会将asp或php后门文件与…

Eureka 学习笔记4:客户端 DiscoveryClient

版本 awsVersion ‘1.11.277’ DiscoveryClient # cacheRefreshTask // 配置shouldFetchRegistry if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds clientConfig.getRegistryFetchIntervalSeconds();// 配置expB…

【普通人维护windows的方法,不中毒,不弹窗,不卡顿】

前言 IT人也是普通人&#xff0c;我就说说普通人维护电脑的方法。 我的电脑配置 给大家看看&#xff0c;配置一般&#xff0c;运行软件和游戏&#xff0c;可以保持基本流程 日常维护措施 我不太喜欢设定一些非主流的配置&#xff0c;下了一个360卫士,360其他的套餐可以不用下…

跨站脚本攻击(XSS)

1 什么是XSS跨站脚本攻击问题? XSS是跨站脚本攻击(Cross Site Scripting)&#xff0c;为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时&#xff0c;嵌入其中Web…

数据结构——绪论

一、绪论 &#xff08;一&#xff09;基本概念 数据&#xff1a;数据是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;在计算机程序中通常作为一个整…

js实现按照句号将一段文本进行分段

/*** 将给定的文本按照300字并且按照句号分为多个p标签** param text 给定的文本* returns 返回分割后的多个p标签的数组*/ function splitTextByParagraph(text) {// 将文本按照句号分割成多个句子const sentences text.split(。);// 初始化一个空数组来存储生成的p标签const…

【Nginx】nginx配置跳转实现接口静态化

1.配置nginx跳转到oss静态化地址&#xff1b; 2.oss bucket配置回源到服务端接口&#xff1b; 3.服务端接口有处理oss bucket回源地址&#xff0c;按规则拼装完整url以后redirect; 4.服务端需要提供清理oss文件的接口&#xff1b; 5.静态化域名配置&#xff1a;域名解析到O…

Nodejs中的全局对象

今天我们将探讨Nodejs中的全局对象&#xff0c;这是Nodejs中重要且有趣的知识点。我们将通过生动形象的例子和风趣的风格来深入理解这些概念&#xff0c;并比较Nodejs中的全局对象与前端JavaScript中的全局对象之间的异同点。 全局对象是什么&#xff1f; 在Nodejs环境中&…