springboot项目中redis客户端(Jedis、Lettuce、Redisson)
一、redis客户端的对比
1)、Jedis
Jedis作为Redis官方推荐的一款客户端,也算是简单好用,基础功能齐全,在中小型项目中还是很好用的,但是Jedis是直连模式,在多个线程间共享一个Jedis实例时是线程不安全的。
– 为啥不安全呢?不是说Redis是单线程,是世界上最安全的吗?
看官不要激动,这里说的不安全不是说Redis处理数据不安全,而是Jedis向Redis服务器提交数据和从Redis上拿数据不安全,简单阅读Jedis的源码就不难发现,在单个Jedis实例中,向Redis推数据的写流(RedisOutputStream)和从Redis获取数据的读流(RedisInputStream)都是全局属性,当多个线程同时使用这个Jedis实例,也就是说同时操作Redis的写流和读流,结果显而易见,数据会发生不可描述的奇妙融合。
– 那Jedis是不是就不能用了呢?
不是的,多个线程用一个实例会产生问题,那我们就避免这个情况呀,我们为每一个线程分配一个Jedis实例,让他们单独去操作自己的数据。一般使用JedisPoll线程池来实现。
2)、Lettuce
Lettuce也是Redis官方推荐的客户端,是一个基于netty和Reactor的可伸缩线程安全Redis客户端。Lettuce提供了同步、异步、反应式API来与Redis进行交互。和Jedis不同的是Lettuce实例是线程安全的,那就是说,多个线程可以共用一个Lettuce实例来与Redis服务端交互,当然Lettuce也支持通过增加Lettuce实例来满足项目需求。
– 是否优先使用Lettuce?
是的,一般通过springboot引入的Redis支持里面依赖的就是Lettuce。
3)、Redisson
Redisson也是Redis官方推荐的客户端。相比与前面的两种客户端,最后一种客户端想必有一部分人会很陌生。
– 引用官网来简单介绍Redisson
Redisson采用了基于NIO的Netty框架,不仅能作为Redis底层驱动客户端,具备提供对Redis各种组态形式的连接功能,对Redis命令能以同步发送、异步形式发送、异步流形式发送或管道形式发送的功能,LUA脚本执行处理,以及处理返回结果的功能,还在此基础上融入了更高级的应用方案,不但将原生的Redis Hash,List,Set,String,Geo,HyperLogLog等数据结构封装为Java里大家最熟悉的映射(Map),列表(List),集(Set),通用对象桶(Object Bucket),地理空间对象桶(Geospatial Bucket),基数估计算法(HyperLogLog)等结构,在这基础上还提供了分布式的多值映射(Multimap),本地缓存映射(LocalCachedMap),有序集(SortedSet),计分排序集(ScoredSortedSet),字典排序集(LexSortedSet),列队(Queue),阻塞队列(Blocking Queue),有界阻塞列队(Bounded Blocking Queue),双端队列(Deque),阻塞双端列队(Blocking Deque),阻塞公平列队(Blocking Fair Queue),延迟列队(Delayed Queue),布隆过滤器(Bloom Filter),原子整长形(AtomicLong),原子双精度浮点数(AtomicDouble),BitSet等Redis原本没有的分布式数据结构。不仅如此,Redisson还实现了Redis文档中提到像分布式锁Lock这样的更高阶应用场景。事实上Redisson并没有不止步于此,在分布式锁的基础上还提供了联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),红锁(RedLock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)这些实际当中对多线程高并发应用至关重要的基本部件。正是通过实现基于Redis的高阶应用方案,使Redisson成为构建分布式系统的重要工具。
在提供这些工具的过程当中,Redisson广泛的使用了承载于Redis订阅发布功能之上的分布式话题(Topic)功能。使得即便是在复杂的分布式环境下,Redisson的各个实例仍然具有能够保持相互沟通的能力。在以这为前提下,结合了自身独有的功能完善的分布式工具,Redisson进而提供了像分布式远程服务(Remote Service),分布式执行服务(Executor Service)和分布式调度任务服务(Scheduler Service)这样适用于不同场景的分布式服务。使得Redisson成为了一个基于Redis的Java中间件(Middleware)。
总结
Jedis 和 Lettuce 是比较纯粹的 Redis 客户端,几乎没提供什么高级功能。Jedis 的性能比较差,所以如果你不需要使用 Redis 的高级功能的话,优先推荐使用 Lettuce 。
Redisson 的优势是提供了很多开箱即用的 Redis 高级功能,如果你的应用中需要使用到 Redis 的高级功能,建议使用 Redisson。在这种情况下,一般是Lettuce +Redisson一起使用。
二、springboot简单集成
1)、springboot集成Lettuce
引入依赖:
<!--redis(spring-boot-starter-data-redis中包含的Lettuce)-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Lettuce使用线程池必要包-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
配置文件:
####################redis连接配置############
redis:host: 127.0.0.1port: 6379password: 123456database: 0timeout: 2000mslettuce:pool:# 连接池最大连接数max-active: 20# 连接池中的最小空闲连接max-idle: 10# 连接池最大阻塞等待时间(使用负数表示没有限制,单位ms)max-wait: 3000
配置RedisTemplate<String, Object>:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置数据源的连接工厂(默认会传入框架中自带的(也就是读取完配置文件装配的)LettuceConnectionFactory )// 也可以自己定义,注入容器,再通过@Qualifier("")传进来 template.setConnectionFactory(factory);//设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));// hash的key也采用String的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class));return template;}
}
2)、Redisson
引入依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.11.1</version>
</dependency>
配置文件:
@Configuration
public class RedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;@Value("${spring.redis.password}")private String password;@Beanpublic RedissonClient redissonClient() {Config config = new Config();// redis为单机模式config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);return Redisson.create(config);}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();//关联template.setConnectionFactory(factory);//设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));// hash的key也采用String的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class));return template;}
}
完毕!
springboot项目中redis客户端(Jedis、Lettuce、Redisson)相关推荐
- Redis Java Client选型-Jedis Lettuce Redisson
目录 1. 目标 2. 选型过程 2.1. 待选集合 2.2. 对比列表 2.3. 确定选型的考虑角度 1. 目标 针对redis java client,从多角度进行选型对比,以便选择符合业务要求的 ...
- springboot项目导入Redis依赖后在测试类中无法使用(RedisTemplate),报空指针
问题描述: 在springboot项目导入Redis依赖后,在测试类中无法使用(RedisTemplate),报空指针 前提是都已经添加了注入注解: 添加了注解后还是会报错: 解决方法: 在启动类中加 ...
- SpringBoot项目中集成第三方登录功能
SpringBoot项目中集成第三方登录功能 引言 1 环境准备 2 代码实现 3 第三方平台认证申请 4 打包和部署项目 5 第三方平台登录认证测试 6 参考文章 引言 最近想把自己在公众号上介绍过 ...
- Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo 最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4. ...
- 项目使用了redis还需要mysql_【11-05】lnmp项目中Redis和Mysql配合使用应该注意哪些问题?...
[今日话题] lnmp项目中Redis和Mysql配合使用应该注意哪些问题? - 刺客 1. 我这边因为项目小,主要用redis充当mysql的缓存使用,把活跃数据预读到redis中,这样绝大部分的请 ...
- pycharm项目中如何安装包_如何将Thymeleaf技术集成到SpringBoot项目中
给天气预报一个"面子" 截至目前,不仅有了天气预报的API接口,也有了数据的缓存方案.现在,就要进行天气预报服务的实现,也就是说,这里需要一个面向用户的应用.这个应用应该拥有友好的 ...
- 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率
基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率 1.拉取logstash,kibana,es,mysql镜像 #命令 ...
- 关于webservice服务在springboot项目中的开发的介绍
在springboot项目中搭建webservice服务端及使用客户端进行请求的介绍 一.引包 二.搭建webservice服务 (一)使用CXF搭建webservice服务 (二)webservic ...
- springboot项目中接口防止恶意请求多次,重复请求的解决办法,适合小白
在项目中,接口的暴露在外面,很多人就会恶意多次快速请求,那我们开发的接口和服务器在这样的频率下的话,服务器和数据库很快会奔溃的,那我们该怎么防止接口防刷呢?由于博主小白,很多都不懂,都是从网上一点一点 ...
最新文章
- GitHub为所有人免费提供了所有核心功能-这就是您应该关心的原因
- 图像处理之快速均值模糊(Box Blur)
- ADO.NET学习笔记-非链接类
- 更改Linux用户的登录shell环境
- iis Service Unavailable解决方法(权限问题)
- 微盘 计算机英语,高中英语,微盘.doc
- python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
- 为Mac OS X添加用Firefox搜索服务
- 关于HTML和CSS
- pythonz字体颜色以及终端不显示颜色的解决办法
- 计算机显示器出现黑屏分析
- 卷积神经网络之“浅层特征”与“深层特征”
- 安全架构--12--企业隐私合规体系建设总结
- supervisor控制台运行出错,BACKOFF Exited too quickly
- 效率倍增,5 个提高生产力的 Jupyter notebook插件
- 关于CORBA实现的介绍
- 产品交互设计入门书籍推荐(亲自看过)
- Java Web应用开发_04javaWeb基础
- IC人物志-冯·诺依曼54年传奇:上帝让他开挂?
- unity2D物体朝向并靠近鼠标位置,击退效果