redis锁定商品解决并发售卖问题 RedisUtil工具类
redis锁定商品解决并发售卖问题 RedisUtil工具类
redis数据类型介绍:
//伪代码,基本思路
//1.出redis,每次在选定商品之后,先检查redis是否已经锁定该商品,避免超卖。
Set<String> cacheList = redisUtilService.getSetValue(redisMapKey);
if(CollectionUtils.isNotEmpty(cacheList)) {
//判断商品等属性,比如租期是否已经重叠等,商品是否已经锁定卖出等,避免重复售卖。
}
//2.入redis,售卖成功,增加到redis中
redisUtilService.setSetValue(redisMapKey, redisMapValueStr);
redisUtilService.expireMinute(redisMapKey, RENTER_TIME_OVERLAPPING_REDIS_EXPIRE_MINUTE);
//RedisUtilService.java工具类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.stereotype.Service; import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit; @Service
public class RedisUtilService {
@Autowired
private StringRedisTemplate redis; /**
* 从redis缓存中取值
* @param key
* @return
*/
public String getValue(String key) {
return redis.opsForValue().get(key);
}
/**
* 往redis缓存存zset值
* @param key
* @param customerId
* @param inviterCounts
*/
public void setZsetValue(String key,String customerId,double inviterCounts){
redis.opsForZSet().add(key, customerId, inviterCounts);
} /**
* Set无序集合赋值
* @param key
* @param customerId
*/
public void setSetValue(String key,String customerId){
redis.opsForSet().add(key, customerId);
} /**
* Set无序集合获取
* @param key
* @return
*/
public Set<String> getSetValue(String key){
return redis.opsForSet().members(key);
} /**
* 倒序根据score下标取zset值
* @param key
* @param start
* @param end
* @return
*/
public Set<TypedTuple<String>> getZsetValue(String key,long start, long end ){
return redis.opsForZSet().reverseRangeWithScores(key, start, end);
}
/**
* 获取value对应的socre
* @param key
* @param o
* @return
*/
public Double getZsetScore(String key,Object o){
return redis.opsForZSet().score(key, o);
}
/**
* 获取value对应的排名(倒序)
* @param key
* @param o
* @return
*/
public Long getZsetRank(String key,Object o){
return redis.opsForZSet().reverseRank(key, o);
} /** 获取redis元素数量
* @param key
* @return
*/
public Long getZsetLength(String key){
return redis.opsForZSet().size(key);
}
/**
* 有时间期限的往缓存中设值
* @param key
* @param value
* @param second
*/
public void setValue(String key, String value, Long second) {
redis.opsForValue().set(key, value, second, TimeUnit.SECONDS);
} /**
* 有时间期限的往缓存中设值
* @param key
* @param value
* @param day
*/
public void setValueWithDayTTL(String key, String value, Long day) {
redis.opsForValue().set(key, value, day, TimeUnit.DAYS);
} /**
* 删除制定key值得缓存
* @param key
*/
public void removeKey(String key) {
redis.delete(key);
} public void setObjectValue(String key,Object obj){
redis.opsForValue().set(key, GsonUtils.toJson(obj));
} public void setObjectValue(String key,Object obj,Long second){
redis.opsForValue().set(key, GsonUtils.toJson(obj),second,TimeUnit.SECONDS);
} /**
* 入队(可用作消息队列)
* @param key
* @param value
* @return
*/
public Long in(String key, String value) {
return redis.opsForList().rightPush(key, value);
} /**
* 出队 (可用作消息队列)
* @param key
* @return
*/
public String out(String key) {
return redis.opsForList().leftPop(key);
} /**
* 队列长
* @param key
* @return
*/
public Long length(String key) {
return redis.opsForList().size(key);
}
/**
* 对指定key值 +1,key不存在,默认返回1
*
* @Title: increaseByOne
* @Description:对指定key值 +1
* @param key
* @return Long 返回类型
* @throws
*/
public Long incrementOne(String key){
return redis.opsForValue().increment(key, 1L);
} /**
* 对指定key值 +1,key不存在,默认返回1
*
* @Title: increaseByOne
* @Description:对指定key值 +1
* @param key
* @return Long 返回类型
* @throws
*/
public Long decrementOne(String key){
return redis.opsForValue().increment(key, -1L);
}
/**
* 对指定key值加减计算 ,key不存在,默认返回1
*
* @Title: increaseByNum
* @Description:对指定key值加减计算
* @param key
* @return Long 返回类型
* @throws
*/
public Long incrementByNum(String key,Long nums){
return redis.opsForValue().increment(key, nums);
} /**
* 按指定的key进行上锁,true-加锁成功(名字为key的锁,并设置超时),false-加锁失败(表明已存在对应key的锁,加锁失败应停止后续业务操作)
*
* @Title: setIfAbsent
* @Description: 设定指定key的值,若key值已经存在,设置不成功并返回false,key不存在,设置成功,返回true
* @param key
* @param second 过期时间
* @return Boolean true-加锁成功(名字为key的锁,并设置超时),false-加锁失败(表明已存在对应key的锁)
* @throws
*/
public Boolean checkAndSetLock(String key,long second){
String lockValue = "Lock";
boolean res = redis.opsForValue().setIfAbsent(key,lockValue);
if(res){
redis.opsForValue().set(key,lockValue,second,TimeUnit.SECONDS);
}
return res;
} public void deleteLock(String key){
redis.delete(key);
} public Long getExpire(String key) {
return redis.getExpire(key, TimeUnit.SECONDS);
} public boolean expire(String key,long second) {
return redis.expire(key, second, TimeUnit.SECONDS);
} public boolean expireDay(String key,long day) {
return redis.expire(key, day, TimeUnit.DAYS);
} public boolean expireMinute(String key,long minute) {
return redis.expire(key, minute, TimeUnit.MINUTES);
} public void setValueHash(String key,String hashKey,String value) { redis.opsForHash().put(key, hashKey, value);
} public List<String> getValuesHash(String key) { HashOperations<String, String, String> hashOperations = redis.opsForHash();
List<String> values = hashOperations.values(key);
return values; } public void deleteHashKey(String key,String ...hashKeys){
redis.opsForHash().delete(key, hashKeys);
} public void deleteSetKey(String key){
redis.opsForSet().remove(key);
} }
redis锁定商品解决并发售卖问题 RedisUtil工具类的更多相关文章
- 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途
1.新知识普及 2. Semaphore工具类的使用案例 package com.java5.thread.newSkill; import java.util.concurrent.Executor ...
- java操作redis集群配置[可配置密码]和工具类(比较好用)
转: java操作redis集群配置[可配置密码]和工具类 java操作redis集群配置[可配置密码]和工具类 <dependency> <groupId>red ...
- java操作redis集群配置[可配置密码]和工具类
java操作redis集群配置[可配置密码]和工具类 <dependency> <groupId>redis.clients</groupId> & ...
- RedisUtil 工具类
package com.test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import red ...
- RedisUtil工具类
转载:http://blog.csdn.net/liuxiao723846/article/details/50401406 1.使用了jedis客户端,对redis进行了封装,包括: 1)使用了re ...
- 使用redis分布式锁解决并发线程资源共享问题
众所周知, 在多线程中,因为共享全局变量,会导致资源修改结果不一致,所以需要加锁来解决这个问题,保证同一时间只有一个线程对资源进行操作 但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一 ...
- Java多线程与并发库高级应用-工具类介绍
java.util.concurrent.Lock 1.Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互 ...
- 2018.12.1 web项目中解决乱码问题的一个工具类
<!-- 配置一个过滤器 编码格式的过滤器 --> <filter> <filter-name>encodeFilter</filter-name> & ...
- java Redis工具类
redis就是一个nosql数据库,做存储做缓存的,java代码中就是嵌入了一个客户端,读取与存储数据而已. 先来一个简单的工具类: package com.ming.redis; import re ...
- SpringBoot整合Redis及Redis工具类
前言 想做一个秒杀项目,问了几个大佬要了项目视频,结果,自己本地实践的时候,发现不太一样,所以写下这篇,为以后做准备. 环境配置 IDE:IDEA 环境:Windows 数据库:Redis Maven ...
随机推荐
- 压测场景下的 TIME_WAIT 处理
简介: 压测场景下的 TIME_WAIT 处理 1. 序 某专有云项目具备压测场景,在Windows的压测机上用 LoadRunner 进行业务的压力测试,压测运行一段时间后出现大量端口无法分配的报错 ...
- 【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
简介:Hadoop社区版CDH/HDP已经不再更新,也将终止服务.后续的平台路线图怎么规划?Cloudera CDP整合了CDH和HDP,有哪些性能提升和功能增强?如何平滑的进行迁移?本文结合CDH ...
- 业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!
简介: Inclavare Containers 通过云原生计算基金会(CNCF)TOC 投票正式成为 CNCF 官方沙箱项目. 作者|彦荣 2021 年 9月 15 日,Inclavare C ...
- [FAQ] edge debug栏的网络里 没有见到 All Fetch/XHR JS CSS 这些东西
一种方式是 打开调试器的设置,重置默认并刷新即可. 另一种方式是把这个 "筛选" 点掉. Tool:揭开网站所用的技术 Link:https://www.cnblogs.com ...
- [Gin] gin-jwt 中间件的请求流程与使用思路
gin-jwt 中间件是对 jwt-go 的封装以适应 gin 框架.gin-jwt 对不同的请求流程有不同的 handler: 登录请求流程 是用 LoginHandler. 需要 jwt 令牌的后 ...
- [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract
我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...
- 前端关于获取网络时间的方法api
淘宝 http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp 苏宁http://quan.suning.com/getSys ...
- C语言程序设计-笔记2-分支结构
C语言程序设计-笔记2-分支结构 例3-1 简单的猜数游戏.输入你所猜的整数(假定1-100),与计算机产生的被猜数比较,若相等,显示猜中:若不等,显示与被猜数的大小关系. /*简单的猜数游戏*/ ...
- 【详细教程】手把手教你开通YouTube官方API接口(youtube data api v3)
一.背景调查 1.1 youtube介绍 众所周知,youtube是目前全球最大的视频社交平台,该平台每天产生大量的视频内容,涵盖各种主题和类型,从音乐视频到教育内容,再到娱乐节目和新闻报道等.You ...
- 虚拟服务器VirtualBox不要太好用
在工作和学习前端的路上遇到过太多的坑,就是跳进坑里了,还要勇敢的爬起来. 本章真的想真心实意的推荐一下,超好用的虚拟服务器.你还在纠结window环境和Mac本的区别吗?是不是上班用的window电脑 ...