首先在SpringBoot项目中导入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
配置yaml文件
spring:
redis:
host: xxx.xxx.xx.xx
port: 6379
password: 123456
lettuce:
pool:
max-active: 8 # 最大连接
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100 # 连接等待时间
注入RedisTemplate
@Autowired
//注入RedisTemplate如果存储String的类型需要设置序列化方式,可以直接使用StringRedisTemplate
//private StringRedisTemplate stringRedisTemplate;
private RedisTemplate redisTemplate;
通过RedisTemplate 进行操作Redis
//指定序列化方式,key和value都是String类型时
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set("Spring","lalala");
Object spring = redisTemplate.opsForValue().get("Spring");
System.out.println("spring = " + spring);
输出
spring = lalala
注意:如果不设置序列化方式,那么在存入Redis中时会出现以下情况
"\xac\xed\x00\x05t\x00\x06Spring"
"\xac\xed\x00\x05t\x00\x06lalala"
而使用SpringRedisTemplate是因为它继承了RedisTemplate并且设置了序列化方式
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
......
}
当需要传入的是
//指定序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
User user = new User(1, "Stephen", "123", "[email protected]");
redisTemplate.opsForValue().set("user:1",user);
Object o = redisTemplate.opsForValue().get("user:1");
System.out.println("o:"+o.toString());
输出:
o:User(id=1, userName=Stephen, password=123, email=[email protected])
在Redis中存储为
JSON序列化仍然存在问题,它不仅存储了对象的属性,还存储了class类型,加大了开销。
通常在存储对象时,统一采用String序列化器,只存储
首先注入SpringRedisTemplate
@Autowired
//注入RedisTemplate如果存储String的类型需要设置序列化方式,可以直接使用StringRedisTemplate
private StringRedisTemplate redisTemplate;
然后配置JSON工具帮助我们进行序列化和反序列化
private static final ObjectMapper mapper = new ObjectMapper();
使用SpringRedisTemplate操作Redis
User user = new User(1, "Stephen", "123", "[email protected]");
//设置数据时进行手动序列化
redisTemplate.opsForValue().set("user:1", mapper.writeValueAsString(user));
//读取数据
String o = redisTemplate.opsForValue().get("user:1");
//反序列化
User user1 = mapper.readValue(o, User.class);
System.out.println("user1:"+user1);
输出:
user1:User(id=1, userName=Stephen, password=123, [email protected])
可以看到此时只有对象的属性值存储在Redis中,减少了开销。
如果需要存入hash类型的值也跟上面的操作类似
redisTemplate.opsForHash().put("user:688","name","hhh");
redisTemplate.opsForHash().put("user:688","age","22");
redisTemplate.opsForHash().put("user:688","salary","88888");
Map<Object, Object> entries = redisTemplate.opsForHash().entries("user:688");
System.out.println("entries:"+entries);