SpringDataRedis操作Redis

首先在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());
    }
    ......
}

当需要传入的是时,可以设置值的序列化方式为JSON序列化方式

//指定序列化方式
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中存储为

SpringDataRedis操作Redis_第1张图片

JSON序列化仍然存在问题,它不仅存储了对象的属性,还存储了class类型,加大了开销。

通常在存储对象时,统一采用String序列化器,只存储类型的key和value。在存储时,手动完成对象的序列化和反序列化。

首先注入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])

SpringDataRedis操作Redis_第2张图片

可以看到此时只有对象的属性值存储在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);

SpringDataRedis操作Redis_第3张图片

你可能感兴趣的:(Redis,redis,数据库,java,spring,boot)