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. 配置YUM源出现Errno 14 Could not open/read repomd.xml 或者 "Couldn't open file /mnt/cdrom/repodata/repomd.xml" 错误的解决办法

    报错信息: [root@tcljr-jdh-uat007 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Loading mirro ...

  2. apache install

    https://www.gnu.org/software/libtool/ ./configure --prefix=/usr/local/libtoolmakesudo make install h ...

  3. SPRING BOOT 项目中使用<SCOPE>PROVIDED</SCOPE>打包成WAR到TOMCAT运行出现的问题总结

    大家知道 spring boot 项目是自带tomcat 的,但是我们有时候是需要把项目打包成war 然后放到独立的tomcat中运行的,这个时候我们就需要将它自带的tomcat给排除开,这时候我们就 ...

  4. 如何控制bean的加载顺序?

    写在前面 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能. 在一般业务场 ...

  5. Datawhale冬令营第二期!Task2🌼

    Datawhale冬令营第二期-Task2:学AI编程的Prompt工程,提升效果 对应链接:https://www.datawhale.cn/activity/116/23/95?rankingPa ...

  6. 跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)

    本文由will分享,个人博客zhangyaoo.github.io,原题"基于Netty的IM系统设计与实现",有修订和重新排版. 1.引言 本文将要分享的是如何从零实现一套基于N ...

  7. 使用Docker编译PaddlePaddle

    在ubuntu中使用Docker编译PaddlePaddle 要在ubuntu中使用docker编译paddle框架,首先分为以下几个步骤: 安装docker环境 拉取paddle的docker镜像 ...

  8. 查看Android是否开机启动进入桌面

    adb 或者 串口终端 getprop sys.boot_completed 返回空代表没有进入桌面返回1代表已进入桌面

  9. CyclicBarrier底层实现和原理

    1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...

  10. weixueyuan-Nginx HTTP模块3

    https://www.weixueyuan.net/nginx/http/ Nginx镜像模块:ngx_http_mirror_module Nginx 中镜像模块的功能是将用户的访问请求镜像复制到 ...