我们以Jedis为例,首先记得在pom中引入对应坐标:
<!-- redis-stater -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--common-pool redis连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
然后在application.yml配置对应参数,例如:
spring:
data:
redis:
host: 192.168.197.129 # redis服务IP
port: 6379 # 端口
password: 123321 # redis auth 认证密码
lettuce:
pool:
max-active: 8 # 最大连接数
max-idle: 8 # 最大空闲连接数
max-wait: 100ms # 最长等待时间
这时候我们来看个例子,输出的话其实不难发现存在问题,就是他实际存的和我们设想的不一样,而且其实key和value都是如此:
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("day","2023-11-28");
String day = (String)redisTemplate.opsForValue().get("day");
System.out.println(day);
}
}
输出:xAC\xED\x00\xo5t\x00\x0A2023-11-28
好,让我们解释一下这是为啥,因为RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化。(字节形式可读性差,且占用内存较大)
所以我们得改造一下RedisTemplate,让其序列化别采用默认的JDK序列化,具体改造如下:
package com.xxx.xxxxx.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean("myRedisTemplate")
public RedisTemplate<String ,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
// 定义一个自己的 String object 类型
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 配置Json序列化,这部分主要是为了把value是对象的部分转化为json格式,使得其可视化
// 而且一定要注意的是,你的项目实体类要是可序列化的
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// String 序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置 String key 以 stringRedisSerializer 解析
redisTemplate.setKeySerializer(stringRedisSerializer);
// 设置 Hash key 以 stringRedisSerializer 解析
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// String value 以Json 解析
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// Hash value 以 Json 解析
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
这样就可以保证redis的可读性了,不过要注意的是,实体类一定要实现Serializable接口,并且,如下所示:
package com.xxx.xxxxx.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="User对象", description="用户信息")
public class User implements Serializable {
// serialVersionUID 是序列化的版本控制标识。
// 如果不定义它,Java 会自动生成一个,但不同 JDK 或改动代码后可能会不一致。
// 显式定义可以避免类结构微调后反序列化失败的风险(抛出 InvalidClassException)。
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ID_WORKER)
private Long id;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "性别")
private String sex;
@ApiModelProperty(value = "身份证号")
private String idNumber;
@ApiModelProperty(value = "头像")
private String avatar;
@ApiModelProperty(value = "状态 0:禁用,1:正常")
private Integer status;
}