Spring Cloud集成Spring Data Redis

  • 内容
  • 评论
  • 相关

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

Redis 是一个高性能的 key-value 数据库,同时支持多种存储类型,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set——有序集合)和 Hash(哈希类型)。

用 Redistemplate 操作 Redis

在 Java 中操作 Redis 我们可以用 Jedis,也可以用 Spring Data Redis。

本节我们基于 Spring Data Redis 操作 Redis,Spring Data Redis 也是基于 Jedis 来实现的,它在 Jedis 上面封装了一层,让我们操作 Redis 更加简单。

关于在 Spring Boot 中集成 Spring Data Redis 不做过多讲解,本节主要讲怎么用 Redistemplate 操作 Redis。

Redistemplate 是一个泛型类,可以指定 Key 和 Value 的类型,我们以字符串操作来讲解,可以直接用 StringRedisTemplate 来操作。

在使用的类中直接注入 StringRedisTemplate 即可,如下代码所示。

@Autowired
private StringRedisTemplate stringRedisTemplate;

StringRedisTemplate 中提供了很多方法来操作数据,主要有以下几种:

  • opsForValue:操作 Key Value 类型
  • opsForHash:操作 Hash 类型
  • opsForList:操作 List 类型
  • opsForSet:操作 Set 类型
  • opsForZSet:操作 opsForZSet 类型

下面我们以 Key Value 类型来讲解,设置一个缓存,缓存时间为 1 小时,如下代码所示。

stringRedisTemplate.opsForValue().set("key", "C", 1, TimeUnit.HOURS);

获取缓存,如下代码所示。

String value = stringRedisTemplate.opsForValue().get("key");

删除缓存,如下代码所示。

stringRedisTemplate.delete("key");

判断一个 key 是否存在,如下代码所示。

boolean exists = stringRedisTemplate.hasKey("key");

如果你不喜欢用这些封装好的方法,想要用最底层的方法来操作也是可以的。通过 StringRedisTemplate 可以拿到 RedisConnection,如下代码所示。

RedisConnection connection = stringRedisTemplate.getConnectionFactory().getConnection();

用 Repository 操作 Redis

凡是 Spring Data 系列的框架,都是一种风格,我们都可以用 Repository 方式来操作数据。下面我们看下怎么使用 Repository。

定义一个数据存储的实体类,@Id 类似于数据库中的主键,能够自动生成,RedisHash 是 Hash 的名称,相当于数据库的表名,如下代码所示。

@Data
@RedisHash("persons")
public class Person {
    @Id
    String id;
    String firstname;
    String lastname;
}

定义 Repository 接口,代码如下所示。

public interface PersonRepository extends CrudRepository<Person, String> {

}

使用接口对数据进行增删改查操作,代码如下所示。

@Autowired
PersonRepository repo;
public void basicCrudOperations() {
    Person person = new Person("张三", "zhangsan");
    repo.save(person);
    repo.findOne(person.getId());
    repo.count();
    repo.delete(person);
}

数据保存到 Redis 中会变成两部分,一部分是一个 set,里面存储的是所有数据的 ID 值,另一部分是一个 Hash,存储的是具体每条数据。

Spring Cache缓存数据

一般的缓存逻辑都是下面代码这样的方式,首先判断缓存中是否有数据,有就获取数据返回,没有就从数据库中查数据,然后缓存进去,再返回。

public Person get(String id) {
    Person person = repo.findOne(id);
    if (person != null) {
        return person;
    }
    person = dao.findById(id);
    repo.save(person);
    return person;
}

首先这种方式在逻辑上是肯定没有问题的,大部分人也都是这么用的,不过当这种代码充满整个项目的时候,看起来就非常别扭了,感觉有点多余,不过通过 Spring Cache 就能解决这个问题。我们不需要关心缓存的逻辑,只需要关注从数据库中查询数据,将缓存的逻辑交给框架来实现。

Spring Cache 利用注解方式来实现数据的缓存,还具备相当的灵活性,能够使用 SpEL(Spring Expression Language)来定义缓存的 key,还能定义多种条件判断。

Spring Cache 的注解定义在 spring-context 包中,如图 1 所示。

Spring Cache注解
图 1  Spring Cache注解

本文标题:Spring Cloud集成Spring Data Redis

本文地址:https://www.hosteonscn.com/6791.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注