分布式锁具有的特性:

1、排他性:

  文件系统:

数据库:主键 唯一约束 for update

    性能较差,容易出现单点故障

    锁没有失效时间,容易死锁

缓存Redis:setnx

    实现复杂:

    存在死锁(或短时间死锁)的可能

zookeeper:类似文件系统

实现相对简单

    可靠性高

    性能较好

应用场景:

自动生成编码,格式为:"YYYYMMDD001"

多客户同时提交数据,数据库里出现多人存储一个编码。应实现效果,每人一个编码。

解决方案:

1、在redis里,创建一个编码池(每天凌晨1点初始化)。

2、每次项目启动,初始化redis编码池

3、编码池里没有编码,去数据库里查询当天最大编码,然后+1

@Component
public class CodeNumPool implements ApplicationRunner { @Autowired
private ICodeNumRedisService codeNumRedisService; @Autowired
private PeopleBusinessBasicInfoRepository peopleBusinessBasicInfoRepository; /**
* @Author: qsy
* @Date: Created in 上午 11:24 2019/1/3/003
* @Description: 每天1:00重置编码池
*/
@Scheduled(cron = "0 0 1 * * ?")
public void ResetCodeNoPool() {
codeNumRedisService.deleteCodeNumPool();
codeNumRedisService.initCodeNumPool(1);
} /**
* @Author: qsy
* @Date: Created in 下午 4:59 2019/1/3/003
* @Description: 项目一启动就初始化redis编码池
*/
@Override
public void run(ApplicationArguments args) throws Exception {
String oldCodeNo = peopleBusinessBasicInfoRepository.findNewCodeNo();
String codeNum = CodeNoUtils.getDateStr(oldCodeNo);
Integer no = StringUtil.stringToInteger(codeNum.substring(9, 13));
codeNumRedisService.deleteCodeNumPool();
codeNumRedisService.initCodeNumPool(no);
}
}
public interface ICodeNumRedisService {

    /**初始化编码池*/
boolean initCodeNumPool(int no); /**获取编码*/
String getCodeNum(); /**清空编码池*/
boolean deleteCodeNumPool(); }
@Service
public class CodeNumRedisServiceImpl implements ICodeNumRedisService {
@Autowired
private RedisTemplate<String, String> redisTemplate; /**
* @Author: qsy
* @Date: Created in 下午 3:01 2019/1/3/003
* @Description: 初始化编码池
*/
@Override
public boolean initCodeNumPool(int no) {
Boolean res = redisTemplate.opsForValue().setIfAbsent(Constans.INIT_NUM_LOCK, Constans.INIT_NUM_LOCK);
if (res) {
ListOperations<String, String> list = redisTemplate.opsForList();
for (int i = no; i < Constans.MAX_NUM; i++) {
String codeNo = StringUtil.DecimalFormat(i, Constans.FORMAT);
list.leftPush(Constans.CODE_NUM_POOL, "P" + DateUtil.getReqDate() + codeNo);
}
redisTemplate.delete(Constans.INIT_NUM_LOCK);
} return true;
} /**
* @Author: qsy
* @Date: Created in 下午 3:01 2019/1/3/003
* @Description: 获取编码
*/
@Override
public String getCodeNum() {
//加锁
while (true) {
Boolean res = redisTemplate.opsForValue().setIfAbsent(Constans.NUM_LOCK, Constans.INIT_NUM_LOCK);
if (res) {
ListOperations<String, String> list = redisTemplate.opsForList();
//释放锁
String num = list.rightPop(Constans.CODE_NUM_POOL);
redisTemplate.delete(Constans.NUM_LOCK);
return num;
}
}
} /**
* @Author: qsy
* @Date: Created in 下午 3:00 2019/1/3/003
* @Description: 清空编码池
*/
@Override
public boolean deleteCodeNumPool() {
return redisTemplate.delete(Constans.CODE_NUM_POOL);
}
}

基于Redis实现分布式锁的更多相关文章

  1. 基于redis 实现分布式锁的方案

    在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...

  2. 基于redis的分布式锁

    <?php /** * 基于redis的分布式锁 * * 参考开源代码: * http://nleach.com/post/31299575840/redis-mutex-in-php * * ...

  3. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  4. 基于 Redis 的分布式锁

    前言 分布式锁在分布式应用中应用广泛,想要搞懂一个新事物首先得了解它的由来,这样才能更加的理解甚至可以举一反三. 首先谈到分布式锁自然也就联想到分布式应用. 在我们将应用拆分为分布式应用之前的单机系统 ...

  5. 基于redis的分布式锁(转)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  6. 基于redis的分布式锁实现

    1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务 ...

  7. 基于redis的分布式锁(不适合用于生产环境)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  8. 基于 redis 的分布式锁实现 Distributed locks with Redis debug 排查错误

    小结: 1. 锁的实现方式,按照应用的实现架构,可能会有以下几种类型: 如果处理程序是单进程多线程的,在 python下,就可以使用 threading 模块的 Lock 对象来限制对共享变量的同步访 ...

  9. 转载:基于Redis实现分布式锁

    转载:基于Redis实现分布式锁  ,出处: http://blog.csdn.net/ugg/article/details/41894947 背景在很多互联网产品应用中,有些场景需要加锁处理,比如 ...

  10. redis系列:基于redis的分布式锁

    一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

随机推荐

  1. SQL 注入~MySQL专题

    Recently, 团队在做一个关于SQL的项目,这个专题是项目中的一部分,该部分正是由我来负责的.今天,分享给正在奋斗中的伙伴们,愿,你们在以后的学习道路中能有自己的收获.              ...

  2. SAMBA服务和FTP服务讲解(week3_day1)--技术流ken

    samba服务 Smb主要作为网络通信协议; Smb是基于cs架构: 完成Linux与windows之间的共享:linux与linux之间共享用NFS 第一步:安装samba [root@ken ~] ...

  3. Linux高级命令进阶(week1_day2)--技术流ken

    输出重定向 场景:一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技术. >:覆盖输出,会覆盖掉原先的文件内容 ...

  4. .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    .NET程序员一定最熟悉所见即所得式开发,熟悉的Visual Studio开发界面,熟悉的C#代码. Smobiler也是因为具备这样的特性,使开发人员,可以在VisualStudio上,像开发Win ...

  5. ThreadPoolExecutor中的submit()方法详细讲解

    https://blog.csdn.net/qq_33689414/article/details/72955253

  6. Myeclipse10.7添加本地插件方法

    -

  7. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  8. css——行内元素和块级元素的具体区别与行内块元素

    (学习笔记) 行内元素(inline)和块级元素(block)都是display属性的值.要知道行内元素和块级元素的区别,首先要了解他们的特性. 行内元素的特性:“行内”,顾名思义,在一行之内,所以相 ...

  9. Kail Linux的安装方法

    众所周知,kail 是一个基于Debian的Linux发行版,它的目标就是为了在一个实用的工具包里尽可能多的包含渗透和审计工具 kail就实现了这个目标,里面包含有很多关于安全测试的开源工具,如果现在 ...

  10. CRM实施失败?请注意这6大问题及对策!

    据Gartner调查显示:约50%的CRM项目不能达到客户期望.这一点与很多其他的IT项目状况非常类似,大多出于管理问题,供应商服务能力,项目执行不善等. 另据一个在线CRM论坛调查其失败的原因:67 ...