【Redis】Redis 的 Java 客户端(Jedis、SpringDataRedis)
文章目录
- 1. Jedis
- 1.1 使用步骤
- 1.2 Jedis 连接池
- 2. SpringDataRedis
- 2.1 基本介绍
- 2.1 使用方式
- 2.3 SpringDataRedis 的序列化方式
- 2.4 StringRedisTemplate
1. Jedis
Jedis 是 Redis 官方推荐的 Java 连接开发工具。
Jedis 的官网地址为:https://github.com/redis/jedis。
1.1 使用步骤
引入依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version> </dependency>
创建 Jedis 对象,建立连接
private Jedis jedis;// 1. 建立连接 jedis = new Jedis("IP",6379); // 2. 设置密码 jedis.auth("1234"); // 3. 选择库(不选默认为 0 号库) jedis.select(0);
使用 Jedis,方法名与 Redis 命令一致
// 测试 String 类型 // 存入数据 String result = jedis.set("color", "red"); System.out.println("result = " + result); // 获取数据 String color = jedis.get("color"); System.out.println(color);// 测试 hash 类型 // 存入 hash 数据 jedis.hset("user:1", "name", "jack"); jedis.hset("user:1", "age", "21"); // 取数据 Map<String, String> map = jedis.hgetAll("user:1"); map.forEach((k, v) ->{System.out.println(k + ": " + v); });
释放资源
// 关闭资源 if(jedis != null){jedis.close(); }
1.2 Jedis 连接池
Jedis 本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用 Jedis 连接池代替 Jedis 的直连方式。
以下对 Jedis 做了一个封装:
public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 配置连接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大连接jedisPoolConfig.setMaxTotal(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 设置最长等待时间(ms)jedisPoolConfig.setMaxWaitMillis(1000);// 创建连接池对象jedisPool = new JedisPool(jedisPoolConfig, "IP",6379, 1000, "1234");}// 获取 Jedis 对象public static Jedis getJedis(){return jedisPool.getResource();}
}
2. SpringDataRedis
2.1 基本介绍
SpringData 是 Spring 中数据操作的模块,包含对各种数据库的集成,其中对 Redis 的集成模块就叫做 SpringDataRedis,官网地址为:https://spring.io/projects/spring-data-redis。
SpringDataRedis 有很强大的功能:
- 提供了对不同 Redis 客户端的整合。(Lettuce 和 Jedis)
- 提供了 RedisTemplate 统一 API 来操作 Redis
- 支持 Redis 的发布订阅模型
- 支持 Redis 哨兵和 Redis 集群
- 支持基于 Lettuce 的响应式编程
- 支持基于 JDK、JSON、字符串、Spring 对象的数据系列化及反序列化
- 支持基于 Redis 的 JDKCollection 实现
2.1 使用方式
SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作。并且将不同数据类型的操作 API 封装到了不同的类型中:
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue()
|
ValueOperations | 操作 String 类型数据 |
redisTemplate.opsForHash()
|
HashOperations | 操作 Hash 类型数据 |
redisTemplate.opsForList()
|
ListOperations | 操作 List 类型数据 |
redisTemplate.opsForSet()
|
SetOperations | 操作 Set 类型数据 |
redisTemplate.opsForZSet()
|
ZSetOperations | 操作 SortedSet 类型数据 |
redisTemplate
|
通用命令 |
SpringBoot 已经提供了对 SpringDataRedis 的支持,使用方式如下:
引入依赖
<!-- Redis 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 连接池依赖 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency>
配置文件(Spring 默认使用 lettuce 实现,可以直接引用,如果要选择 jedis,则要额外引入相关依赖)
spring:redis:host: IPport: 6379password: 1234database: 0 # 选择0号数据库lettuce: # 选择 lettucepool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接min-idle: 0 # 最小空闲连接max-wait: 1000 # 连接等待时间
注入 RedisTemplate
@Autowired private RedisTemplate redisTemplate;
编写测试
@Autowired private RedisTemplate redisTemplate;// 写入一条 String 数据 redisTemplate.opsForValue().set("name", "rose"); // 获取数据 Object name = redisTemplate.opsForValue().get("name"); System.out.println("name = " + name);
2.3 SpringDataRedis 的序列化方式
RedisTemplate 可以接收任意 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,得到的结果为:
在 RedisTemplate 的源码中,我们可以发现 key 和 value 的序列化器的值为 null。
当默认的序列化器的值为 null 时,就会通过 JDK 的序列化器来对 key 和 value 进行序列化。
而 JDK 的序列化器是通过 ObjectOutputStream 将 key 和 value 转化成字节再传递到 Redis 中的。因此会具有如下缺点:
- 可读性差
- 内存占用大
解决办法:
改变 RedisTemplate 的序列化方式,而 RedisTemplate 中除了可以使用 JdkSerializationRedisSerializer 外,还能够使用以下两种:
- StringRedisSerializer:用于将 String 进行序列化的工具,适合当作 key 的序列化器。
- GenericToStringSerializer(不推荐,原因在下一节):是转 JSON 字符串的序列化工具,适合用作含有对象的 value 进行进行序列化。
自定义 RedisTemplate 的序列化方式如下:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 创建 RedisTemplate 对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建 JSON 序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置 Key 的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 Value 的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}
注意:
使用 GenericToStringSerializer 需要引入 json 依赖(mvc 依赖中会自带):
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
2.4 StringRedisTemplate
尽管 JSON 的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
为了在反序列化时知道对象的类型,JSON 序列化器会将类的 class 类型写入 json 结果中,再存入 Redis,会带来额外的内存开销。
解决办法:
为了节省内存空间,其实并不会使用 JSON 序列化器来处理 value,而是使用 String 序列化器,要求只能才能出 String 类型的 key 和 value。当我们需要存储 Java 对象时,手动完成对象序列化和反序列化。
Spring 默认提供了一个 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认是 String 方式,省去了自定义 RedisTemplate 的过程。
使用方式如下:
@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON 工具
private static final ObjectMapper objectMapper = new ObjectMapper();// 准备对象
User user = new User("李四", 18);
// 手动序列化
String jsonString = objectMapper.writeValueAsString(user);
// 写入数据到 redis
stringRedisTemplate.opsForValue().set("user:9", jsonString);
// 读取数据
String val = stringRedisTemplate.opsForValue().get("user:9");
// 反序列化
User user1 = objectMapper.readValue(val, User.class);
System.out.println("user1 = " + user1);
【Redis】Redis 的 Java 客户端(Jedis、SpringDataRedis)相关推荐
- jedis使用_Redis --Java客户端 Jedis
Redis --Java客户端 Jedis 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 Jedis: 一款java操作 ...
- Redis的Java客户端-Java客户端以及SpringDataRedis的介绍与使用
1. Redis的Java客户端 Spring Data Redis底层支持同时兼容Jedis和Lettuce两种不同的Redis客户端,可以根据需要任意选择使用其中的一种.这样既可以保留现有代码使用 ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍(转)
[-] 一普通同步方式 二事务方式Transactions 三管道Pipelining 四管道中调用事务 五分布式直连同步调用 六分布式直连异步调用 七分布式连接池同步调用 八分布式连接池异步调用 九 ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍--转载
原文地址:http://www.blogways.net/blog/2013/06/02/jedis-demo.html redis是一个著名的key-value存储系统,而作为其官方推荐的java版 ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
一.普通同步方式 二.事务方式(Transactions) 三.管道(Pipelining) 四.管道中调用事务 五.分布式直连同步调用 六.分布式直连异步调用 七.分布式连接池同步调用 八.分布式连 ...
- java redis管道_Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...
- Redis的Java客户端——Jedis
目录 一.基本配置 1.1 引入依赖 1.2 建立连接 1.3 测试String类型 1.4 释放资源 1.5 运行结果 二.Jedis连接池 一.基本配置 Jedis的官方地址:GitHub - ...
- java redis集群连接池_(08)redis之使用java客户端、spring连接redis、redis集群示例...
一.java代码连接 1.新建工程,并引入以下包: jedis-2.7.0.jar.commons-pool2-2.3.jar.junit-4.10.jar 2.单实例连接 /*** 单实例连接*/@ ...
- Redis介绍 Java客户端操作Redis
Redis介绍 && Java客户端操作Redis 本文内容 redis介绍 redis的 shell 客户端简介 redis的 java 客户端简介 环境配置 redis 2.8.1 ...
- Redis介绍 Java客户端操作Redis
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow Redis介绍 & ...
最新文章
- 关于JS中switch语句的判断条件!
- 原来,王兴是理想汽车的「二当家」!股份只比李想少1.6%丨理想汽车招股书
- Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;
- 排错之网络映射缓存凭证记录导致备份计划任务失败
- 2.数据中心网络演进
- 形容PHP程序员的语句,形容程序员的句子
- linux 中查找文件,并且将目标文件按时间顺序排序
- 计算机网络实用期末试题和答案,计算机网络期末考试试题及答案(1)
- php dom 丢失内容,PHP DOMDocument缺失
- Matlab--存储和加载.mat文件形式的数据
- 王者荣耀s12赛季服务器维护,王者荣耀S12赛季延期,这篇攻略让我段位狂涨!
- python接口自动化(十二)--https请求(SSL)(详解)
- 升级 phpstud y中的 mysql 版本
- Quill – 可以灵活自定义的开源的富文本编辑器
- 《SAP快速入门》视频课程
- IDEA 运行 Tomcat 中文乱码的问题
- 确定权重的方法总结(部分)
- fastdfs 内网 公网 双ip问题
- 基于卷积神经网络的像素级图像融合——硕士论文阅读笔记
- Typora-PicGo-SMMS图床(Mac电脑和windows电脑)
热门文章
- java s字符_javas字符串
- inter无线网卡服务器版驱动,Intel英特尔
- STAPLE目标跟踪算法 基于C++ /Opencv实现步骤以及代码详解
- 实时指令控制继电器(树莓派)
- elasticsearch-对接ldap认证
- 传奇人物《周兴和》书连载26 猫与老鼠的游戏
- 学生怎么免费领取office办公软件?
- 全国高校人工智能与大数据创新联盟,再次首推云创高校大数据与人工智能实验室建设方案...
- 【pen200-lab】10.11.1.121
- 必备软件一键安装卸载脚本(小作业)