redis分布式锁

[Redis] Redis日常学习总结一

老子叫甜甜 提交于 2019-12-19 03:22:16
一 Redis使用bitset(bitmap)来统计日活跃量 1 BitMap介绍   Bitmap(即Bitset),是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。   Redis从2.2.0版本开始新增了 setbit , getbit , bitcount 等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为 setbit 等命令只不过是在 set 上的扩展。在bitmap上可执行AND,OR,XOR以及其它位操作。 2 相关命令   (1)SETBIT key offset value   对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。当 key 不存在时,自动生成一个新的字符串值。   字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。   offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。    对使用大的 offset 的 SETBIT 操作来说,内存分配可能造成 Redis 服务器被阻塞。   redis>

通过Redis 实现分布式锁_利用Jedis 客户端

橙三吉。 提交于 2019-12-19 03:07:24
前言 分布式锁一般有三种实现方式: 数据库 乐观锁;2. 基于 Redis 的分布式锁;3. 基于ZooKeeper的分布式锁。 本篇博客将介绍第二种方式,基于Redis实现分布式锁。 虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性: 在任意时刻,只有一个客户端能持有锁。 不会发生死锁: 即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性: 只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人: 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 一、引入redis 依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 备注:根据版本不同,jedis 的set 方法也有所不同 二、配置文件增加redis 配置 # redis.properties 配置文件: # region Redis jedis #

Redis分布式锁之实战

拥有回忆 提交于 2019-12-18 21:02:51
一、pom依赖 <dependency> <groupId>tf56.redis</groupId> <artifactId>redis-client</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>gson</artifactId> <groupId>com.google.code.gson</groupId> </exclusion> </exclusions> </dependency> <!-- 其他redis依赖 --> 二、MyCacheCloudRedisFactory工具类 package tf56.payOnlineService.util.redis; ​ import com.sohu.tv.builder.ClientBuilder; import com.sohu.tv.cachecloud.client.basic.enums.RedisTypeEnum; ​ import org.apache.commons.lang.StringUtils; import org

关于高并发和秒杀系统,你知道的和不知道的一些事

懵懂的女人 提交于 2019-12-18 18:31:45
这篇文章也算是对于课程 《 PHP秒杀系统 高并发高性能的极致挑战 》 的一个整理,视频之外的另外一种形式吧。 大家也许开发过高并发的系统或者秒杀程序,但肯定都有接触过,像电商平台的秒杀、抢购等活动,还有12306春运抢票。 互联网公司,做一些有奖活动,而且数量有限,奖品给力,如果是先到先得的策略,那就类似秒杀系统了。 这类系统最大的问题就是活动周期短,瞬间流量大(高并发),很少人可以成功下单,绝大多数人都是很遗憾。所以从运营体验上,没有成功下单的人,心里肯定是不好受的,如果这时候,因为技术、网络问题,影响用户体验,那就更是骂声一片。 这里,就来讲一讲技术在这种情况下,会发生和要做的事。 下面是基本的概念的建立。 第一:高并发 技术要做的事,一方面优化程序,让程序性能最优,单次请求时间能从50ms优化到25ms,那就可以在一秒钟内成功响应翻倍的请求了。 另一方面就是增加服务器,用更大的集群来处理用户请求,设计好一个可靠且灵活扩充的分布式方案就更加重要了。 第二:时间短 火热的秒杀活动,真的是一秒钟以内就会把商品抢购一空,而大部分用户的感受是,提交订单的过程却要等待好几秒、甚至十几秒,更糟糕的当然是请求报错。 那么一个好的秒杀体验,当然希望尽可能减少用户等待时间,准确的提示用户当前是否还有商品库存。而这些,也是需要有优秀的程序设计来保证的。 第三:系统容量预估 系统设计的时候

redis分布式锁

依然范特西╮ 提交于 2019-12-18 16:03:33
第一、分布式锁解决方案 分布式锁一般有三种实现方式 1.数据库乐观锁 采用数据库 不建议 性能不好 jdbc 2.基于redis分布式锁 基于Redis实现分布式锁(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已经存在了,返回0. 多个客户端(jvm),使用setnx命令方式,同时在redis上创建相关的一个key,因为redis key不能够允许重复的看,只有谁能够创建key成功,谁就能够获取到锁,没有创建key成功jvm,就会等待。 3. 基于ZooKeeper的分布式锁 基于Zookeeper实现分布式锁 Zookeeper是一个分布式协调工具,在分布式解决方案中, 多个客户端(jvm),同时在zk上创建相同的一个临时节点,因为临时节点路径是保证唯一, 只要谁能够创建节点成功,谁就能够获取到锁,没有创建成功节点,就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁的资源。 最终核心思路,保证只能够有一个jvm进行做操作 第二、分析Redis实现分布式锁 多个客户端(jvm),使用setnx命令方式,同时在redis上创建相同的一个key,因为redis key不会允许重复的,只要能够创建key成功,谁就能够获取到锁,没有创建key成功jvm,就会进行等待。 如何释放锁? 在执行操作的时候,删除对应的key

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); /

一份阿里P7的面试题

故事扮演 提交于 2019-12-17 00:32:58
BAT 的牛人多,普通人也多,虽然他们不是每一个人都能达到令人仰望的技术水平,但毕竟平台高,所以眼光也会变得宽阔,代码要求更为严格,所以普通的程序员也会被逼的变得更优秀;身边的牛人多,普通的程序员也会受到影响,提升的更快。 下面是阿里 P7 的面试题, Java多线程 线程池的原理,为什么要创建线程池? 线程的生命周期,什么时候会出现僵死进程; 什么实现线程安全,如何实现线程安全; 创建线程池有哪几个核心参数?如何合理配置线程池的大小? synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性; JVM相关 JVM内存模型,GC机制和原理;GC分哪两种;什么时候会触发Full GC? JVM里的有几种classloader,为什么会有多种? 什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处; (这个我真的不会...) 什么情况下我们需要破坏双亲委派模型; 常见的 JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值? JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class文件结构是如何解析的 Java扩展 红黑树的实现原理和应用场景; NIO是什么?适用于何种场景? Java9比Java8改进了什么; HashMap内部的数据结构是什么?底层是怎么实现的? 说说反射的用途及实现,反射是不是很慢

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集中过期 解决方案(外部优化) 更多页面静态化处理 构件多级缓存结构