Skip to content

中文帮助文档

lihao edited this page Dec 25, 2021 · 3 revisions

快速开始

安装(PS:三种模式只能选择一种)

  1. Redis Template模式

        <dependency>
            <groupId>io.github.pearstack</groupId>
            <artifactId>lock-redis-template-spring-boot-starter</artifactId>
            <version>0.0.3</version>
        </dependency>
  2. Redisson 模式

        <dependency>
            <groupId>io.github.pearstack</groupId>
            <artifactId>lock-redisson-spring-boot-starter</artifactId>
            <version>0.0.3</version>
        </dependency>
  3. ZooKeeper 模式

        <dependency>
            <groupId>io.github.pearstack</groupId>
            <artifactId>lock-zookeeper-spring-boot-starter</artifactId>
        	<version>0.0.3</version>
        </dependency>

全局配置文件

spring:
  lock:
    # 锁key的前缀, 默认为lock, 可不设置
    prefix: lock
    # 锁过期时间, 默认为30秒, 可不设置
    expire: 30
    # 获取锁超时时间, 默认为3秒, 可不设置
    acquire-timeout: 3
    # 获取锁失败时重试间隔时间, 默认为1秒, 可不设置
    retry-interval: 1
    # 时间单位, 默认为秒, 可不设置
    unit: seconds
    # ZooKeeper 模式
    zookeeper:
      host: xxx.xxx.xxx.xxx
# Redis 模式
  redis:
    host: xxx.xxx.xxx.xxx

在需要使用分布式锁的地方添加对应注解

package com.lihao.lock.controller;

import io.github.pearstack.lock.annotation.Locked;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class TestController {

  public static Integer apple = 200;
  public static Integer pear = 200;

  /**
   * 带分布式锁, 不会出现超卖
   *
   * @param appleId
   * @return
   */
  @Locked(keys = "#appleId")
  @GetMapping("/get/apple")
  public String getApple(Long appleId) {
    if (apple <= 0) {
      return "对不起, 已经没货了!";
    } else {
      apple = apple - 1;
      log.info("购买成功, 现在apple数量为:{}", apple);
      return "购买成功!";
    }
  }

  /**
   * 不带分布式锁, 会出现超卖
   *
   * @param pearId
   */
  @GetMapping("/get/pear")
  public String getPear(Long pearId) {
    if (pear <= 0) {
      return "对不起, 已经没货了!";
    } else {
      pear = pear - 1;
      log.info("购买成功, 现在pear数量为:{}", pear);
      return "购买成功!";
    }
  }
}

自定义分布式锁key name

package com.lihao.lock.service;

import io.github.pearstack.lock.service.GetLockKeyService;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Service;

@Service
public class GetLockKeyServiceImpl implements GetLockKeyService {

    /**
     * 获取分布式锁名称
     *
     * @param joinPoint aop切面方法
     * @param name      对应注解的name属性
     * @param keys      对应注解的keys属性
     * @param separator 分布式锁key的分隔符, redis默认是: , zookeeper默认是/
     * @return 分布式锁名称
     */
    @Override
    public String getKey(JoinPoint joinPoint, String name, String[] keys, String separator) {
        return "testOnLocked";
    }
}

自定义上锁失败业务

package com.lihao.lock.service;

import io.github.pearstack.lock.service.OnLockFailedService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;

@Slf4j
@Service
public class OnLockFailedServiceImpl implements OnLockFailedService {

    /**
     * 失败失败调用接口
     *
     * @param method    对象
     * @param arguments 异常信息
     */
    @Override
    public void onLockFailed(Method method, Object[] arguments) {
        log.error("上锁异常!");
    }
}