博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis实现分布式锁
阅读量:7080 次
发布时间:2019-06-28

本文共 3422 字,大约阅读时间需要 11 分钟。

hot3.png

  1. 普通方式

    1. 直接看代码

      1. package com.whereta.jedis;import org.springframework.stereotype.Component;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import javax.annotation.Resource;import java.util.Calendar;import java.util.Date;import java.util.concurrent.TimeUnit;/** * Created by vincent on 15-10-14. */@Component("jedisLock")public class JedisLock {    public class CacheName {        public static final String ADD_BEAN_AFTER_CHECK_LOCK_KEY = "ADDBeanAfterCheckLock";    }    @Resource    private JedisPool jedisPool;    public void addBeanAfterCheck(int userId) {        Jedis jedis = jedisPool.getResource();        Calendar calendar = Calendar.getInstance();        calendar.set(Calendar.MILLISECOND, 0);        Date calendarTime = calendar.getTime();        long time = calendarTime.getTime();        //以用户id为key,不同用户调用同一个方法不会加锁        String key = CacheName.ADD_BEAN_AFTER_CHECK_LOCK_KEY + ":" + userId;        try {            if (jedis != null) {                Long lock = jedis.setnx(key, time + "");                while (lock == 0) {                    TimeUnit.MILLISECONDS.sleep(50);                    lock = jedis.setnx(key, time + "");                }                //设置超时时间                jedis.expire(key, 3);            }            //自己的业务逻辑处理        } catch (Exception e) {            throw new RuntimeException(e);        } finally {            if (jedis != null) {                jedis.del(key);                jedis.close();            }        }    }}
    2. 示例中以用户id为key加锁:不同用户访问该方法的时候不会排斥等待

    3. 锁机制的实现利用了Redis的setnx方法:如果数据库里key存在了则不存储数据,返回0

    4. redis的该方法是线程安全的,可以放心使用

  2. aop方式

    1. 示例代码

      1. package com.whereta.jedis;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import javax.annotation.Resource;import java.util.Calendar;import java.util.Date;import java.util.concurrent.TimeUnit;/** * Created by vincent on 15-10-14. */@Aspect@Componentpublic class JedisLockAop {    @Resource    private JedisPool jedisPool;    @Around("execution(public * com.heli.core.pay.soaservice.impl.*.*(..))")    public Object serviceAOP(ProceedingJoinPoint point) {        Object proceed = null;        Jedis jedis = jedisPool.getResource();        Calendar calendar = Calendar.getInstance();        calendar.set(Calendar.MILLISECOND, 0);        Date calendarTime = calendar.getTime();        long time = calendarTime.getTime();        //请求参数数组        Object[] args = point.getArgs();        //key可以自定义        String key = JedisLock.CacheName.ADD_BEAN_AFTER_CHECK_LOCK_KEY + ":" + args[0];        try {            if (jedis != null) {                Long lock = jedis.setnx(key, time + "");                while (lock == 0) {                    TimeUnit.MILLISECONDS.sleep(50);                    lock = jedis.setnx(key, time + "");                }                //设置超时时间                jedis.expire(key, 3);            }            //用户业务处理            proceed = point.proceed();            return proceed;        } catch (Throwable throwable) {            throw new RuntimeException(throwable);        } finally {            if (jedis != null) {                jedis.del(key);                jedis.close();            }        }    }}
    2. 使用Spring Aop的环绕方法

    3. 具体key值可以自定义涉及,譬如:ip,时间等

转载于:https://my.oschina.net/vincentzhao/blog/517109

你可能感兴趣的文章
LINQ学习(扩展方法,委托,Lambda表达式) 第一篇
查看>>
Ext.tree.Panel示例
查看>>
Linux下查看某个进程的线程数量(转)
查看>>
前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例
查看>>
Linux安装mysql5.6
查看>>
kafka 主要内容介绍
查看>>
VirtualBox下安装ubuntu server 16.04
查看>>
VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
查看>>
Linux获取网页源码的几种方法
查看>>
write a python http server & client
查看>>
关于查看网页源文件不显示源代码(打开的是桌面文件夹)的问题
查看>>
关于STM32加密 (转,留个备份)
查看>>
艾伟:闲说继承
查看>>
UITableView
查看>>
程序员必知8大排序3大查找(二)
查看>>
iphone crash 日志查看
查看>>
编译apache报错 No recognized SSL/TLS toolkit detected
查看>>
Python进阶03 模块
查看>>
mac基本命令
查看>>
IOC疑惑
查看>>