一、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)相关推荐

  1. Redis Java Client选型-Jedis Lettuce Redisson

    目录 1. 目标 2. 选型过程 2.1. 待选集合 2.2. 对比列表 2.3. 确定选型的考虑角度 1. 目标 针对redis java client,从多角度进行选型对比,以便选择符合业务要求的 ...

  2. springboot项目导入Redis依赖后在测试类中无法使用(RedisTemplate),报空指针

    问题描述: 在springboot项目导入Redis依赖后,在测试类中无法使用(RedisTemplate),报空指针 前提是都已经添加了注入注解: 添加了注解后还是会报错: 解决方法: 在启动类中加 ...

  3. SpringBoot项目中集成第三方登录功能

    SpringBoot项目中集成第三方登录功能 引言 1 环境准备 2 代码实现 3 第三方平台认证申请 4 打包和部署项目 5 第三方平台登录认证测试 6 参考文章 引言 最近想把自己在公众号上介绍过 ...

  4. Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo

    Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo 最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4. ...

  5. 项目使用了redis还需要mysql_【11-05】lnmp项目中Redis和Mysql配合使用应该注意哪些问题?...

    [今日话题] lnmp项目中Redis和Mysql配合使用应该注意哪些问题? - 刺客 1. 我这边因为项目小,主要用redis充当mysql的缓存使用,把活跃数据预读到redis中,这样绝大部分的请 ...

  6. pycharm项目中如何安装包_如何将Thymeleaf技术集成到SpringBoot项目中

    给天气预报一个"面子" 截至目前,不仅有了天气预报的API接口,也有了数据的缓存方案.现在,就要进行天气预报服务的实现,也就是说,这里需要一个面向用户的应用.这个应用应该拥有友好的 ...

  7. 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率

    基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率 1.拉取logstash,kibana,es,mysql镜像 #命令 ...

  8. 关于webservice服务在springboot项目中的开发的介绍

    在springboot项目中搭建webservice服务端及使用客户端进行请求的介绍 一.引包 二.搭建webservice服务 (一)使用CXF搭建webservice服务 (二)webservic ...

  9. springboot项目中接口防止恶意请求多次,重复请求的解决办法,适合小白

    在项目中,接口的暴露在外面,很多人就会恶意多次快速请求,那我们开发的接口和服务器在这样的频率下的话,服务器和数据库很快会奔溃的,那我们该怎么防止接口防刷呢?由于博主小白,很多都不懂,都是从网上一点一点 ...

最新文章

  1. GitHub为所有人免费提供了所有核心功能-这就是您应该关心的原因
  2. 图像处理之快速均值模糊(Box Blur)
  3. ADO.NET学习笔记-非链接类
  4. 更改Linux用户的登录shell环境
  5. iis Service Unavailable解决方法(权限问题)
  6. 微盘 计算机英语,高中英语,微盘.doc
  7. python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
  8. 为Mac OS X添加用Firefox搜索服务
  9. 关于HTML和CSS
  10. pythonz字体颜色以及终端不显示颜色的解决办法
  11. 计算机显示器出现黑屏分析
  12. 卷积神经网络之“浅层特征”与“深层特征”
  13. 安全架构--12--企业隐私合规体系建设总结
  14. supervisor控制台运行出错,BACKOFF Exited too quickly
  15. 效率倍增,5 个提高生产力的 Jupyter notebook插件
  16. 关于CORBA实现的介绍
  17. 产品交互设计入门书籍推荐(亲自看过)
  18. Java Web应用开发_04javaWeb基础
  19. IC人物志-冯·诺依曼54年传奇:上帝让他开挂?
  20. unity2D物体朝向并靠近鼠标位置,击退效果

热门文章

  1. 工业交换机的单模多模是什么意思?
  2. 梦幻西游 WSG 文件格式分析
  3. wifi底层学习之路:二,无线配置管理服务cfg80211
  4. javascript监听esc按键事件
  5. 拼多多势不可挡的发展|一度智信
  6. 基于STM32MP157的鸿蒙学习(一)— 资料下载及入门
  7. linux 桌面 修复工具下载,恢复ubuntu20.04默认桌面管理器
  8. Joining_thread简单实现
  9. C#免费教程(bili网站搜罗VSTO免费视频资源)
  10. 老司机 iOS 周报 #15 | 2018-04-16