redisson

Redis分布式锁

半腔热情 提交于 2020-04-05 23:45:27
Redis分布式锁的实现原理 分布式锁的开源Redisson框架的实现机制 SpringBoot整合redisson分布式锁 github 上 Redisson 项目的 wiki 文档(中文) lockWatchdogTimeout 来解决Redission宕机造成死锁的问题 每秒上千订单场景下的分布式锁高并发优化实践 引入分段锁的概念提高并发 来源: oschina 链接: https://my.oschina.net/u/3847203/blog/3216288

Redisson学习

♀尐吖头ヾ 提交于 2020-03-26 20:26:17
顺便学习一下原理 1. 启动,看从上到下的调用和回调关系; 注册topic的元素数量和状态的变更通知,元素放入在被通知后不断加入,zrangebyscore 拿出0 ~ expiretime中的limit多少元素,然后rpush从右边放入target链表,lrem从左侧删除元素,zrem再删除有序集合元素,zrange取出有序集的第一个元素和他的timeout时间 QueueTransferTask task = new QueueTransferTask(commandExecutor.getConnectionManager()) { @Override protected RFuture<Long> pushTaskAsync() { return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_LONG, "local expiredValues = redis.call('zrangebyscore', KEYS[2], 0, ARGV[1], 'limit', 0, ARGV[2]); " + "if #expiredValues > 0 then " + "for i, v in ipairs(expiredValues) do " + "local

redis面试题

懵懂的女人 提交于 2020-03-05 00:53:06
什么是redis? Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。 Redis的数据类型? Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 Redis相比Memcached有哪些优势? (1) Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) Redis的速度比Memcached快很多 (3) Redis可以持久化其数据 Redis是单进程单线程的? Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。 一个字符串类型的值能存储最大容量是多少? 512M MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据? redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 Redis 有哪几种数据淘汰策略? volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires

Redis分布式锁的实现(Jedis和Redisson两个方案)

做~自己de王妃 提交于 2020-03-02 00:56:20
应用场景 分布式锁主要用于解决,公司中不同业务系统对同一功能的数据产生脏读或重复插入。 比如公司现有三个小组分别开发WAP站、小程序、APP客户端,而这三个系统都存在领红包功能。 业务要求每人每日只能领取一个红包,如果有人同时登陆三个系统那么就能够同一时间领取到三个红包。 分布式锁的要求 分布式锁要满足以下基本要求: 共享锁。 多系统能够共享同一个锁机制。 互斥性。 在任意时刻,只有一个请求能持有锁。 无死锁。 在程序崩溃时能够,自动释放锁。 持有者解锁。 锁只能被加锁的请求解锁,其他请求无法解锁。 Jedis实现分布式锁 本例参考了博文:https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 例子已上传码云:https://gitee.com/imlichao/jedis-distributed-lock-example 添加依赖 本例使用spring boot提供的redis实现,并没有直接引入jedis依赖。这样做的好处是,可以在项目中同时使用Jedis和RedisTemplate实例。 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis<

分享30道Redis面试题,面试官能问到的我都找到了

情到浓时终转凉″ 提交于 2020-03-01 12:40:41
1、什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。 比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。 另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 2、Redis相比memcached有哪些优势? (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) redis的速度比memcached快很多 (3) redis可以持久化其数据 3

【面试必备】聊聊高性能延时队列应用

元气小坏坏 提交于 2020-02-27 08:14:26
延时队列的应用场景: 下单后,30分钟内未付款就自动取消订单等; 支付后,24小时未评论自动好评; 在我们实际开发过程中,应用场景很多... 基于Redis Zset 实现 实现原理 Redis由于其自身的Zset数据结构,也同样可以实现延时的操作。 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加元素时候可以指定, 每次指定score后,Zset会自动重新按新的值调整顺序 。 如果score代表的是想要执行时间的 时间戳 ,在某个时间将它插入Zset集合中,它会按照时间戳大小进行排序,也就是对执行时间前后进行排序。 > ZADD delay_queue 1581309229 taskId_1 (integer) 1 > ZADD delay_queue 1581309129 taskId_2 (integer) 1 > ZADD delay_queue 1581309329 taskId_3 (integer) 1 不断地进行取第一个key值,如果当前 时间戳 大于等于该key值的socre就将它取出来进行消费删除,就可以达到延时执行的目的。 注意不需要遍历整个Zset集合,以免造成性能浪费。 > ZRANGE delay_queue 0 -1 withscores 1) "taskId_2" 2)

超简单使用redisson延迟队列做定时任务

大兔子大兔子 提交于 2020-02-26 13:29:23
前言:在工作开发中很多需求都需要用到定时任务,但是市面上多半都是轮询或者固定时间执行的开源工具,我之前写过一次基于quartz的定时任务,前端和分布式还需要完善 https://my.oschina.net/wangnian/blog/758054 ,编程式传入一个时间,到点就会按照事先配置好的执行。今天工作中又遇到了类似的需求,没有完善拿不出手,所以简单的封装一下redisson的API,只需要简单的传入间隔时间就可以了。 这个没有啥理论知识,就是对于redisson的 delayedQueue延迟队列的封装, 接下来直接粘贴代码,有需要的直接复制过去用,没需要的可以看看我的代码指指毛病。 1.导入redisson包 注意,如果是Springboot的项目强制使用,别单独引入redisson的jar包,再自己配置config <dependency> <groupId> org.redisson </groupId> <artifactId> redisson-spring-boot-starter </artifactId> <version> 3.10.5 </version> </dependency> 2.用上面的包直接配置SpringBootRedis标准就可以 spring.redis.host = 192.168.1.100 spring.redis.port =

分布式锁深度剖析-疫情不断,学习怎能断

╄→尐↘猪︶ㄣ 提交于 2020-02-26 09:32:29
疫情不断,学习怎能断,今天主要学习分布式锁相关原理 分布式锁深度剖析 1、分布式锁的应用场景 生产一个具体业务场景的唯一订单编号,并发场景下订单号生产会重复嘛? 2、分布式锁的原理、实现方式 锁具有的特点: 排他性:只有一个线程能获取 在计算机技术中,可提供排他性的有:文件系统,数据库(主键 唯一约束 )、缓存redis(setnx)、zookeeper(类似文件系统) 阻塞性:其他未抢到的线程阻塞,直到锁释放出来,再抢 可重入性:线程获得锁后,后续是否可重复获取该锁 常用分布式锁实现技术: 基于数据库实现 性能差,容易出现单点故障,锁没有失效时间,容易死锁 基于缓存实现 实现复杂,性能好,存在死锁(或段时间死锁)的可能 基于Zookeeper实现 实现相对简单、可靠性高、性能较好,不出现死锁 3、基于Zookeeper的分布式锁的实现 Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,Hadoop和Hbase的重要组件。 Zookeeper特点: 节点数数据结构,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据; 通过客户端可对znode进行增删改查操作,还可以注册watcher监控znode Zookeeper节点类型: (在同一个znode点下,不允许存在同名节点) 持久节点 持久顺序节点 临时节点 临时顺序节点

#IT明星不是梦#nginx+tomcat集群redis共享session方案实战案例

和自甴很熟 提交于 2020-02-25 18:57:55
一、常见的session一致性方案 在web集群系统中,为了使web能适应大规模的访问,需要实现应用的集群部署. 而实现集群部署首先要解决session的统一,即需要实现session的一致性,目前,实现session一致性主要有两个方案,分别是session复制和session共享。 session复制,是指session信息会在集群节点之间复制,每个节点服务器上都会有相同的session信息。 这种方案的优点是即使一个节点服务器宕机了,只要还有服务器存活,session信息就不会丢失,也就不影响用户使用。而缺点是集群节点之间通信频繁,对应用的响应速度有影响,在高并发、高频操作的情况下性能下降会更厉害。 第二种方案是session共享,也就是将session信息保存在内存数据库中,然后多个节点都可以来访问内存中的session信息,最常见的就是基于Memcache/Redis等数据库的session共享。 tomcat自带集群中,提供了session复制功能,session信息会在各个tomcat中同步,session复制对网络要求较高,session内存的消耗对tomcat影响非常大,对于小集群来说,这种session复制基本够用了,而对于大型集群,还是建议使用redis或者memcache进行session共享。 因此,在构建tomcat集群时

RedissonClient获取锁源码解析

安稳与你 提交于 2020-02-20 10:17:24
代码示例: public static boolean acquire(RedissonClient redisson, String lockKey, Long waitTime, Long leaseTime) {     // 实例化锁对象(此时未请求redis) RLock lock = redisson.getLock(lockKey); boolean lockResult; try { lock.lock();       // 加锁 lockResult = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS); }catch (Exception e){ lockResult = false; } if (lockResult){ log.info("======lock success <"+lockKey+">======"+Thread.currentThread().getName()); }else { log.error("======lock error <"+lockKey+">======"+Thread.currentThread().getName()); } //加锁成功 return lockResult; } 流程图: 源码分析: Redisson实例化 /***************