一、Jedis
1. Jedis官网地址
https://github.com/redis/jedis
2. 快速入门
(1)引入Maven依赖
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>(2)建立Redis直连
privateJedisjedis;@BeforeEachvoidsetUp(){//建立连接jedis=newJedis("192.168.100.129",6379);//设置密码jedis.auth("1234");//选择数据库jedis.select(0);}(3)测试String类型操作
@TestvoidtestString(){//添加Stringresult=jedis.set("name","阳哥");System.out.println(result);//获取Stringname=jedis.get("name");System.out.println(name);}(4)释放连接资源
@AfterEachvoidtearDown(){if(jedis!=null){jedis.close();}}3. Jedis连接池
使用原因
Jedis原生直连线程不安全;频繁创建、销毁TCP连接会产生大量性能开销,项目生产环境推荐使用Jedis连接池复用连接。
连接池工具类
publicclassJedisConnectionFactory{privatestaticJedisPooljedisPool;static{// 配置连接池参数JedisPoolConfigpoolConfig=newJedisPoolConfig();poolConfig.setMaxTotal(8);// 最大总连接数poolConfig.setMaxIdle(8);// 最大空闲连接数poolConfig.setMinIdle(0);// 最小空闲连接数poolConfig.setMaxWaitMillis(1000);// 获取连接最大等待毫秒数// 初始化连接池jedisPool=newJedisPool(poolConfig,"192.168.100.129",6379,1000,"1234");}// 从连接池获取Jedis连接publicstaticJedisgetJedis(){returnjedisPool.getResource();}}二、SpringDataRedis
简介
SpringDataRedis是Spring家族中用于数据访问的子模块,专门封装Redis客户端操作,底层支持Lettuce(默认,基于Netty异步非阻塞)与Jedis两种客户端,提供统一RedisTemplateAPI简化Redis各类数据类型操作。
核心能力:
- 统一封装Redis五大常用数据类型操作API
- 原生支持发布订阅、哨兵、Redis集群
- 支持响应式编程、多种序列化方案
- 提供集合封装,可直接用Java集合方式操作Redis
1. 快速入门
(1)导入依赖
<!-- SpringBoot Redis Starter --><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>(2)application.yml 配置文件
spring:data:redis:host:192.168.100.129port:6379password:1234lettuce:pool:max-active:8max-idle:8min-idle:0max-wait:100(3)注入模板并测试
@AutowiredprivateRedisTemplateredisTemplate;@TestvoidtestString(){//写入数据redisTemplate.opsForValue().set("name","小王");//获取数据Objectname=redisTemplate.opsForValue().get("name");System.out.println(name);}RedisTemplate 分类API对照表
| API | 返回值类型 | 说明 |
|---|---|---|
| redisTemplate.opsForValue() | ValueOperations | 操作String字符串类型 |
| redisTemplate.opsForHash() | HashOperations | 操作Hash哈希类型 |
| redisTemplate.opsForList() | ListOperations | 操作List列表类型 |
| redisTemplate.opsForSet() | SetOperations | 操作Set无序集合类型 |
| redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet有序集合 |
| redisTemplate 本身 | RedisTemplate | 通用Redis全局命令(删除key、设置过期时间、查询key等) |
三、SpringDataRedis 序列化机制详解
1. 默认序列化规则与问题
RedisTemplate默认使用JDK原生序列化:
存入Redis时会把Java对象序列化为二进制字节数组,读取时再反序列化转回对象。
两大缺点
- 可读性极差:Redis客户端查看key/value会显示乱码二进制串(对应你截图里的
\xac\xed前缀乱码),无法直观查看存储内容; - 内存冗余大:JDK序列化会附带类路径、版本号等额外元信息,占用更多Redis存储空间。
2. 两种主流优化序列化方案
方案一:自定义RedisTemplate,全局JSON序列化
替换默认JDK序列化器,Key/HashKey使用字符串序列化,Value/HashValue使用Jackson JSON序列化,存入Redis为标准JSON格式,兼顾可读性与便捷性。
@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){//创建RedisTemplate对象RedisTemplate<String,Object>template=newRedisTemplate<>();//设置连接工厂template.setConnectionFactory(factory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializerjsonRedisSerializer=newGenericJackson2JsonRedisSerializer();//设置key、hashKey 序列化方式为字符串template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());//设置value、hashValue 序列化方式为JSONtemplate.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();returntemplate;}}优点:直接存入Java对象,框架自动序列化/反序列化,业务代码极简;
缺点:JSON中会额外携带@class字段记录实体类全限定名,依旧存在少量内存浪费。
方案二:使用原生 StringRedisTemplate(推荐)
SpringBoot内置StringRedisTemplate,所有key、value强制只能存储String字符串,无任何默认序列化乱码问题。
需要存储Java对象时,手动借助ObjectMapper完成 对象 ↔ JSON字符串 互转。
示例代码
// Jackson提供,负责Java对象与JSON字符串双向转换privatestaticfinalObjectMapperobjectMapper=newObjectMapper();@TestvoidtestUser(){//创建实体对象Useruser=newUser("虎哥",21);//手动序列化:Java对象 → JSON字符串Stringjson=objectMapper.writeValueAsString(user);//写入RedisstringRedisTemplate.opsForValue().set("user:200",json);//读取Redis字符串StringjsonUser=stringRedisTemplate.opsForValue().get("user:200");//手动反序列化:JSON字符串 → Java对象Useruser1=objectMapper.readValue(jsonUser,User.class);System.out.println(user1);}优点:Redis存储纯JSON文本,无多余字段,内存占用最小、无乱码、排查数据极其方便;
缺点:存取对象需要手动序列化与反序列化,少量增加代码量。
补充说明
ObjectMapper属于Jackson框架核心工具类,SpringBoot web依赖已自动引入,无需额外导包