使用Redisson的准备工作
1、导入依赖
<!-- 以后使用redisson作为分布式锁,分布式对象等功能框架 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.8</version> </dependency>
2、设置Redission配置类
package com.saodai.saodaimall.saodaimall.seckill.config; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; /** * redission分布式锁配置类 */ @Configuration public class MyRedissonConfig { /** * 所有对Redisson的使用都是通过RedissonClient * @return * @throws IOException */ @Bean(destroyMethod="shutdown") public RedissonClient redisson() throws IOException { //1、创建配置 Config config = new Config(); //配置虚拟机的地址 config.useSingleServer().setAddress("redis://192.168.241.128:6379"); //2、根据Config创建出RedissonClient实例(单个实例) //Redis url should start with redis:// or rediss:// RedissonClient redissonClient = Redisson.create(config); return redissonClient; } }
本商城项目哪里用到了Redisson
秒杀服务
1、秒杀服务中定时任务的秒杀商品上架的库存存入redis时就用到了redission实现分布式信号量
下面分布式信号量设置时就会把信号量以库存的格式key:seckill:stock:随机码 value:秒杀商品的总数量存到reids缓存中
@Autowired private RedissonClient redissonClient; /**5、使用库存作为分布式Redisson信号量(限流)**/ //获取分布式信号量,信号量名称为seckill:stock:+随机码 RSemaphore semaphore = redissonClient.getSemaphore(SKU_STOCK_SEMAPHORE + token); // 秒杀商品的库存数量作为信号量的值(允许同时seckillSkuVo.getSeckillCount()个用户获取到信号量) semaphore.trySetPermits(seckillSkuVo.getSeckillCount());
2、秒杀时具体实现
@Autowired private RedissonClient redissonClient; //分布式锁 RSemaphore semaphore = redissonClient.getSemaphore(key); //尝试快速拿到信号量,100毫秒没有用拿到就返回false //在指定的时间内尝试地获取1个许可,如果获取不到就返回false boolean semaphoreCount = semaphore.tryAcquire(num, 100, TimeUnit.MILLISECONDS);