redisson

Redisson实现分布式锁及其底层原理解析

社会主义新天地 提交于 2019-12-04 05:31:58
目前主流的开源解决方案有jedis,redission,lettuce三种解决方案,其中jedis是同步的方案,现在包括spring-data也已经不再内置使用了,替换成了lettuce。redission和lettuce都是基于netty的也就是说他俩都是异步非阻塞的,但是他们有什么区别呢?其实在使用语法上面有一些区别,redission对结果做了一层包装,通过包装类来进行一些额外的操作来达到异步操作,并且redission提供了额外的分部署锁功能。 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比, 功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离, 从而让使用者能够将精力更集中地放在处理业务逻辑上。 Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。 Redisson使用非阻塞的I/O和基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。 一

SpringBoot集成redisson分布式锁

三世轮回 提交于 2019-12-03 22:17:37
SpringBoot集成redisson分布式锁 https://www.cnblogs.com/yangzhilong/p/7605807.html 前几天同事刚让增加上这一块东西. 百度查一下 啥意思.. 学习一下. 官方文档: https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 20180226更新:增加tryLock方法,建议后面去掉DistributedLocker接口和其实现类,直接在RedissLockUtil中注入RedissonClient实现类(简单但会丢失接口带来的灵活性)。 20190711更新:redisson官方发布了 redisson-spring-boot-starter,具体可以参考: https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter#spring-boot-starter 1、引用redisson的pom <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.5.0</version> </dependency> 2、定义Lock的接口定义类

Redisson项目介绍

不问归期 提交于 2019-12-03 16:00:59
Redisson项目介绍 Redisson 是架设在 Redis 基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 Redisson采用了基于NIO的 Netty 框架,不仅能作为Redis底层驱动客户端,具备提供对Redis各种组态形式的 连接功能 ,对Redis命令能以同步发送、 异步形式发送 、 异步流形式发送 或 管道形式发送 的功能, LUA脚本执行 处理,以及 处理返回结果 的功能,还在此基础上融入了更高级的应用方案,不但将原生的Redis Hash , List , Set , String , Geo , HyperLogLog 等数据结构封装为Java里大家最熟悉的 映射(Map) , 列表(List) , 集(Set) , 通用对象桶(Object Bucket) , 地理空间对象桶(Geospatial Bucket) , 基数估计算法(HyperLogLog) 等结构,在这基础上还提供了分布式的

聊聊redisson的分布式锁

心不动则不痛 提交于 2019-12-03 16:00:47
序 本文主要研究一下redisson的分布式锁 maven <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.8.1</version> </dependency> 实例 @Test public void testDistributedLock(){ Config config = new Config(); // config.setTransportMode(TransportMode.EPOLL); config.useSingleServer() .setAddress("redis://192.168.99.100:6379"); RedissonClient redisson = Redisson.create(config); IntStream.rangeClosed(1,5) .parallel() .forEach(i -> { executeLock(redisson); }); executeLock(redisson); } public void executeLock(RedissonClient redisson){ RLock lock = redisson.getLock("myLock"); boolean

聊聊redisson的RMap的computeIfAbsent操作

南笙酒味 提交于 2019-12-03 16:00:32
序 本文主要研究一下redisson的RMap的computeIfAbsent操作 实例 @Test public void testRMapComputeIfAbsent(){ Config config = new Config(); config.useSingleServer() .setAddress("redis://192.168.99.100:6379"); RedissonClient redisson = Redisson.create(config); RMap<String, CityInfo> map = redisson.getMap("anyMap"); CityInfo bj = CityInfo.builder().name("bj").build(); CityInfo currentObject = map.computeIfAbsent("bj", k -> bj); Assert.assertEquals(bj.toString(),currentObject.toString()); } 源码分析 ConcurrentMap.computeIfAbsent java/util/concurrent/ConcurrentMap.java /** * {@inheritDoc} * * @implSpec * The default

关于Redis的主从、哨兵、集群

大城市里の小女人 提交于 2019-12-03 05:32:54
关于Redis主从、哨兵、集群的介绍网上很多,这里就不赘述了。 一、主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。 在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库[1] (slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。 主从数据库的配置 master slave 主不用配置,从redis的conf文件加入 slaveof ip port 就可以了 或者从redis启动时 redis-server --port 6380 --slaveof 127.0.0.1 6379 从数据库一般是只读,可以改为可写

高性能分布式锁-redisson的使用

匿名 (未验证) 提交于 2019-12-03 00:44:02
下面介绍下如何使用Redisson。 2,Redisson的使用方式十分简单,详见官方文档:https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95 3,加入jar包的依赖: <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>2.7.0</version> </dependency> 4,配置Redisson public class RedissonManager { private static Config config = new Config(); // 声明redisso对象 private static Redisson redisson = null ; // 实例化redisson public static void init(String key,String value){ try { // 使用单机版配置 config.useSingleServer().setAddress("127.0.0.1:6379" ); // 得到redisson对象 redisson = (Redisson) Redisson.create

SpringBoot2整合redission

匿名 (未验证) 提交于 2019-12-03 00:44:02
1、 配置方法 2、 第三方框架整合 3、 相关API文档 4、工具类 import java.util.Map; import org.redisson.api.RAtomicLong; import org.redisson.api.RBucket; import org.redisson.api.RCountDownLatch; import org.redisson.api.RDeque; import org.redisson.api.RList; import org.redisson.api.RLock; import org.redisson.api.RMap; import org.redisson.api.RQueue; import org.redisson.api.RSet; import org.redisson.api.RSortedSet; import org.redisson.api.RTopic; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; @Service public class RedissonUtils{ /** * 获取字符串对象 * @param redisson * @param t * @param

基于Redis的分布式锁

匿名 (未验证) 提交于 2019-12-03 00:43:02
Redis分布式锁 1、锁场景 需要对同一共享资源进行写操作 对资源的访问是互斥的 任务通过竞争获取锁才能才能对该资源进行操作(竞争锁) 当有一个任务对资源进行操作时(占有锁) 其他任务不能对该资源进行操作(任务阻塞) 直到该任务操作结束(释放锁) 竞争锁 -> 占有锁 -> 任务阻塞 -> 释放锁 graph LR A(竞争锁) -->B(占有锁) B(占有锁) --> C[任务阻塞] C[任务阻塞] --> D[释放锁] 2、实现思路 加锁: 通过setnx向特定的key写入一个随机值,并设置失效时间,写值成功即加锁成功 1、必须给锁设置失效时间:避免死锁 2、加锁时,每个节点产生一个随机字符串:避免误删锁 3、写入随机值与设置失效时间同一命令:保证原子性 解锁: 匹配随机值,删除redis上特定的key数据,保证获取数据,判断一致性,以及删除数据也是原子性 if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end 3、代码实现 1、RedisTemplate实现 基于RedisTemplate简单封装的RedisHelper,这不是重点 实现Lock接口,完成加锁解锁的redis操作 1、tryLock:加锁操作(注意设置有效时间防止死锁

基于redisson实现快速缓存

匿名 (未验证) 提交于 2019-12-03 00:43:02
package com.*.servicecore; import com.google.common.collect.*; import org.redisson.api.*; import java.util.*; import java.util.concurrent.TimeUnit; /** * @desc redis缓存工具类 * @author ly * @date 2019-05-20 */ public final class RedisCacheService { /* 空值缓存时间5分钟 */ private static final int NULL_VALUE_KEY_CACHE_MILLISECONDS = 5 * 60 * 1000; //分布式map集合 private RMap rMap; //集合可缓存空值 private RSetCache rSetCache; // redisson客户端 private RedissonClient redisson; /** 批量操作选项 (目前redisson版本不支持)*/ //private BatchOptions options = BatchOptions.defaults(); // 是否有ttl控制 private boolean ttlControl; //缓存名称 private