分布式锁

NoSQL那些事--Redis

为君一笑 提交于 2019-12-30 01:22:50
Redis是个流行的内存数据库(in-momery)。接口好用,性能也很强,还支持多种数据结构,加上各种高可用性集群方案,实在是太太太好用了。 但是就是因为太好用了,好用到让很多人都晕了脑子: 用Redis性能就大大提高了 用Redis可以保证原子性 用Redis可以实现事务 用Redis可以当队列 …… 这就好像一个股民,在手机上操作买卖几笔股票,赚了一些,然后感叹道"股市就是为我发财而存在的啊"!!他的下场可想而知。 Redis的种种优势源自于他的设计——简单直接的单线程内存操作。但这些优势是有前提的。 Redis的性能高,吗? Redis的性能非常高。有些评测说用Redis可以达到几十万QPS(比如这里 http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/ )。大家可能在网文上记住了这个NB的数字,却很少关心这个数值怎么来的。这就像是你买手机评测光看跑分一样不靠谱。 Redis要达到高性能需要做到: Value尽可能的小。一般的测评都会用比较小的value,比如一个整数或者不长的字符串。但是如果用Redis做缓存,那么缓存的大小的可能偏离这个数字。比如一个页面几十KB;再比如,一个5年的市场价格序列数据可能高达几MB

使用Redis的分布式Java锁

こ雲淡風輕ζ 提交于 2019-12-29 00:11:20
通过优锐课的java学习分享中,了解有关分布式锁定以及如何在项目中实现它的更多信息! 什么是分布式锁定? 在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。 为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先获取锁,然后对资源进行操作,最后将锁释放给其他线程。 在Java中,由于多种原因,锁定对象通常比使用同步块更灵活。首先,Lock API可以以不同的方法运行,而同步块完全包含在一个方法中。 另外,如果线程被阻止,则无法访问同步的块。使用Lock,该线程将仅在可用时获取锁。这大大减少了线程等待的时间。另外,当线程正在等待时,可以调用一种方法来中断线程,而当线程正在等待获取同步块时,这是不可能的。 分布式锁定意味着你不仅需要考虑多个线程或进程,还需要考虑在不同计算机上运行的不同客户端。这些单独的服务器必须进行协调,以确保它们中的任何一个在任何给定时间都在使用资源。 基于Redis的分布式Java锁定工具 Redisson框架是用于Java的基于Redis的内存数据网格,可为需要执行分布式锁定的程序员提供多个对象。 下面,我们将讨论每个选项及其之间的区别。 1.锁 RLock接口在Java中实现java.util.concurrent.locks

zookeeper入门_三【分布式锁】

流过昼夜 提交于 2019-12-28 03:22:29
Zookeeper 锁 Zookeeper实现分布式锁 1.0版本 使用一个临时节点利用及诶单的特性同时只有一个客户端可以对节点操作 实现分布式锁 Step.1 用zookeepr中的一个临时节点代表锁 如 创建一个/exlusive_lock下创建临 时znode /exlusive_locak/lock 这个操作 Step.2 当所有的客户端区争抢执行 创建此节点 同时只有一个客户端执行操作 Step.3 创建成功 代表当前客户端获取锁成功 当前客户端执行业务逻辑 Step.4 为创建成功的客户端 监听 /exlusive_lock 变更 Step.5 获取锁的客户端执行完成后删除 /exlusive_lock/lock 表示锁被释放 Step.6 锁被释放之后 其他客户端监听得到通知 再次争抢 这与java的sync锁机制相类似,锁的获取顺序与客户端的争抢顺序不同,但是可能存在同一个客户端多次获取,所以1.0版本的临时节点锁不是一个公平锁 当同时争抢的客户端太多会浪费过多的资源到锁的争抢过程中 2.0版本 为了避免1.0中出现的资源浪费和不公平锁的存在,我们引入 之前使用的有序节点,让每个客户端执行 在/exlusive_lock 中创建临时节点为有序节点,这样每个客户端都会在/exlusive_lock下有自己的对应锁节点 这样让每一个成功执行的客户端有一个简单的执行序列

redis分布式锁

泪湿孤枕 提交于 2019-12-27 04:23:16
1.使用setNx做分布式锁:setnx只能设置一次值,第二次会设置失败 public Boolean setSecondTime ( String key , String value , Long secondTime ) { try { boolean flag = client . setNX ( key , value ) ; client . expire ( key , secondTime , TimeUnit . SECONDS ) ; } catch ( Exception e ) { log . error ( "jimdbservice setSecondTime" , e ) ; } return flag ; } try { if ( boardJimdbService . setSecondTime ( Sale_Task_key , "111" , 8 L ) ) { //TODO } } catch ( Exception e ) { } finally { boardJimdbService . del ( Sale_Task_key ) ; } 来源: CSDN 作者: 诸葛子房_ 链接: https://blog.csdn.net/weixin_43291055/article/details/103709487

redis分布式锁

霸气de小男生 提交于 2019-12-27 01:33:58
如何解决 Redis 的并发竞争 Key 问题 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问题,不要使用分布式锁,这样会影响性能) 基于zookeeper临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。 在实践中,当然是从以可靠性为主。所以首推Zookeeper。 Redis分布式锁 1.设置锁的失效时间为30s 2.开一个后台线程,每隔10s检查是否还持有锁,如果持有,重新给锁赋值30s 3.finally释放锁 4.释放自己加的那把锁 redis分布式代码 @RestController public class RedisDistributedLockController { @Autowired private

最全的Redis解析,赶紧收藏

扶醉桌前 提交于 2019-12-26 22:49:27
在这篇文章中,我们将彻底了解 Redis 的使用场景、Redis 的五种数据结构,以及如何在 Spring Boot 中使用 Redis,文章的最后还会列举面试过程中经常被问到的关于 Redis 的问题以及其解决方案。 Redis 简介 Redis 是一个开源(BSD 许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复制、Lua 脚本、LRU 收回、事务以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。在实际的开发过程中,多多少少都会涉及到缓存,而 Redis 通常来说是我们分布式缓存的最佳选择。Redis 也是我们熟知的 NoSQL(非关系性数据库)之一,虽然其不能完全的替代关系性数据库,但它可作为其良好的补充。 Redis 使用场景 微服务以及分布式被广泛使用后,Redis 的使用场景就越来越多了,这里我罗列了主要的几种场景。 分布式缓存 :在分布式的系统架构中,将缓存存储在内存中显然不当,因为缓存需要与其他机器共享,这时 Redis 便挺身而出了,缓存也是 Redis 使用最多的场景。 分布式锁 :在高并发的情况下,我们需要一个锁来防止并发带来的脏数据,Java 自带的锁机制显然对进程间的并发并不好使,此时可以利用

19年12月份面试集合【redis】

独自空忆成欢 提交于 2019-12-24 05:11:55
了解缓存穿透、缓存雪崩、缓存击穿以及解决方案 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁 1、如何保证Redis高可用和高并发? Redis主从架构,一主多从,可以满足高可用和高并发。出现实例宕机自动进行主备切换,配置读写分离缓解Master读写压力。 2、Redis高可用方案具体怎么实施? 使用官方推荐的哨兵(sentinel)机制就能实现,当主节点出现故障时,由Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。它有四个主要功能: 集群监控,负责监控redis master和slave进程是否正常工作。 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移,如果master node挂掉了,会自动转移到slave node上。 配置中心,如果故障转移发生了,通知client客户端新的master地址。 3、你能说说Redis哨兵机制的原理吗? 通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否活着,如果发现对方在指定时间内未回应,则暂时认为对方宕机

Redis数据类型及使用场景

…衆ロ難τιáo~ 提交于 2019-12-24 02:58:11
摘要:Redis相比其它的KV数据库,其一大特点是支持丰富的数据类型.它一共支持5种数据类型,下面逐一介绍这5种数据类型及其使用场景... 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等指令来实现原子计数的效果

同步中的四种锁synchronized、ReentrantLock、ReadWriteLock、StampedLock

巧了我就是萌 提交于 2019-12-23 17:48:33
1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间。出现互斥操作的典型场景:多人同时想进同一个房间争抢这个房间的钥匙(只有一把),一人抢到钥匙,其他人都等待这个人出来归还钥匙,此时大家再次争抢钥匙循环下去。 作为终极实战系列,本篇用java语言分析锁的原理(源码剖析)和应用(详细代码),根据锁的作用范围分为:JVM锁和分布式锁。如理解有误之处,还请指出。 2.单JVM锁(进程级别) 程序部署在一台服务器上,当容器启动时(例如tomcat),一台JVM就运行起来了。本节分析的锁均只能在单JVM下生效。因为最终锁定的是某个对象,这个对象生存在JVM中,自然锁只能锁单JVM。这一点很重要。如果你的服务只部署一个实例,那么恭喜你,用以下几种锁就可以了。 1.synchronized同步锁 2.ReentrantLock重入锁 3.ReadWriteLock读写锁 4.StampedLock戳锁 由于之前已经详细分析过原理+使用,各位直接坐飞机吧: 同步中的四种锁synchronized、ReentrantLock、ReadWriteLock、StampedLock 3.分布式锁(多服务节点,多进程) 3.1基于数据库锁实现 场景举例: 卖商品,先查询库存>0,更新库存-1。 1.悲观锁: select for update(一致性锁定读) 查询官方文档如上图,事务内起作用的行锁

分布式锁的实现方式及原理

Deadly 提交于 2019-12-23 13:09:32
转载自 http://www.jb51.net/article/118312.htm * 在集群等多服务器中经常使用到同步处理一下业务,这是普通的事务是满足不了业务需求,需要分布式锁 * * 分布式锁的常用3种实现: * 0.数据库乐观锁实现 * 1.Redis实现 --- 使用redis的setnx()、get()、getset()方法,用于分布式锁,解决死锁问题 * 2、zookeeper实现 Zookeeper实现 * 参考: http://surlymo.iteye.com/blog/2082684 * http://www.jb51.net/article/103617.htm * http://www.hollischuang.com/archives/1716?utm_source=tuicool&utm_medium=referral 1、实现原理: 基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来自于IBM网站)。大致思想即为:每个客户端对某个功能加锁时,在zookeeper上的与该功能对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。 2、优点 锁安全性高,zk可持久化