redis工具类

`package com.ttsx.activity.item.services.utils;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.script.DefaultRedisScript;

import org.springframework.stereotype.Component;

import org.springframework.util.CollectionUtils;

import java.util.Collection;

import java.util.Collections;

import java.util.List;

import java.util.concurrent.TimeUnit;

/**

  • @ClassName :RedisUtils

  • @Description:redis工具

  • @Author :s30510

  • @Date :Created in 下午9:55 2022/7/17

  • @Modified By:

  • @Version:

    /

    @Slf4j

    @Component

    public class RedisUtils {

    @Autowired

    private RedisTemplate redisTemplate;

    /
    *

    • lua 脚本

      */

      public static final String SETNX_SCRIPT = "return redis.call('setnx',KEYS[1], ARGV[1])";

    /**

    • redis实现分布式锁
    • @param key
    • @return

      */

      public boolean setNx(String key,int time) {

      //自定义脚本

      DefaultRedisScript script = new DefaultRedisScript<>(SETNX_SCRIPT, List.class);

      //执行脚本,传入参数,由于value没啥用,这里随便写死的"1"

      List rst = (List) redisTemplate.execute(script, Collections.singletonList(key), "1");

      //返回1,表示设置成功,拿到锁

      if(rst.get(0) == 1){

      //log.info(key+"成功拿到锁");

      //设置过期时间

      expire(key,time);

      //log.info(key+"已成功设置过期时间:"+time +" 秒");

      return true;

      }else{

      long expire = getExpire(key);

      //log.info(key+"未拿到到锁,还有"+expire+"释放");

      return false;

      }

      }

    /**

    • 指定缓存失效时间
    • @param key 键
    • @param time 时间(秒)
    • @return

      */

      public void expire(String key, long time) {

      redisTemplate.expire(key, time, TimeUnit.SECONDS);

      }

    /**

    • 根据key 获取过期时间
    • @param key 键 不能为null
    • @return 时间(秒) 返回0代表为永久有效

      */

      public long getExpire(String key) {

      return redisTemplate.getExpire(key, TimeUnit.SECONDS);

      }

    /**

    • 删除缓存
    • @param key 可以传一个值 或多个

      */

      @SuppressWarnings("unchecked")

      public void del(String... key) {

      if (key != null && key.length > 0) {

      if (key.length == 1) {

      redisTemplate.delete(key[0]);

      } else {

      redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));

      }

      }

      }

}`

例子:

过期时间是为了防止死锁,当业务执行完毕,删除key释放锁

RedisTemplate实现setnx分布式锁的更多相关文章

  1. redis setnx 分布式锁

    private final String RedisLockKey = "RedLock"; private final long altTimeout = 1 * 60 * 60 ...

  2. java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购

    此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...

  3. RedisTemplate实现redis分布式锁

    RedisLockUtil.java package com.meeno.inner.oa.common.redis; import lombok.extern.slf4j.Slf4j; import ...

  4. Redis 分布式锁(一)

    前言 本文力争以最简单的语言,以博主自己对分布式锁的理解,按照自己的语言来描述分布式锁的概念.作用.原理.实现.如有错误,还请各位大佬海涵,恳请指正.分布式锁分两篇来讲解,本篇讲解客户端,下一篇讲解r ...

  5. 扩展redisTemplate实现分布式锁

    原文:https://blog.csdn.net/qq1010267837/article/details/79697572 依赖jar包 compile group: 'redis.clients' ...

  6. Redis分布式锁,基于StringRedisTemplate和基于Lettuce实现setNx

    使用redis分布式锁,来确保多个服务对共享数据操作的唯一性一般来说有StringRedisTemplate和RedisTemplate两种redis操作模板. 根据key-value的类型决定使用哪 ...

  7. Redis分布式锁—SETNX+Lua脚本实现篇

    前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...

  8. Redis_redis分布式锁-SETNX

    因业务需要使用了redis的SETNX来实现分布式锁. 描述:Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXis ...

  9. Redis setNX 实现分布式锁(重复数据插入可用其来实现排他锁)

    使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若 ...

  10. 使用Redis SETNX 命令实现分布式锁

    基于setnx和getset http://blog.csdn.net/lihao21/article/details/49104695 使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其 ...

随机推荐

  1. Vue.js 监听属性的使用

    示例源码: <div id = "computed_props"> 千米 : <input type = "text" v-model = & ...

  2. 超图SuperMap Objects的API开发中线对象和点对象查询

    注意:超图API开发中,如果将线对象和点对象都同时画在同一个CAD图层中,则在图查属性时,有可能现查询到线对象,而不能查询到点对象的信息.

  3. MySql 建表出现的问题 : [ERR] 1064 - You have an error in your SQL syntax; check the manual.......

    使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 1064 - You have an error in your SQL ...

  4. 16. C++快速入门--模板和Concept

    待修改 1 定义模板 1.1 模板形参 模板参数 模板可以有两种参数, 一种是类型参数, 一种是非类型参数 这两种参数可以同时存在, 非类型参数 的类型 可以是 模板类型形参 template < ...

  5. 如何发现漏洞之我的多功能武器BurpSuite与全能插件

    知识点 1.插件类-武装BurpSuite-漏洞检测&分析辅助 2.插件类-武装谷歌浏览器-信息收集&情报辅助 一.演示案例-插件类-武装BurpSuite-漏洞检测&分析辅助 ...

  6. Golang-编译和工具链12

    http://c.biancheng.net/golang/build/ go build命令(go语言编译命令)完全攻略 Go语言的编译速度非常快.Go 1.9 版本后默认利用Go语言的并发特性进行 ...

  7. java多线程---总结(2)

    ThreadPoolExecutor 官方API解释线程池的好处: (1)通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销. (2)对线程进行一些维护和管理,比如定时开始,周期执行,并发数控 ...

  8. Docker网络:Docker0、容器互联技术--link、自定义网络、实战部署Redis集群

    一.Docker网络 ● --理解Docker0 在干净的Linux环境上安装docker(将docker 的所有镜像.容器先删除,干干净净!)实验: 1.查看本地网络信息 ip addr 可见有三个 ...

  9. 字节流:FileInputStream和FileOutputStream的使用

    /** * 测试FileInputStream和FileOutputStream的使用 * * 结论: * 1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 * 2. 对于非 ...

  10. IO流:原理、流的分类、体系结构

    Java IO原理  I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等. Java程序中,对于数据的输入/输出操作以 &q ...