redisson

redisson 使用

1,导入依赖

<dependency>
   <groupId>org.redissongroupId>
   <artifactId>redissonartifactId>
   <version>3.12.5version>
dependency>

2,创建配置类

package com.woniu.config;

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 RedissConfig {

    @Bean
    public RedissonClient redisson(){
        //单机模式
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
        return  Redisson.create();
    }
}

3,代码实现

    @Autowired
    private RedissonClient redisson;

RLock lock = redisson.getLock("key");
try {
    //加锁
    //20: 若该线程第一次没有获取到锁,那么20秒内会 每隔 20/3 的时间尝试获取锁,直到20s过后才走到下一行代码
    //5:  锁的有效时间
    boolean result = lock.tryLock(20, 5, TimeUnit.SECONDS);
    //boolean result = lock.tryLock(); 若使用无参方法,若该线程第一次没有获取到锁,直接走到下一行代码,默认锁时间30s
    if(!result){
        System.out.println("没有抢到锁!");
        return;
    }
    //======业务代码==================
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    if(lock.isLocked() && lock.isHeldByCurrentThread()){
                lock.unlock();//释放锁
    }
}
课上代码
public ResponseData<?> startKill(Integer id) {
    RLock lock = redisson.getLock("lock");
    try {
        boolean b = lock.tryLock();//当前线程能不能获取锁
        //tryLock():锁默认时间30秒,每过30秒/3,会检测主线程有没有执行完,如果没有执行完,会给主线程执行时间续30秒(watch dog)
        if (b) {
            KillBook killBook = (KillBook) redisTemplate.opsForHash().get("killBook", String.valueOf(id));
            if (killBook != null && killBook.getKillNum() > 0) {
                killBook.setKillNum(killBook.getKillNum() - 1);
                System.out.println("商品库存" + killBook.getKillNum());
                redisTemplate.opsForHash().put("killBook", String.valueOf(id), killBook);
                return new ResponseData<>().ok(null);
            } else {
                return new ResponseData<>().fail();
            }
        } else {
            return new ResponseData<>().fail();
        }
    } finally {
        //判断有没有加上锁,和判断此锁是不是当前线线程锁持有的(只有加上锁,才能释放锁)
        if(lock.isLocked() && lock.isHeldByCurrentThread()){
            lock.unlock();//释放锁
        }

    }
}

在这里插入图片描述

redisson_第1张图片

中间函数 可以有很多次:filter map sorted limit distinct

终端操作 一次:forEach count max

g-exrbTBVf-1691409467848)]

中间函数 可以有很多次:filter map sorted limit distinct

终端操作 一次:forEach count max

你可能感兴趣的:(java,mybatis,spring)