用法
Spring Data Redis 允许您轻松实现域实体,如以下示例所示:
示例 1.示例 Person 实体
@RedisHash("people")
public class Person {
@Id String id;
String firstname;
String lastname;
Address address;
}
我们这里有一个非常简单的 domain 对象。
请注意,它的类型上有一个注释,还有一个名为 的属性,该属性用 .
这两个项目负责创建用于持久化哈希的实际密钥。@RedisHash
id
org.springframework.data.annotation.Id
带 Comments 的属性以及命名的属性被视为标识符属性。
带有注释的 Comments 比其他 Comments 更受欢迎。@Id id |
现在,要真正拥有一个负责存储和检索的组件,我们需要定义一个存储库接口,如以下示例所示:
示例 2.用于保留 Person 实体的基本存储库界面
public interface PersonRepository extends CrudRepository<Person, String> {
}
随着我们的存储库扩展,它提供基本的 CRUD 和 finder 操作。
我们需要将事物粘合在一起的是相应的 Spring 配置,如以下示例所示:CrudRepository
例 3.适用于 Redis 存储库的 JavaConfig
@Configuration
@EnableRedisRepositories
public class ApplicationConfig {
@Bean
public RedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
给定前面的设置,我们可以注入到我们的组件中,如以下示例所示:PersonRepository
示例 4.访问 Person 实体
@Autowired PersonRepository repo;
public void basicCrudOperations() {
Person rand = new Person("rand", "al'thor");
rand.setAddress(new Address("emond's field", "andor"));
repo.save(rand); (1)
repo.findOne(rand.getId()); (2)
repo.count(); (3)
repo.delete(rand); (4)
}
1 | 如果当前值是或重用已设置的值,则生成一个新的值,并使用模式为 的键将类型的属性存储在 Redis 哈希中 — 在本例中,它可能是 。id null id Person keyspace:id people:5d67b7e1-8640-2024-beeb-c666fab4c0e5 |
2 | 使用提供的 检索存储在 中的对象。id keyspace:id |
3 | 计算键空间 中可用的实体总数,由 定义 on 。people @RedisHash Person |
4 | 从 Redis 中删除给定对象的键。 |
持久化引用
标记属性 with 允许存储简单的键引用,而不是将值复制到哈希本身。
从 Redis 加载时,引用会自动解析并映射回对象,如以下示例所示:@Reference
例 5.示例属性参考
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
mother = people:a9d4b3a0-50d3-4538-a2fc-f7fc2581ee56 (1)
1 | Reference 存储被引用对象的整个键 ()。keyspace:id |
保存引用对象时,不会保留引用的对象。 您必须单独保留对引用对象的更改,因为仅存储引用。 不会解析对引用类型的属性设置的索引。 |
持久化部分更新
在某些情况下,您无需加载和重写整个实体,只需在其中设置新值。
上次活动时间的会话时间戳可能是您想要更改一个属性的情况。 允许您定义现有对象并对其执行操作,同时负责更新实体本身和索引结构的潜在过期时间。
以下示例显示了部分更新:PartialUpdate
set
delete
例 6.部分更新示例
PartialUpdate<Person> update = new PartialUpdate<Person>("e2c7dcee", Person.class)
.set("firstname", "mat") (1)
.set("address.city", "emond's field") (2)
.del("age"); (3)
template.update(update);
update = new PartialUpdate<Person>("e2c7dcee", Person.class)
.set("address", new Address("caemlyn", "andor")) (4)
.set("attributes", singletonMap("eye-color", "grey")); (5)
template.update(update);
update = new PartialUpdate<Person>("e2c7dcee", Person.class)
.refreshTtl(true); (6)
.set("expiration", 1000);
template.update(update);
1 | 将 simple 属性设置为 .firstname mat |
2 | 将简单的 'address.city' 属性设置为 'emond's field',而不必传入整个对象。 这在注册自定义转化时不起作用。 |
3 | 删除该属性。age |
4 | 设置 complex 属性。address |
5 | 设置值映射,这将删除以前存在的映射并将值替换为给定的值。 |
6 | 在更改 Time To Live (生存时间) 时自动更新 Server 过期时间。 |
更新复杂对象以及 map (或其他集合) 结构需要与 Redis 进一步交互以确定现有值,这意味着重写整个实体可能会更快。 |