/*** @author Linging* @version 1.0.0* @since 1.0*/
@Component
public class RedisUtil {@Autowiredprivate RedisTemplate redisTemplate;/*** 基于lua脚本实现setnx+expire原子性* 使用set命令* @param key* @param value* @param seconds* @return*/public Object setnx(String key, String value, Integer seconds){String script =" if redis.call('get', KEYS[1]) " +" then return 0; " +" else " +" redis.call('set', KEYS[1], ARGV[1]) " +" redis.call('expire', KEYS[1], ARGV[2]) " +" return 1; " +" end; ";DefaultRedisScript redisScript = new DefaultRedisScript(script, String.class);//指定传递参数序列化方式,参数序列化要支持数字,否则报错RedisSerializer argsSerializer = new GenericToStringSerializer<>(Object.class);//指定返回结果序列化方式RedisSerializer<String> resultSerializer = redisTemplate.getDefaultSerializer();Object execute = redisTemplate.execute(redisScript,argsSerializer, resultSerializer, Lists.newArrayList(key), value, seconds);return execute;}/*** 基于lua脚本实现setnx+expire原子性* 使用setnx命令* @param key* @param value* @param seconds* @return*/public Object setnx2(String key, String value, Integer seconds){String script =" if redis.call('setnx', KEYS[1], ARGV[1]) == 1 " +" then " +" redis.call('expire', KEYS[1],ARGV[2]) " +" return 1 " +" else " +" return 0 " +" end; ";DefaultRedisScript redisScript = new DefaultRedisScript(script, String.class);//指定传递参数序列化方式RedisSerializer argsSerializer = new GenericToStringSerializer<>(Object.class);//指定返回结果序列化方式RedisSerializer<String> resultSerializer = redisTemplate.getDefaultSerializer();Object execute = redisTemplate.execute(redisScript,argsSerializer, resultSerializer, Lists.newArrayList(key), value, seconds);return execute;}}

redis序列化方式对于value的处理区别:

1.GenericJackson2JsonRedisSerializer、Jackson2JsonRedisSerializer是先将对象转为json,然后再保存到redis,所以,1在redis中是字符串1,所以无法进行加1。2.JdkSerializationRedisSerializer使用的jdk对象序列化,序列化后的值有类信息、版本号等,所以是一个包含很多字母的字符串,所以根本无法加1。3.GenericToStringSerializer、StringRedisSerializer将字符串的值直接转为字节数组,所以保存到redis中是数字,所以可以进行加1

set扩展命令:
Redis在 2.6.12 版本开始,为 SET 命令增加一系列选项:

SET key value[EX seconds][PX milliseconds][NX|XX]

  • EX seconds: 设定过期时间,单位为秒
  • PX milliseconds: 设定过期时间,单位为毫秒
  • NX: 仅当key不存在时设置值
  • XX: 仅当key存在时设置值
    set命令的nx选项,就等同于setnx命令,代码过程如下:
jedis.set(key, value, "NX", "EX", seconds)

Lua脚本实现setnx命令相关推荐

  1. 【Redis Lua 脚本 可重入分布式锁】

    文章目录 前言 一.最简单的版本:setnx key value 获取锁成功 获取锁失败 释放锁 缺点 二.升级版本:set key value [ex seconds] [nx] 获取锁成功 获取锁 ...

  2. Lua脚本语言快速入门手册

    学了两天Lua语言,感叹其短小精悍,上手极快,语法还很舒服,不错!整理下学习过程中经常用到的基础知识,共勉! Lua用法简述 Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式 ...

  3. PHP中使用redis执行lua脚本示例

    一.引言 redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功 ...

  4. Redis中的Lua 脚本

    Lua/ˈluə/是一种轻量级脚本语言,它是用C 语言编写的,跟数据的存储过程有点类似.使用Lua 脚本来执行Redis 命令的好处: 1.一次发送多个命令,减少网络开销. 2.Redis 会将整个脚 ...

  5. Redis 中 Lua 脚本的应用和实践

    引言 前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重.后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还 ...

  6. 添加lua_非关系型数据库Redis之Lua脚本

    [本文详细介绍了非关系型数据库Redis中Lua脚本的基本概念和使用方法,欢迎读者朋友们阅读.转发和收藏!] 1 Lua 简介 Lua 是一个小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用 ...

  7. redis中使用lua脚本

    一.概述 1.什么是lua脚本 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放. 其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.因为广泛的应用于:游戏开 ...

  8. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现

    参考:<<Redis设计与实现>> 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异 Redis中Lua脚本相关命令介绍以及简单使用,参考博客:https://b ...

  9. Redis:EVAL执行Lua脚本

    EVAL 脚本 numkeys 键[键...] arg [arg ...] 自Redis2.6.0版本起可用. 时间复杂度:取决于执行的脚本. EVAL介绍 EVAL和EVALSHA用于从Redis2 ...

最新文章

  1. 085_Document对象
  2. CTFshow 文件上传 web167
  3. switchcase的用法
  4. jsp页面适应手机屏幕_HTML5之页面缩放 viewport
  5. Java根据表格生成图_java绘制数据表格并导出为图片格式
  6. Windows和Mac下获取(当前)进程内存占用
  7. 2018年让你的技术学习快人一步!
  8. jabber服务器_最近JavaScript Jabber播客-Microsoft(而非Microsoft)和Web
  9. 百度街景图片存MySQL
  10. 图片占位符placehold.it
  11. 亚马逊云科技与德勤中国同行,创造更智慧、美好的数字化未来
  12. 杂谈 跟编程无关的事情11
  13. 新猿木子李:0基础学python培训教程 什么是前端
  14. matlab符号计算实验心得,Matlab符号计算总结
  15. Jmeter二次开发准备-Jmeter插件开发
  16. RGB与HSV是什么,为什么要进行转换
  17. informix GBase锁表处理 | ISAM error: key value locked
  18. 错误类型:reflection.ReflectionException: Could not set property ‘xxx‘ of ‘class ‘xxx‘ with value ‘xxx‘
  19. 【论文精读】CMT: Convolutional Neural Networks MeetVision Transformers
  20. 入门UI设计一般要学习多久,学习哪些内容

热门文章

  1. Excel单元格下拉菜单的制作
  2. 跟着Cell Research学单细胞分析:以小提琴图、热图为例
  3. CF1025B Weakened Common Divisor
  4. 苦熬一个月,已获千赞
  5. Ptrace调试ARM架构多线程
  6. 计算机出现家庭组图标怎么删除,Win7系统如何删除资源管理器左侧导航栏“家庭组”图标...
  7. ubuntu14.04安装GTX 1080 ti显卡驱动以及遇到黑屏问题
  8. 纤亿通带您了解什么是综合布线
  9. IM即时通信多房间聊天室仿微信聊天(四)
  10. java生成pdf并下载