redis分布式锁

分布式锁--redis(集群)

岁酱吖の 提交于 2019-12-03 00:00:28
原文链接:https://blog.csdn.net/weixin_38003389/article/details/89434629 redis 集群做分布式锁,我们使用 Redisson。 框架 版本 Spring Boot 2.0.3.RELEASE Spring Cloud Finchley.RELEASE redis redis-4.0.11 JDK 1.8.x maven配置 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom<

Redis 分布式锁的正确打开方式

走远了吗. 提交于 2019-12-02 23:06:57
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 组件依赖 首先我们要通过Maven引入 Jedis 开源组件,在 pom.xml 文件加入下面的代码: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 加锁代码 正确姿势 Talk is cheap, show me the code。先展示代码,再带大家慢慢解释为什么这样实现:

2019 携程旅行网java面试笔试题 (含面试题解析)

假如想象 提交于 2019-12-02 22:52:15
本人3年开发经验、18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴、今日头条、滴滴等公司offer,岗位是Java后端开发,最终选择去了阿里巴巴。 面试了很多家公司,感觉大部分公司考察的点都差不多,所以将自己的心得记下来,希望能给正在找或者准备找工作的朋友提供一点帮助。另外,目前在阿里也做面试官的工作,身份从求职者变为面试官,看问题的很多角度也不一样,所以下文中既有求职者的视角,也有面试官的视角 面试流程   先说下面试流程,一般大公司都有3-4轮技术面,1轮的HR面。就阿里而言,我共经历了4轮技术面,前两轮主要是问基础和项目实现,第3轮是交叉面,两个面试官,主要是问项目实现和拓展。第4轮是部门老大面,主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了。 要注意的点 简历一到两页为最佳,将项目经历写2-3个左右就差不多了,一定要写最有亮点的项目 工作经历的起始时间要写清楚,另外大公司都有背调,不要合并或省略一些比较短的工作经历,影响的可能不只是这次面试,而是之后可能都无法进这家公司 博客没什么好文章,github没好项目就不要写在简历中了 对于面试官的问题,想清楚再回答,如果觉得需要的时间可能比较长,可以跟面试官说我思考下、我整理下思路之类的 面试的过程中注意语速和吐字,本人在做面试官后,发现很多人说话语速很快,或吐字不清

Redis数据类型及使用场景

跟風遠走 提交于 2019-12-02 22:11:32
Redis数据类型及使用场景 摘要:Redis相比其它的KV数据库,其一大特点是支持丰富的数据类型.它一共支持5种数据类型,下面逐一介绍这5种数据类型及其使用场景... string 简介:Strings数据类型是最常用、简单的key-value类型,普通的key/ value 存储都可以归为此类。value不仅可以是字符串,也可以是数字。因为是二进制安全的,所以你完全可以把一个图片文件的内容作为string来存储。Redis的string可以完全实现目前 memcache d的功能,并且效率更高。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还额外提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位(bit) 批量设置一系列字符串的内容 常用命令: set,get,decr,incr,mget 等。 应用场景: 应用 Memcached和CKV的所有场景。字符串和数字直接存取。结构化数据需要先序列化,再set到value;相应的,get到value后需要反序列化。 可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。即可以用来实现业务上的统计计数需求。也可用于实现idmaker,即生成全局唯一的id。 存放session

面试题总结

不想你离开。 提交于 2019-12-02 21:58:35
JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。 ArrayList和LinkedList有什么区别。 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。 继承和聚合的区别在哪。 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。 反射的原理,反射创建类实例的三种方式是什么。 反射中,Class.forName和ClassLoader区别 。 描述动态代理的几种实现方式,分别说出相应的优缺点。 动态代理与cglib实现的区别。 为什么CGlib方式可以对接口实现代理。 final的用途。 写出三种单例模式实现 。

java面试经验小结

匿名 (未验证) 提交于 2019-12-02 21:53:52
此内容偏中高级,适合有三年经验者。 1. java中wait和sleep有什么区别?多线程条件下如何保证数据安全? 答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交,互,sleep通常被用于暂停执行。 2. java中volatile和synchronized有什么区别? 1.volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2.volatile 仅能使用在变量级别; synchronized 则可以使用在变量、方法、和类级别的。 3.volatile 仅能实现变量的修改可见性,并不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。 4.volatile 不会造成线程的阻塞; synchronized 可能会造成线程的阻塞。 5.volatile 标记的变量不会被编译器优化; synchronized 标记的变量可以被编译器优化。 3. 有了解java的原子类?实现原理是什么? 答:采用硬件提供原子操作指令实现的,即CAS。每次调用都会先判断预期的值是否符合,才进行写操作,保证数据安全。 4. spring主要使用了哪些?IOC实现原理是什么?AOP实现原理是什么?

手撕面试官系列(四 ):MongoDB+Redis 面试专题

匿名 (未验证) 提交于 2019-12-02 21:52:03
MongoDB (面试题+答案领取方式见个侧边栏) 你说的 NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什么要使用和不使用NoSQL 数据库?说一说 NoSQL 数据库的几个优点? NoSQL 数据库有哪些类型? MySQL 与 MongoDB 之间最基本的差别是什么? 你怎么比较 MongoDB、CouchDB 及 CouchBase? MongoDB 成为最好 NoSQL 数据库的原因是什么? 32 位系统上有什么细微差别? journal 回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗? 分析器在 MongoDB 中的作用是什么? 名字空间(namespace)是什么? 如果用户移除对象的属性,该属性是否从存储层中删除? 能否使用日志特征进行安全备份? 允许空值 null 吗? 更新操作立刻 fsync 到磁盘? 如何执行事务/加锁? 为什么我的数据文件如此庞大? 启用备份故障恢复需要多久? 什么是 master 或 primary? 什么是 secondary 或 slave? 我必须调用 getLastError 来确保写操作生效了么? 我应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境? 分片(sharding)和复制(replication)是怎样工作的?

redis(5)-java集成一

匿名 (未验证) 提交于 2019-12-02 21:45:52
Redis官方对Java语言的封装框架推荐有十多种,主要有:Jedis、Lettuce、Redisson。 1几个框架的对比 三个框架都是在Java中对Redis操作的封装。 1.1 Jedis github: https://github.com/xetorthio/jedis Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。支持基本的数据类型如:String、Hash、List、Set、Sorted Set。 优点 :比较全面的提供了Redis的操作特性,相比于其他Redis 封装框架更加原生。 编程模型 : 使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。 1.2 Lettuce 官网: https://lettuce.io/ github: https://github.com/lettuce-io/lettuce-core 高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点 :适合分布式缓存框架。 编程模型 :基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。 1

redis分布式锁java实现

匿名 (未验证) 提交于 2019-12-02 21:35:18
redis与redis分布式锁java实现 @ TOC 分布式锁 什么是分布式锁?在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性 .为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 1.互斥性,在任何时候,只有一个客户端能持有锁 2.不会发生死锁.即使一个客户端在持有锁期间因奔溃没有自动解锁,也能保证后续客户端能加锁 3.具有容错性,只要大部分的redis节点能正常工作,客户端就能加锁和解锁 4.解铃还需系铃人,解锁和加锁必须是同一个客户端,其他客户端不能把别人的锁解了. 分布式锁业界上有三种实现方式:1.基于zookeeper实现的分布式锁;2.基于redis实现的分布式锁;3.基于数据库乐观锁实现.本博客主要讲解是第二种,基于redis实现. redis作为缓存中间件,无论是在电商项目,还是传统的ERP项目,想必大家都有所用到,特别是2016年来,分布式spring cloud,dubbo等分布式框架的使用,redis作为分布式缓存,提高系统的性能,加强系统的健壮性. java代码实现 添加依赖组件 本文是基于maven实现 <!-- Redis客户端 --> <dependency> <groupId>redis.clients<

Redis备忘(一)

喜欢而已 提交于 2019-12-02 21:33:36
hash: 渐进式rehash:同时查询新旧两个hash,然后在后续定时任务以及hash的子指令中,循序渐进将旧的迁移到新的hash表 Redis应用: 1.分布式锁: 实现1:setnx+expire+del,setnx后客户端宕机怎么办,根本原因在于没有原子性 解决:redis2.8引入了原子性的命令进行设置。 2.分布式锁超时问题:1执行时间太长,超过了锁的时间,2拿到了锁,这时候1执行完了,就释放了锁,于是3在2执行完成之前拿到了锁 解决:(1) 别做长时间的任务 (2) value上标记一个随机数,释放锁时先看看随机数是否一致,如一致再删除(匹配value和删除key不是原子操作,可以借助lua实现“delete if equals”)。 3.消息队列: blpop 4.位图:本质就是字符串,用getbit,setbit操作,也可以用getString获取整个字符串。可以用来实现用户签到等。 5.hyperloglog: 可以用来统计UV,不能做到精准去重,有时间可以继续研究下。 6.bloomfilter: hyperloglog只能计数,没有"contains"语义,不知道某个值是否包含,Redis4.0后可以使用bloomfilter。 注意,元素超出设定个数后需要重建布隆过滤器。 7.限流:用zset的zremrangeByScore可以获取一定时间内发生次数 8