首页 > 数据库 >redis锁定商品解决并发售卖问题 RedisUtil工具类

redis锁定商品解决并发售卖问题 RedisUtil工具类

时间:2023-12-20 23:13:30浏览次数:25  
标签:return String redis param key RedisUtil public 售卖

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);
    }

}

 

标签:return,String,redis,param,key,RedisUtil,public,售卖
From: https://www.cnblogs.com/oktokeep/p/17917833.html

相关文章

  • redis分布锁
    1.什么是redis分布式锁Redis分布式锁是一种利用Redis实现的锁机制,用于在分布式系统中保护共享资源的访问。它利用Redis的原子性操作和过期时间设置来实现互斥访问。在分布式环境中,多个进程或线程可能同时访问共享资源,如果没有合适的机制来保护共享资源,就会导致数据不一致或竞争......
  • Redis7 BigKey
    1、MoreKey1.1、大数据模拟往redis插入大量数据进行测试for((i=1;i<=100*10000;i++));doecho"setk$iv$i">>/tmp/redisTest.txt;done;通过redis提供的管道--pipe命令插入100W大批量数据cat/tmp/redisTest.txt|/opt/redis-7.0.0/src/redis-cli-h127.0.0.1-p6379-a......
  • Redis缓存
    Redis(RemoteDictionaryServer)是一个开源的高性能键值对(key-value)存储系统,常被用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。 为什么要用Redis?使用Redis有多个原因,包括:高性能:Redis是基于内存存储计算的,其性能速度远超MySQL等数......
  • Redis异常问题分析黄金一分钟
    Redis异常问题分析黄金一分钟背景同事发现一个环境redis比较卡顿,导致业务比较难以开展.问题是下午出现的.六点左右找到我这边.想着帮忙看看,问题其实没有定位完全,仅是发现了一个可能的点.所以想记录一下,备查步骤登录redis进行查看处理的过程:1.infomemor......
  • MongoDB、Elasticsearch、Redis、HBase应用场景分析
    1.MongoDB一个基于分布式文件存储的数据库系统,由C++编写,旨在为Web应用提供高速、可扩展、高性能的数据存储解决方案。MongoDB采用了文档型数据库模型,即数据以文档的形式存储,而文档是由键值对组成的。MongoDB的名称来自Hadoop创始人DougCutting的宠物狗Mongo。  应用场景......
  • Redis全文搜索教程之创建索引并关联源数据
    Redis全文搜索是依赖于Redis官方提供的RediSearch来实现的。RediSearch提供了一种简单快速的方法对hash或者json类型数据的任何字段建立二级索引,然后就可以对被索引的hash或者json类型数据字段进行搜索和聚合操作。这里我们把被索引的hash或者json类型数据叫做......
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩
    ......
  • 【转载】Redis 6.x 学习笔记
    参考http://www.redis.cn/https://www.runoob.com/redis/redis-data-types.htmlhttps://developer.aliyun.com/article/1095427https://zhuanlan.zhihu.com/p/445885116https://blog.csdn.net/liu_dongdong55/article/details/120881332https://blog.csdn.net/weixin_435......
  • Redis和Mysql如何保证数据一致性?
    1、redis作用:用于读数据库操作的缓存层,可以减少数据库的io,还能提升数据的io性能;无法保证数据的acid2、实现一致性方案:1、先更新数据库,在更新缓存2、先删除缓存再更新数据库3、最终一致性方案: (1)基于roketMQ可靠通信 (2)通过canal组件采集mysqlbinlog日志,同步redis......
  • Redis 主从集群搭建并使用 RedisTemplate 实现读写分离
    单机版的Redis能够承载并发访问的能力有限,对于绝大多数的系统而言,都是读多写少,系统之所以宕机,一般都是因为并发读操作太高导致的宕机,因此搭建Redis主从集群,实现读写分离,是一种有效的提高并发访问能力的方案。本篇博客介绍在一台虚拟机上,使用docker-compose模拟搭建一个【一......