项目中利用Redis缓存和自增函数的场景

 项目中利用Redis缓存和自增函数应对高并发场景下工单号的生成。

public long setIncr(String key, int cacheSeconds) {
    long result = 0;
    try {
        ValueOperations<String, Long> valueOps = redisTemplate.opsForValue();
        result = valueOps.increment(key, 1);
        log.info("enter redisTemplate.opsForValue().increment(), key = " + key + "; times = " + result + "; cacheSeconds = " + cacheSeconds);
        if (cacheSeconds > 0 && result == 1) {
            redisTemplate.expire(key, cacheSeconds, TimeUnit.SECONDS);
        }
    } catch (Exception e) {
        log.warn("set " + key + " = " + result, e);
    }
    return result;
}

这是一个 Java 方法,它与 Redis 缓存进行交互。

该方法接受两个参数:

key:一个字符串,表示要在 Redis 缓存中使用的键,值为当前时间(精确到小时,例如2024071015)。
cacheSeconds:一个整数,表示缓存的有效时间(以秒为单位),设置为一个小时(3600s)。

然后它尝试执行以下操作:

从 redisTemplate 实例中获取 ValueOperations 对象,以便与 Redis 缓存进行交互。
将与 key 关联的值在 Redis 缓存中递增 1,并将新值存储在 result 变量中。
记录 key、递增后的值和缓存过期时间。
如果 cacheSeconds 参数大于 0,并且 result 等于 1(表示这是第一次递增),则将 key 在 Redis 缓存中的过期时间设置为指定的秒数。
如果在操作过程中发生任何异常,该方法会记录一条警告消息,其中包含键和结果。

最后,该方法返回 result 值,该值表示 Redis 缓存中计数器的新值。

redisTemplate.opsForValue().increment() 方法是一个原子操作,这意味着它可以在单个操作中完成两件事:

递增操作: 该方法会将 Redis 键对应的值递增 1。

获取新值: 该方法会返回递增后的新值。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

这样一来,即使有多个客户端同时对同一个 Redis 键进行递增操作,Redis 也会确保每个操作都是完整和正确的,不会出现数据竞争的问题。

这个过程是原子的,也就是说在整个操作过程中,Redis 会确保没有其他客户端能够干扰这个操作。换句话说,在 increment() 方法执行期间,Redis 会对该键加锁,阻止其他客户端进行任何并发修改。

通过这种方法可以递增地生成工单号,应对高并发场景。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值