1、使用Redis实现分布式锁原因


(1)Redis有很高的性能;

(2)Redis命令对此支持较好,实现起来比较方便

2、使用命令简介


(1) setnx

SETNX key val:当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

(2)expire

expire key timeout:为key设置一个超时时间,单位是秒,超过这个时间锁会自动释放,避免死锁。

(3)delete

删除key。

3、实现思想


(1)获取锁的时候,使用 setnx 加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

(2)获取锁的时候还设置了一个获取的超时时间,若超过这个时间则放弃获取锁。

(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

4、分布式锁的简单代码



/*** 分布式锁的简单实现代码* Created by 素小暖 on 2020/2/12.*/public class DistributedLock {private final JedisPool jedisPool;public DistributedLock(JedisPool jedisPool) {this.jedisPool = jedisPool;}/*** 加锁* @param lockName       锁的key* @param acquireTimeout 获取超时时间* @param timeout        锁的超时时间* @return 锁标识*/public String lockWithTimeout(String lockName, long acquireTimeout, long timeout) {Jedis conn = null;String retIdentifier = null;try {// 获取连接conn = jedisPool.getResource();// 随机生成一个valueString identifier = UUID.randomUUID().toString();// 锁名,即key值String lockKey = "lock:" + lockName;// 超时时间,上锁后超过此时间则自动释放锁int lockExpire = (int) (timeout / 1000);// 获取锁的超时时间,超过这个时间则放弃获取锁long end = System.currentTimeMillis() + acquireTimeout;while (System.currentTimeMillis() < end) {if (conn.setnx(lockKey, identifier) == 1) {conn.expire(lockKey, lockExpire);// 返回value值,用于释放锁时间确认retIdentifier = identifier;return retIdentifier;}// 返回-1代表key没有设置超时时间,为key设置一个超时时间if (conn.ttl(lockKey) == -1) {conn.expire(lockKey, lockExpire);}try {Thread.sleep(10);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}} catch (JedisException e) {e.printStackTrace();} finally {if (conn != null) {conn.close();}}return retIdentifier;}/*** 释放锁* @param lockName   锁的key* @param identifier 释放锁的标识* @return*/public boolean releaseLock(String lockName, String identifier) {Jedis conn = null;String lockKey = "lock:" + lockName;boolean retFlag = false;try {conn = jedisPool.getResource();while (true) {// 监视lock,准备开始事务conn.watch(lockKey);// 通过前面返回的value值判断是不是该锁,若是该锁,则删除,释放锁if (identifier.equals(conn.get(lockKey))) {Transaction transaction = conn.multi();transaction.del(lockKey);List<Object> results = transaction.exec();if (results == null) {continue;}retFlag = true;}conn.unwatch();break;}} catch (JedisException e) {e.printStackTrace();} finally {if (conn != null) {conn.close();}}return retFlag;}}

5、测试


例子中使用50个线程模拟秒杀一个商品,使用–运算符来实现商品减少,从结果有序性就可以看出是否为加锁状态。

模拟秒杀服务,在其中配置了jedis线程池,在初始化的时候传给分布式锁,供其使用。


/*** Created by 素小暖 on 2020/2/12.*/public class Service {private static JedisPool pool = null;private DistributedLock lock = new DistributedLock(pool);int n = 500;static {JedisPoolConfig config = new JedisPoolConfig();// 设置最大连接数config.setMaxTotal(200);// 设置最大空闲数config.setMaxIdle(8);// 设置最大等待时间config.setMaxWaitMillis(1000 * 100);// 在borrow一个jedis实例时,是否需要验证,若为true,则所有jedis实例均是可用的config.setTestOnBorrow(true);pool = new JedisPool(config, "127.0.0.1", 6379, 3000);}public void seckill() {// 返回锁的value值,供释放锁时候进行判断String identifier = lock.lockWithTimeout("resource", 5000, 1000);System.out.println(Thread.currentThread().getName() + "获得了锁");System.out.println(--n);lock.releaseLock("resource", identifier);}}

结果如下,有序的:

若注释使用锁的部分:


public void seckill() {// 返回锁的value值,供释放锁时候进行判断//String indentifier = lock.lockWithTimeout("resource", 5000, 1000);System.out.println(Thread.currentThread().getName() + "获得了锁");System.out.println(--n);//lock.releaseLock("resource", indentifier);}

从结果可以看出,有一些是异步进行的:

六、基于Zookeeper实现分布式

======================

Zookeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一目录下只能有一个唯一文件名。

1、基于Zookeeper实现分布式锁的步骤如下


(1)创建一个目录mylock;

(2)创建A想获取锁就在mylock目录下创建临时顺序节点;

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

1、基于Zookeeper实现分布式锁的步骤如下


(1)创建一个目录mylock;

(2)创建A想获取锁就在mylock目录下创建临时顺序节点;

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

[外链图片转存中…(img-WRX7CwFR-1630924724095)]

[外链图片转存中…(img-NoBa1mcX-1630924724096)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

【Spring Boot 17,最新精心整理Java面试题相关推荐

  1. 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)

    今年的工作格外难找,不知道别的小伙伴什么样子,反正我是不好找,由于疫情影响,每个公司都在缩减成本,要求也变高了.很多公司要求第一学历统招本科,虽然是本科,但不是统招,很难混啊.面了一个多月,初试复试面 ...

  2. 2019最新整理JAVA面试题附答案

    2019最新整理JAVA面试题附答案 包含的模块: 本文分为十九个模块,分别是:Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MV ...

  3. 2、Spring Boot尚硅谷笔记整理高级篇-消息

    1.Spring Boot尚硅谷笔记整理高级篇-缓存 2.Spring Boot尚硅谷笔记整理高级篇-消息 3.Spring Boot尚硅谷笔记整理高级篇-检索 4.Spring Boot尚硅谷笔记整 ...

  4. dubbo 报错Serialized class com.spring.boot.entity.User must implement java.io.Serializable

    这个报错是说dubbo在传输数据的时候反序列化报错, 使用dubbo进行数据传递时,需让作为消息传递的类序列化. 2019-03-26 16:45:01.228 ERROR 14968 --- [ni ...

  5. 视频教程-Spring Boot实战入门视频课程-Java

    Spring Boot实战入门视频课程 国内上市大型医疗软件公司产品研发部总经理,技术培训总监.6年以上大型项目一线开发.架构.管理经验,曾主导医疗大数据+移动BI产品设计与研发.技术狂热爱好者,擅长 ...

  6. Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法

    问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...

  7. 2020最新整理JAVA面试题附答案

    包含的模块: 本文分为十九个模块,分别是:Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Sprin ...

  8. 1000道最新大厂高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  9. 一个比 Spring Boot 快 44 倍的 Java 框架

    点击关注公众号,Java干货及时送达 转自:jdon 链接:http://jdon.com/48511 light-java是内置了undertow http服务器的REST微服务轻量Java框架,它 ...

最新文章

  1. 谢烟客---------Linux之Bash基础特性(2)
  2. Docker 网络之进阶篇
  3. python简单爬豆瓣电影排名
  4. 安卓学习笔记20:Fragment入门
  5. android模拟器游戏按键映射,刺激战场模拟器按键映射对比 逍遥安卓模拟器智能按键最好...
  6. 为了程序员的颈椎,做机械键盘的 Cherry 发布了把椅子!
  7. ListView添加图片文字项
  8. 主机overlay和网络overlay_边缘计算中kubernetes网络能大一统吗?
  9. python3高级编程学习笔记(linux环境)
  10. 电脑变慢,电脑越来越慢怎么办 电脑用久了网速变慢如何解决
  11. VBS对Excel导入bas宏文件
  12. 即将30岁的2020年总结,放眼未来的未雨绸缪
  13. SketchUp + Photoshop:别墅平面图制作教程
  14. [python] 使用Jieba工具中文分词及文本聚类概念
  15. 6. 聚类算法之K-Means
  16. CCF python 门禁系统
  17. java程序员述职_java程序员述职报告
  18. QQ搜集用户数据是空穴来风吗?(二)
  19. list转String工具类
  20. 【leetcode】小彩蛋|主页draw

热门文章

  1. H.266视频编解码标准
  2. ASP.NET动态网站开发培训-40.互动论坛制作(八、登陆页面和管理主页面)
  3. python写spark_Spark2.1.0+入门:文件数据读写(Python版)
  4. Redis压缩包win10快速启动之记录一
  5. 微信小程序中Vant Weapp的引用与使用
  6. Linux下的虚拟串口驱动(一)
  7. 如何开发优秀的新浪微博应用
  8. 违章查询源码 php,全国车辆违章查询API接口文档及demo
  9. 家用摄像头选择(户内外)
  10. docker搭建网站详细