Spring-data-redis 的使用记录

2016/1/9 posted in  Spring Boot comments

开始向导

添加 dependency spring-boot-starter-redis,它默认使用 jedis(还支持 JRedis,SRP 和 Lettuce)
一个简单的 Hash 示例:

@SpringBootApplication
public class RedisDemo implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public static void main(String[] args) {
        SpringApplication.run(RedisDemo.class).close();
    }

    public void run(String... args) throws Exception {
        BoundHashOperations<String, String, String> ops = stringRedisTemplate.boundHashOps("com.foo");
        ops.put("name", "bar");
        ops.put("sex", "man");
        System.out.println(ops.entries()); // 打印结果:{name=bar, sex=man}
    }
}

RedisTemplate

RedisConnection 负责提供底层的数据操作;而 RedisTemplate 提供对 Redis 数据操作统一的抽象实现,并负责序列化存取的数据以及和 Redis 的连接管理。

StringRedisTemplate 继承自 RedisTemplate,用于操作基于字符串的存取操作。

针对 Redis 不同的存取类型,RedisTemplate 提供了不同的操作视图。

ValueOperations
ListOperations
SetOperations
ZSetOperations
HashOperations
HyperLogLogOperations

spring-data-redis 同时提供了绑定 key 的操作视图,省去每次都需要填写 key 的麻烦。

BoundValueOperations
BoundListOperations
BoundSetOperations
BoundZSetOperations
BoundHashOperations

RedisSerializer

RedisTemplate 默认采用 JdkSerializationRedisSerializer 序列化,提供的序列化类有:

  • JdkSerializationRedisSerializer
  • StringRedisSerializer
  • OxmSerializer
  • JacksonJsonRedisSerializer
  • Jackson2JsonRedisSerializer

我们也可以自己实现 RedisSerializer 接口的 serialize 和 deserialize 方法,来实现对自定义对象的序列化和反序列化存取。

@SpringBootApplication
public class RedisDemo implements CommandLineRunner {
    @Autowired
    private RedisTemplate redisTemplate;

    public static void main(String[] args) {
        SpringApplication.run(RedisDemo.class).close();
    }

    public void run(String... args) throws Exception {
        redisTemplate.setValueSerializer(new DomainSerializer());
        BoundValueOperations<String, Person> ops = redisTemplate.boundValueOps("foo.diy");
        ops.getAndSet(new Person("foo"));
        System.out.println(ops.get());
    }
}

class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Domain{" +
                "name='" + name + '\'' +
                '}';
    }
}

class DomainSerializer implements RedisSerializer<Person> {
    @Override
    public byte[] serialize(Person person) throws SerializationException {
        return person.getName().getBytes();
    }

    @Override
    public Person deserialize(byte[] bytes) throws SerializationException {
        return new Person(new String(bytes));
    }
}