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 {

    @Resource
    private 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;
        }
        //清洗数据,清理过期redis
        Integer 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);
    }

    //清理当前调用线程redis
    private void after(String code){
        redisTemplate.opsForHash().delete(BUSINESS_CHECK, code);
        redisTemplate.delete(code);
    }

}

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

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

整理不易,点个赞吧!☺☺☺文章来源地址https://www.toymoban.com/news/detail-716952.html

到了这里,关于Redis设置hash,为不同的field设置不同的过期时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(58)
  • redis获取过期时间

    03,redisTemplate_redistemplate 获取剩余时间-CSDN博客 11.返回当前key所对应的剩余过期时间 1 12.返回剩余过期时间并且指定时间单位

    2024年01月16日
    浏览(34)
  • redis数据未到过期时间被删除

    使用了jeecgboot开发后端代码,代码设置的redis过期时间为24小时,部署使用的宝塔面板,在redis中看到的过期时间也是为24小时,但是并未到过期时间,数据就被删除。 观察了一下redis中的数据,发现多了几个backup的数据, 于是我清空了数据 调整数据库数量 问题得到了解决

    2024年02月14日
    浏览(33)
  • cookies 设置过期时间

    F12-Application-Cookies可以查看到网页所有设置cookie值, 如果设置了过期时间的cookie是可以看到过期时间的持久cookie(persistent cookie), 没有设置过期时间的是会话cookie(session cookie) 设置3小时后过期

    2024年02月09日
    浏览(40)
  • 给localStorage设置过期时间

    登录成功了之后后端会返回给我一个token,一般情况下我会将这个token存到localStorage中,后续再每一次请求中都会将这个token携带在请求头中。 至于为什么要存到localStorage中呢,相信做过单页web应用的开发者们也知道,如果不存着,那用户刷新了就啥都没有了。 浏览器给我们

    2024年02月07日
    浏览(40)
  • kafka单独设置topic过期时间

    kafka 默认存放7天的临时数据,如果遇到磁盘空间小,存放数据量大,可以设置缩短这个时间。 一、全局设置 修改 server.properties,如下的值: 二、单独对某一个topic设置过期时间 但如果只有某一个topic数据量过大,想单独对这个topic的过期时间设置短点: 三、查看设置: 四、

    2024年02月12日
    浏览(42)
  • 【微信小程序】缓存过期时间的相关设置

      每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync) 、 wx.getStorage(wx.getStorageSync) 、 wx.clearStorage(wx.clearStorageSync) 可以对本地缓存进行设置、获取和清理。   但是微信默认设置了缓存是无限长的过期时限,这对于我们的小程序开发,是

    2024年02月12日
    浏览(60)
  • AWS Sign-URL的过期时间设置

    Enabling custom identity broker access to the AWS console - AWS Identity and Access Management (amazon.com) 如上链接, AWS支持自己写代码生成登陆链接( Sign-URL)来登陆的模式。 在企业中这种方式比较常见。 每个登陆链接都有一个过期时间,最小15min,最大36hours 。 那么如何判断自己登陆链接的有

    2024年02月02日
    浏览(41)
  • Redis:StringRedisTemplate简介

    (笔记总结自b站黑马程序员课程) 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。 为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序

    2024年02月09日
    浏览(42)
  • 阿里云OSS存储图片在上传的时候设置过期时间

    第一种方法:在上传文件时设置过期时间 在使用 putObject 方法上传文件时,可以通过设置 x-oss-expires 和 x-oss-delete-after 头部来设定文件的过期时间。 以下是示例代码: 上述代码中,我们在 headers 中添加了 x-oss-expires 和 x-oss-delete-after 头部来设定文件的过期时间,其中 x-oss-ex

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包