关于redis分布锁(信号量)和存hash运用

本文主要介绍了在Java环境中如何使用Redis实现分布式锁和信号量。首先回顾了Redis的基本用法,接着引入了相关依赖并配置客户端初始化。然后详细阐述了如何利用Hash存储数据,以及如何利用信号量进行秒杀场景的数量控制。最后提到了从Redis中获取Value值的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.redis的基本用法已经在第一篇文章详细介绍过,就不再过多介绍,在使用redis分布锁的时候还要导一个依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.13.6</version>
</dependency>

2.再导入一个配置类用于客户端初始化

/**
 * redisson客户端初始化
 */
@Configuration
public class RedissonConfig {

    //创建客户端
    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456");
        return Redisson.create(config);
    }

3.用hash存入数据

redisTemplate.opsForHash().put("activity:"+activityId,killCoure.getId().toString(),killCoure);//activity是一个前缀,用来方便取数据;
"activity:"+activityId这个是第一个key,为了方便称呼为大key
killCoure.getId().toString()是因为第一篇万丈中redisconfig对hash的key做了序列化要用String类型,这是第二个key,称呼为小key;
killCoure这是存入redis的value值,我存的是一个对象;
整个用法如下:
redisTemplate.opsForHash().put(key1,key2,value)

4.用信号量存秒杀数量用法:

4.1注入:
 

@Autowired
private RedissonClient redissonClient;

4.2使用:
 

String key = activityId+":"+killCoure.getId();//这是用来获取redis中value的key
//获取每一个课程对应的信号量
RSemaphore semaphore = redissonClient.getSemaphore(key);
//设置秒杀数量
boolean setPermits = semaphore.trySetPermits(10000);//10000代表对应value值的数量

5.从redis中获取value值
 

Set<Object> keys = redisTemplate.keys("activity:*");//通过前缀获取到所有的大key
ArrayList<KillCourse> allcourses = new ArrayList<>();//定义一个list集合用来装数据
keys.forEach(key1->{//遍历以后直接用大key获取到所有value会返回一个List<Object>因为存的时候就是KillCourse所以去掉Object直接装入allcourses 中即可
    List killCourses = redisTemplate.opsForHash().values(key1);
    allcourses.addAll(killCourses);
});

<think>好的,我需要回答用户关于Redis支持的锁机制类型及其实现方式的问题。首先,我要回忆一下Redis常见的锁机制,记得有分布式锁,可能还有读写锁之类的。接下来,根据用户提供的引用,特别是引用[1]提到的可重入读写锁,应该详细说明这一点。 然后,用户还提到了其他引用,比如配置文件解决循环引用Apache Curator,不过这些可能锁机制关系不大,但需要确保不遗漏相关信息。需要确认Redis的锁机制主要有哪些,比如基本分布式锁、可重入锁、读写锁、红锁(RedLock)等。 接下来,每个锁的实现方式需要简要说明。比如基本分布式锁使用SET命令加锁,用Lua脚本释放锁。可重入锁可能涉及计数器,读写锁则区分读写锁。红锁是多个Redis实例的分布式锁,需要多数节点获取成功。 还要注意引用中的内容,比如引用[1]中的代码示例,说明Redisson的实现,可能需要提到客户端库如RedissonApache Curator(引用[3])。同时,引用[2]关于内策略可能影响锁的持久性,但用户问题主要关注锁的类型,这点可能次要。 需要组织回答结构,分点列出每种锁机制,包括类型、实现方式、特点相关引用。最后生成相关问题,如实现原理、选型对比、应用场景等,确保覆盖用户可能感兴趣的方向。 检查是否需要符合系统级指令,比如数学公式的格式,但问题中可能不涉及数学公式,所以可能不需要。回答使用中文,结构清晰,引用正确的位置,比如引用[1]在可重入读写锁部分,引用[3]在客户端库部分。确保每个引用只在相关部分末尾添加标识。</think>Redis支持多种分布式锁机制,用于解决分布式系统中的资源竞争问题。以下是主要类型及其实现方式: ### 一、基本分布式锁 通过$SET\ key\ value\ NX\ EX\ timeout$命令实现: - $NX$参数保证键不在时才设置成功 - $EX$参数设置自动过期时间避免死锁 - 释放锁时需要验证持有者身份并使用Lua脚本保证原子性[^3] ### 二、可重入锁 1. 通过计数器实现重入功能 2. 每次加锁时计数器+1,解锁时-1 3. 使用Hash结构储线程标识重入次数 ```lua if redis.call('exists', KEYS[1]) == 0 then redis.call('hincrby', KEYS[1], ARGV[2], 1) redis.call('pexpire', KEYS[1], ARGV[1]) return 1 end ``` (Redisson客户端实现了该机制[^1]) ### 三、读写锁 1. 通过RReadWriteLock接口实现 2. 读锁可共享:$rwlock.readLock().lock()$ 3. 写锁独占:$rwlock.writeLock().lock()$ 4. 支持自动续期超时释放[^1] ### 四、红锁(RedLock) 1. 在多个独立Redis节点上获取锁 2. 需要半数以上节点获取成功 3. 计算锁的有效时间时考虑时钟漂移 4. 提供更强的可靠性保障 ### 五、信号量 1. 通过计数器控制并发量 2. 使用$DECR$/$INCR$操作维护信号量 3. 支持公平信号量过期时间 实现建议: - 推荐使用Redisson等成熟客户端(支持看门狗自动续期) - 需要配合$maxmemory-policy$配置处理内限制[^2] - 分布式会话场景需注意锁与Session的关联性[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值