基于SpringBoot微信点餐系统与分布式锁的实现(附源码)

本文介绍了基于SpringBoot的微信点餐系统如何实现分布式锁,包括基于Redis和Zookeeper的两种方式。文章详细讲解了分布式锁的概念、实现原理,以及在实际系统中可能出现的问题和解决方案。此外,还探讨了Redis在分布式锁中的应用以及其作为分布式系统中Session管理的策略。
摘要由CSDN通过智能技术生成

架构

前后端分离:

补充:

  • setting.xml 文件的作用:settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。

  • maven的作用:借助Maven,可将jar包仅仅保存在“仓库”中,有需要该文件时,就引用该文件接口,不需要复制文件过来占用空间

注:这个“仓库”应该就是本地安装maven的目录下的Repository的文件夹

Springboot学习视屏推荐:传送门

分布式锁

线程锁:当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效,因为线程锁的实现在根本上是依靠线程之间共享内存实现的。如synchronized

推荐观看:传送门

进程锁:为了控制同一操作系统中多个进程访问某个共享资源。

分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。

分布式锁一般有三种实现方式:

  1. 数据库乐观锁;

  2. 基于Redis的分布式锁;

  3. 基于ZooKeeper的分布式锁。

乐观锁的实现:使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。

分布式锁基于Redis的实现:(本系统锁才用的)

基本命令:

  • SETNX(SET if Not exist):当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

  • GETSET:将给定 key 的值设为 value ,并返回 key 的旧值。先根据key获取到旧的value,再set新的value。

  • EXPIRE 为给定 key 设置生存时间,当 key 过期时,它会被自动删除。

加锁方式:

这里的jedis是Java对Redis的集成

jedis.set(String key, String value, String nxxx, String expx, int time)

错误的加锁方式1:

如果程序在执行完setnx()之后突然崩溃,导致锁没有设置过期时间。那么将会发生死锁。

Long result = jedis.setnx(Key, value);
    if (result == 1) {
        // 若在这里程序突然崩溃,则无法设置过期时间,将发生死锁
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值