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 ...
随机推荐
- 好云推荐官丨飞天加速之星怎样选择云服务器ECS?
编者按:本文来自"好云推荐官"活动的技术博主投稿,作者(昵称天狼)曾入选首届"飞天加速之星",获得飞天人气奖. 你是否还在苦苦地寻找一家合适的云厂商,寻找合 ...
- 使用MQTT与函数计算做热力图的实践
简介: 在各类场景中,关于上报数据的处理无处不在,而以上提到的场景都可以通过本方案的MQTT+FC+API Gateway的方式参考优化来实现. 前言 最近几年,我们在一些商场.图书馆.机场或港口环境 ...
- 阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段
简介: 业务中台产品BizWorks重磅发布,这可以看作是阿里云在 "做厚中台" 战略上继 "云钉一体"之后的又一个新动作! 10 月 19 日,2021 云 ...
- [FAQ] Vmmem 内存占用高的问题 -Win10 -WLS2
1按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹 2新建文件 .wslconfig ,然后记事本编辑 3 填入以下内容并保存, memory为系统内存上限,这里 ...
- [FE] ServerSideRender 加上 PWA 特性的一种处理方式
SSR 和 PWA 这两块分开讲,需要做不少的处理,现在我们有了一种简便的方式来处理它,就是使用 Quasar 框架. Quasar 支持了 SPA.SSR.PWA.Mobile APP.Electr ...
- OLAP开源引擎对比之历史概述
前言 OLAP概念诞生于1993年,工具则出现在更早以前,有史可查的第一款OLAP工具是1975年问世的Express,后来走进千家万户的Excel也可归为此类,所以虽然很多数据人可能没听过OLAP, ...
- Google C++ 语言规范
1. 命名空间 KeyNotes: 鼓励在.cc文件里使用匿名命名空间或者sttic声明 禁止使用内联命令空间,X::Y::foo 等价与X::foo.其主要用于跨版本的ABI兼容问题 namespa ...
- GDB 中内存打印命令
GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr".含义为以 f 格式打印从 addr 开始的 n 个长度单元为 u 的内存值.参数具 ...
- ansible(11)--ansible的user和group模块
1. group模块 功能:管理被控端用户组: 主要参数如下: 参数 说明 name 指定创建的组名 gid 为组设置gid state 是否将组创建在远程主机上,创建:present(Default ...
- WEB服务与NGINX(10)-NGINX访问控制功能
目录 1.NGINX访问控制功能 1.1 基于ip地址的访问控制 1.2 基于用户名密码的认证 1.NGINX访问控制功能 nginx的访问控制有两种方式: 基于ip进行限制,由ngx_http_ac ...