分布式锁

Java分布式锁

纵饮孤独 提交于 2019-12-18 15:02:20
分布式锁简述 在单机时代,虽然不存在分布式锁,但也会面临资源互斥的情况,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就需要对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可以接着使用了。例如,在JAVA中,甚至专门提供了一些处理锁机制的一些API(synchronize/Lock等)。 但是到了分布式系统的时代,这种线程之间的锁机制,就没作用了,系统可能会有多份并且部署在不同的机器上,这些资源已经不是在线程之间共享了,而是属于进程之间共享的资源。因此,为了解决这个问题,「分布式锁」就强势登场了。 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。 分布式锁要满足哪些要求呢? 排他性:在同一时间只会有一个客户端能获取到锁,其它客户端无法同时获取 避免死锁:这把锁在一段有限的时间之后

Redis实现分布式锁

走远了吗. 提交于 2019-12-18 10:45:19
Redis 实现分布式锁 一、分布式锁的作用: redis写入时不带锁定功能,为防止多个进程同时进行一个操作,出现意想不到的结果,so...对缓存进行插入更新操作时自定义加锁功能。 二、Redis的NX后缀命令   Redis有一系列的命令,其特点是以NX结尾,NX的意思可以理解为 NOT EXISTS(不存在),SETNX命令 (SET IF NOT EXISTS) 可以理解为如果不存在则插入,Redis分布式锁的实现主要就是使用SETNX命令。 三、实现原理 在进程请求执行操作前进行判断,加锁是否成功,加锁成功允许执行下步操作; 如果不成功,则判断锁的值(时间戳)是否大于当前时间,如果大于当前时间,则获取锁失败不允许执行下步操作; 如果锁的值(时间戳)小于当前时间,并且GETSET命令获取到的锁的旧值依然小于当前时间,则获取锁成功允许执行下步操作; 如果锁的值(时间戳)小于当前时间,并且GETSET命令获取到的锁的旧值大于当前时间,则获取锁失败不允许执行下步操作; 四、$redis->setnx() 设置锁 $expire = 10;//有效期10秒 $key = 'lock';//key $value = time() + $expire;//锁的值 = Unix时间戳 + 锁的有效期 $lock = $redis->setnx($key, $value); /

分布式锁之redisson

心已入冬 提交于 2019-12-17 20:12:23
  redisson是redis官网推荐的java语言实现分布式锁的项目。当然,redisson远不止分布式锁,还包括其他一些分布式结构。详情请移步:https://github.com/mrniko/redisson/wiki   redisson支持4种链接redis的方式:    Cluster (集群)    Sentinel servers (哨兵)    Master/Slave servers (主从)    Single server (单机)   下面通过简单的案例使用redisson的lock。   1、RedissonManager类,管理redisson的初始化等操作。 public class RedissonManager { private static final String RAtomicName = "genId_"; private static Config config = new Config(); private static Redisson redisson = null; public static void init(){ try { config.useClusterServers() //这是用的集群server .setScanInterval(2000) //设置集群状态扫描时间

Redis的简介

£可爱£侵袭症+ 提交于 2019-12-17 00:06:23
Redis 简介 Redis 是一个高性能的key-value数据库。支持 复杂的数据结构 ,支持 持久化 ,支持 主从集群 ,支持 高可用 ,支持 较大的value存储 ... Redis是一个nosql,非关系型数据库。 Redis 与其他 key - value 缓存产品有以下几个特点: Reids是基于内存读写的。 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 何时使用Redis? 1.业务数据常用吗?命中率如何?如果命中率很低,就没有必要写入缓存。 2.业务数据是读操作多,还是写操作多?如果写操作多的话,需要频繁写入数据库,也没有必要使用缓存。 3.业务数据大小?如果业务数据是近G的文件,会给缓存带来很大压力。 Redis 优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的

Redis与Zoo实现分布式锁

点点圈 提交于 2019-12-16 18:33:08
为什么写这篇文章? 目前网上大部分的基于zookeeper,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博主内心战战兢兢,如履薄冰,文中有什么不严谨之处,欢迎批评。 博主的这篇文章, 不上代码,只讲分析 。 (1)在redis方面,有开源redisson的jar包供你使用。 (2)在zookeeper方面,有开源的curator的jar包供你使用 因为已经有开源jar包供你使用,没有必要再去自己封装一个,大家出门百度一个api即可,不需要再罗列一堆实现代码。 需要说明的是,Google有一个名为Chubby的粗粒度分布锁的服务,然而,Google Chubby并不是开源的,我们只能通过其论文和其他相关的文档中了解具体的细节。值得庆幸的是,Yahoo!借鉴Chubby的设计思想开发了zookeeper,并将其开源,因此本文不讨论Chubby。至于Tair,是阿里开源的一个分布式K-V存储方案。我们在工作中基本上redis使用的比较多,讨论Tair所实现的分布式锁,不具有代表性。 因此,主要分析的还是redis和zookeeper所实现的分布式锁。 文章结构 本文借鉴了两篇国外大神的文章,redis的作者antirez的《Is Redlock safe?》以及分布式系统专家Martin的

redis常见问题和解决方案

不想你离开。 提交于 2019-12-16 03:14:41
redis常见问题和解决方案 预热问题 在启动redis的时候,因为热点数据未加载,导致服务器压力大,cpu增高,甚至崩溃 问题解析 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统,毕淼在用户请求的时候,先查询数据库,再将数据缓存的问题,用户直接查询事先被预热的缓存数据 解决方案 前置准备工作 日常例行统计数据访问记录,统计访问频度较高的热点数据 利用LRU数据删除策略,构件数据留存队列 准备工作 将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据 利用分布式多服务器同时进行数据读取,提速数据加载过程 实施 使用脚本程序固定触发数据预热过程 如果条件允许,使用CDN,效果会更好 雪崩 问题排查 在一个较短的时间内,缓存中较多的key集中过期 这周期内,请求访问过期的数据,redis未命中,redis向数据库获取数据 数据库同时接受到大量的请求,无法及时处理 redis大量请求被积压.开始出现超时现象 数据库流程激增,数据库崩溃 重启后仍然面对缓存中无数据可用 reids服务器资源被严重占用,redis服务器崩溃 应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃 应用服务器,redis,数据库全部重启,效果不理想 问题分析 短时间范围内 大量key集中过期 解决方案(外部优化) 更多页面静态化处理 构件多级缓存结构

Redis 面试题

走远了吗. 提交于 2019-12-16 02:22:47
Redis 面试题 1、什么是 Redis? 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性能问题和解决方案? 10、redis 过期键的删除策略? 11、Redis 的回收策略(淘汰策略)? 12、为什么 edis 需要把所有数据放到内存中? 13、Redis 的同步机制了解么? 14、Pipeline 有什么好处,为什么要用 pipeline? 15、是否使用过 Redis 集群,集群的原理是什么? 16、Redis 集群方案什么情况下会导致整个集群不可用? 17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 18、Jedis 与 Redisson 对比有什么优缺点? 19、Redis 如何设置密码及验证密码? 20、说说 Redis 哈希槽的概念? 21、Redis 集群的主从复制模型是怎样的? 22、Redis 集群会有写操作丢失吗?为什么? 23、Redis 集群之间是如何复制的? 24、Redis 集群最大节点个数是多少? 25、Redis 集群如何选择数据库? 26

Redis常见问题和知识点汇总

白昼怎懂夜的黑 提交于 2019-12-15 14:41:35
Redis 相关的问题有很多需要注意,本文就大多数问题做了解答。 目录 1.什么是redis? 2.Reids的特点   3.使用redis有哪些好处?    4.redis相比memcached有哪些优势?    5.Memcache与Redis的区别都有哪些? 6.redis适用于的场景? 7、redis的缓存失效策略和主键失效机制 8.为什么redis需要把所有数据放到内存中?  9.Redis是单进程单线程的 10.redis的并发竞争问题如何解决? 11、redis常见性能问题和解决方案:    12.redis事物的了解CAS(check-and-set 操作实现乐观锁 )? 13.WATCH命令和基于CAS的乐观锁? 14.使用过Redis分布式锁么,它是什么回事? 15.假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 16.使用过Redis做异步队列么,你是怎么用的? 17.如果有大量的key需要设置同一时间过期,一般需要注意什么? 18.Redis如何做持久化的? 19.Pipeline有什么好处,为什么要用pipeline? 20.Redis的同步机制了解么? 21.是否使用过Redis集群,集群的原理是什么? 1.什么是redis?    Redis 是一个基于内存的高性能key-value数据库。

分布式锁

佐手、 提交于 2019-12-15 09:57:13
概述 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中 成员变量 A 同时都会在 JVM 分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的 不是同时发过来,三个请求分别操作三个不同 JVM 内存区域的数据,变量 A 之间不存在共享,也不具有可见性,处理的结果也是不对的 注:该成员变量 A 是一个有状态的对象 如果我们业务中确实存在这个场景的话,我们就需要一种方法解决这个问题,这就是分布式锁要解决的问题 分布式锁应该具备哪些条件 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误) 具备锁失效机制,防止死锁 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败 分布式锁的实现有哪些 Memcached:利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,才能 add 成功,也就意味着线程得到了锁。 Redis:和 Memcached 的方式类似,利用 Redis 的 setnx 命令

Zookeeper---分布式锁

天涯浪子 提交于 2019-12-14 07:43:04
为什么用Zk实现分布式锁? 因为ZK自身的机制,创建节点的四种种类和每个节点的唯一性,使它适用于做分布式锁。 ZK分布式锁的羊群效应 所有的客户端都尝试去创建一个临时节点,但是只会有一个创建成功,其他的客户端去监听这个节点的变化。一旦这个临时节点释放,zk会通知监听这些节点的客户端,由于监听这个节点的数量多,会来回造成大量的网络开销,影响ZK的性能。这就是所谓的zk的分布式锁的羊群效应,这种方法是不可取的。 最理想的状态是什么?肯定是一个节点的变化去通知一个节点,所以,为了解决羊群效应的,所有的客户端去创建一个临时节点的时候,每个客户端都去创建一个临时顺序节点,大的节点监听比自己小的节点的变化。最小的节点先获得锁,操作完成释放锁,然后通知监听自己的节点去获取锁,依次类推。这样就可以解决羊群效应。 我们用Curator这个开源框架实现ZK的分布式锁。 先引入Curator包。 < dependency > < groupId > org . apache . curator < / groupId > < artifactId > curator - recipes < / artifactId > < version > 2.9 .0 < / version > < / dependency > 共享资源: public class Phone { private int