【工具类】RedisUtil 操作相关

目标

一行代码调用

安装

redis

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

hutool 工具类

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>

配置

spring:data:redis:host: xxxport: 6379password: xxxdatabase: x

配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** 方便获取 Spring IOC 实例** @author jason*/
@Configuration
@Import(cn.hutool.extra.spring.SpringUtil.class)
public class BeanConf {
}

工具类

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;/*** Redis 操作工具类** @author jason*/
@Slf4j
@Component
public class RedisUtil {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public static RedisUtil instance() {return SpringUtil.getBean(RedisUtil.class);}/*** set*/public static void set(String key, Object value) {instance().stringRedisTemplate.opsForValue().set(key, StrUtil.toStringOrNull(value));}/*** get*/public static String get(String key) {return instance().stringRedisTemplate.opsForValue().get(key);}/*** decr 扣减*/public static Long decrement(String key) {return instance().stringRedisTemplate.opsForValue().decrement(key);}/*** incr 增加*/public static Long increment(String key) {return instance().stringRedisTemplate.opsForValue().increment(key);}/*** 无锁:decr 扣减 + incr 回滚*/public static boolean decrementCouponId(String couponId) {// 库存 - 1Long decrementNum = RedisUtil.decrement(couponId);log.info("优惠券扣减后库存:{}", decrementNum);// 库存 + 1if (decrementNum < 0) {Long incrementNum = RedisUtil.increment(couponId);log.info("优惠券回滚后库存:{}", incrementNum);return false;}return true;}/*** 无锁:lua + decr 扣减*/public static Boolean luaDecrCid(String couponId) {// Lua 脚本String script = """local couponId = KEYS[1]local value = tonumber(redis.call('GET', couponId))if value > 0 thenredis.call('DECR', couponId)return trueelsereturn falseend""";DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(script, Boolean.class);return instance().stringRedisTemplate.execute(redisScript, CollectionUtil.newArrayList(couponId));}/*** 无锁:lua + decr 扣减** 限制:1个用户,1张券*/public static Boolean luaUserCid(String userId, String couponId) {// Lua 脚本String script = """local userId = KEYS[1]local couponId = KEYS[2]local isUserSuccess = redis.call('GET', userId)local value = tonumber(redis.call('GET', couponId))if isUserSuccess ~= "true" and value > 0 thenredis.call('DECR', couponId)redis.call('SET', userId, "true")return trueelsereturn falseend""";DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(script, Boolean.class);return instance().stringRedisTemplate.execute(redisScript, CollectionUtil.newArrayList(userId, couponId));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502472.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx (40分钟学会,快速入门)

一、什么是Nginx ? 可以做什么 &#xff1f; Nginx 是高性能的 HTTP 和反向代理的 web 服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负载的考验&#xff0c;有报告表明能支持高达50000个并发的连接数.Nginx特点就是内存少&#xff0c;并发能力强。事实上…

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数&#xff0c;那么它就可…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础&#xff0c;整合OkhttpRxJavaRetrofitGlide等流行…

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 3 今天&#xff0c;我们要一起学习大模型微调了 &#xff5e; 包括&#xff1a;大模型微调领域概览、Lora微调 等 &#xff5e; 文章目录 7 天 AI 大模型学习 Day 3大模型微调概览大模型项目 pipeline提示词工程 Prompt EngineeringIn-context Learning…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…

DeepSeek-V3 正式发布,已在网页端和 API 全面上线,性能领先,速度飞跃。

DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 简介 DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型&#xff0c;总共有 671B 个参数&#xff0c;…

图像超分辨新SOTA!南洋理工提出InvSR,利用大型预训练扩散模型图像先验来提高 SR 性能, 登上Huggingface热门项目。

南洋理工大学的研究者们提出了一种基于扩散反演的新型图像超分辨率 (SR) 技术&#xff0c;可以利用大型预训练扩散模型中蕴含的丰富图像先验来提高 SR 性能。 该方法的核心是一个深度噪声预测器&#xff0c;用于估计前向扩散过程的最佳噪声图。一旦训练完成&#xff0c;这个噪…

MySQL低版本没有函数row_number() over的解决方案

最近在维护老项目时&#xff0c;需要对历史数据做分析取出分区数据中的第一条&#xff0c;无奈因为MySQL版本过低&#xff0c;无法使用函数row_number() over&#xff0c;苍了个天~ 不过这点小事怎么可能难倒我们这群考古专家呢&#xff0c;在此分享一下解决方案。 主要原因是问…

贵州省贵安新区地图+全域数据arcgis格式shp数据矢量路网地名+卫星影像底图下载后内容测评

贵州省贵安新区地图全域数据arcgis格式shp数据矢量路网地名卫星影像底图 贵安新区地图是一款基于ArcGIS格式的地理信息系统数据集&#xff0c;包含2022年3月更新的详尽矢量路网、地名信息以及卫星影像底图。这款数据集是针对贵安新区这一特定区域设计的&#xff0c;对于规划、…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现

一、引言 从《音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;3&#xff09;——MPEG2-PS格式简介》中可以知道&#xff0c;PS流由一个个pack&#xff08;包装&#xff09;组成。一个pack 一个pack_header 一个或多个PES_packet。pack_header中还可能存在system header…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

【问题记录】npm create vue@latest报错

1&#xff0c;错误日志 npm error code EPERM npm error syscall mkdir npm error path D:\Program Files\nodejs\node_cache\_cacache npm error errno EPERM npm error FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/create-vue: EP…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…

Vue3实现PDF在线预览功能

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue3现PDF在线预览功能 前言 在开发中&#xff0c;PDF预览和交互功能是一个常见的需求。无论是管理…

win32汇编环境,在窗口程序中画简单图形

;运行效果 ;win32汇编环境&#xff0c;在窗口程序中画简单图形 ;展示点、直线、圆、椭圆、正方形、矩形、圆角矩形的画法 ;将代码复制进radasm软件里&#xff0c;直接编译可运行.重要部分加备注。 ;>>>>>>>>>>>>>>>>>>&…

[7种方法] 如何修复iPad无法连接到App Store

“现在已经 3 天了&#xff0c;我无法从 iPad 连接到 App Store。起初&#xff0c;我以为这是服务器问题&#xff0c;但已经过去 3 天了&#xff0c;问题仍然存在。请帮助我&#xff01;” 如果您的iPad 无法连接到 App Store&#xff0c;可能有多种原因。即使是日期和时间设置…

weblogic安装 12.2.1.4.0 单机

fmw_12.2.1.4.0_wls.jar和jdk-8u341-linux-x64.tar.gz&#xff0c;安装weblogic 安装JDK 8 # 1. 创建Java安装目录 mkdir -p /usr/java cd /usr/java# 2. 解压JDK tar -zxvf jdk-8u341-linux-x64.tar.gz# 3. 配置环境变量 cat >> /etc/profile << EOF export JAV…

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…

SpringBoot+Vue养老院管理系统设计与实现【开题报告+程序+安装部署+售后讲解】

【1】系统介绍 一、研究背景 随着中国人口老龄化的加剧&#xff0c;养老问题已成为社会关注的热点话题。传统的养老服务模式难以满足日益增长的老年人群体的需求&#xff0c;尤其是在信息化和智能化方面存在明显不足。为了提高养老服务效率&#xff0c;改善老年人生活质量&am…