秒杀活动(redission)

redission

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。简单说就是redis在分布式系统上工具的集合,Redission提供了分布式锁的多种多样的功能.

使用redission

自定义redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,如果拿到这个锁的线程在一分钟内没有执行完毕,那么这个锁就会被其他线程拿到,可能会导致严重的线上问题,在秒杀场景下,很容易因为这个缺陷导致的超卖了。

redission   超时时间1m  执行逻辑的时候3m  

Redisson 锁加锁流程:线程去获取锁,获取成功则执行lua脚本,保存数据到redis数据库。如果获取失败: 一直通过while循环尝试获取锁(可自定义等待时间,超时后返回失败)。Redisson提供的分布式锁是支持锁自动续期的,也就是说,如果线程仍旧没有执行完,那么redisson会自动给redis中的目标key延长超时时间,这在Redisson中称之为 Watch Dog 机制。

使用redission

加jar

  <dependency>
             <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
         <!--配置redission-->
         <dependency>
             <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
             <version>3.12.5</version>
         </dependency>

application文件

# 设置redis的信息

spring.redis.host=192.168.247.36

spring.redis.database=0

spring.redis.password=chn

spring.redis.port=6379

配置类:


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;

@Configuration
public class RedissionConfig {


       @Bean
     public RedissonClient getRedisson(){
                 Config config = new Config();
                 config.useSingleServer().
                         setAddress("redis://192.168.247.36:6379");
                 return Redisson.create(config);
             }

}

controller

package com.aaa.controller;

import com.aaa.config.RedissionConfig;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Objects;
import java.util.UUID;

@RestController
@RequestMapping("test")
public class RedissionController {

    private String key = "pro:1";
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private RedissonClient redisson;

    @PostMapping
    public void add() {
        redisTemplate.opsForValue().set(key,10);

    }

    @RequestMapping
    public void get() {

        //上锁
        RLock testlock = redisson.getLock("testlock");

        //开始业务
        try {
            // 尝试获取锁
            testlock.lock();
            Object o = redisTemplate.opsForValue().get(key);
            int i = Integer.parseInt(Objects.requireNonNull(o, "").toString());
            if (i > 0) {
                //库存减一
                redisTemplate.opsForValue().decrement(key);
                System.out.println("出售一个" + "还剩:" + redisTemplate.opsForValue().get(key));
                redisTemplate.opsForList().leftPush("usr", UUID.randomUUID());
            } else {
                System.out.println("没货了,没抢到!");
            }
        } finally {
            testlock.unlock();
        }
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值