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 ...
随机推荐
- 分久必合的Lindorm传奇
简介: 2009年,阿里巴巴首先提出用分布式架构替代传统商业数据库,成功用自主开源的AliSQL支撑双11数据洪流:2016年,为应对超大规模业务场景,阿里云开始自研分布式数据库.十余年间,阿里巴巴数 ...
- 2018-2-13-win10-uwp-修改CalendarDatePicker图标颜色
title author date CreateTime categories win10 uwp 修改CalendarDatePicker图标颜色 lindexi 2018-2-13 17:23:3 ...
- UCenter 1.6 数据字典
uc_admins 管理员权限表 字段名 数据类型 默认值 允许非空 自动递增 备注 uid mediumint(8) unsigned NO 是 用户ID username char(15) ...
- 14、web 中间件加固-Tomcat 加固
1.用户配置 如果不需要控制台管理,请更改控制台用户文件注销账号信息:如果需要,请更改账户信息 修改 tomcat/conf/tomcat-user.xml 文件 注释或修改如下信息 <role ...
- 一键自动化博客发布工具,用过的人都说好(segmentfault篇)
segmentfault是我在这些平台中看过界面最为简洁的博客平台了. 今天就以segmentfault为例,讲讲在blog-auto-publishing-tools中的实现原理. 前提条件 前提条 ...
- WEB集群 - LNMT集群架构部署zrlog
目录 1. 集群环境说明 2. NFS部署 3. mysql部署 4. redis部署 5. tomcat部署 6. nginx负载均衡部署 7. 客户端访问 8. tomcat+redis实现会话共 ...
- GEOJSON 的渲染实例
createGeojson:function(arr) { let geoArr=[]; for(let i=0;i<arr.length;i++) { let obj={ "type ...
- 得物 ZooKeeper SLA 也可以 99.99%
1. 背景 ZooKeeper(ZK)是一个诞生于 2007 年的分布式应用程序协调服务.尽管出于一些特殊的历史原因,许多业务场景仍然不得不依赖它.比如,Kafka.任务调度等.特别是在 Flink ...
- Visual Studio中的四款代码格式化工具
前言 今天大姚给大家分享四款Visual Studio中的代码格式化工具.扩展插件.大家可以在Visual Studio中的管理扩展或者插件市场下载安装. 代码格式化工具的作用 自动调整代码的布局和风 ...
- Python基础篇(基础知识)
Python语言基础 pyc 文件 执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码. ...