叮咚,Redis OM对象映射框架来了!
一、Redis OM来了
11月23日,redis宣布了四个新的Redis高级客户端的预览版,将这些库称为Redis OM(Redis Object Mapping)-----对象映射。
其框架以强大的 Spring Data Redis (SDR) 框架为基础,提供一个高级抽象工具箱,通过我们熟悉的面向对象的编程来表示。
其目的是专注于对象映射和流畅查询,即尽可能轻松的使用 Redis 。它可以透明地将域对象保存在 Redis 中,并且能使用流畅的、以语言为中心的 API 查询它们。
Redis OM 的一些高级功能依赖于来自两个可用 Redis 模块的核心功能:RediSearch和RedisJSON。
如下,推出了对 .NET、Node.js、Python 和 Java (Spring) 语言的支持
- Redis OM for .NET
- Redis OM for Node.js
- Redis OM for Python
- Redis OM for Spring
二、了解
以下是Redis OM for Spring为例通过查看源码提供的demo:rds-documents模块模拟来更近一步的了解Redis OM
官方包下载:redis-om-spring-main
开发环境:JDK11
springboot版本:2.6.0-M1
注:Redis OM的抽象构建在spring-data-redis (SDR)之上
代码解析
1、对象映射
通过注解@Document
将 Spring Data 对象映射到 Redis JSON@Indexable
声明式搜索@Searchable
全文检索索引@RequiredArgsConstructor(staticName = "of")
表示通过方法of()来构建对象@NonNull
不能为空
补充:@Bloom
以非常快的速度确定一个值是否在集合中
/**
* 地点
*/
@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Document
public class Address {
@Id
private String id;
@NonNull
@Searchable
private String addressName;
@Indexed
private Set<String> addressTags = new HashSet<String>();
@NonNull
private String picUrl;
@NonNull
@Indexed
private Point location;
@NonNull
@Indexed
private Integer yearRegister;
private boolean publiclyListed;
}
2、对象的持久化
通过拓展接口RedisDocumentRepository来进行CRUD操作,类似JPA方式的自定义查询。
其通过继承spring data里的接口:PagingAndSortingRepository
/**
* 通过继承RedisDocumentRepository来进行CRUD操作以及类似JPA方式的自定义查询
*/
public interface AddressRepository extends RedisDocumentRepository<Address, String> {
// find one by property 通过addressName查询
Optional<Address> findOneByAddressName(String name);
// find by tag field, using JRediSearch "native" annotation
@Query("@tags:{$tags}")
Iterable<Address> findByTags(@Param("tags") Set<String> tags);
}
查询定义
- 通过直接从方法名称派生查询。
- 通过使用@Query或@Aggregation注释使用手动定义的查询。
3、与spring的集成及使用
通过注解@EnableRedisDocumentRepositories
扫描指定包下带有@Document
注释的对象,注入RedisDocumentRepository,可用CRUD操作自定义查询@Document
注释的Bean
/**
* 启动入口
*/
@SpringBootApplication
@Configuration
@com.redis.om.spring.annotations.EnableRedisDocumentRepositories(basePackages = "com.redis.documents.*")
public class RdsDocumentsApplication {
public static void main(String[] args) {
SpringApplication.run(RdsDocumentsApplication.class, args);
}
...
}
4、保存数据
@Autowired
private AddressRepository addressRepository;
@Bean
CommandLineRunner loadTestData() {
return args -> {
//删除数据
addressRepository.deleteAll();
//save保存数据
addressRepository.save(Address.of("广州市唯品会地址", "https://www.vip.com/?wq=1", new Point(113.124500, 23.640160), 2000));
addressRepository.save(Address.of("广州市百度地址", "https://www.baidu.com/", new Point(113.235614, 23.342545), 2020));
};
}
5、接口调用
@RestController
@RequestMapping("/api/address")
public class AddressController {
@Autowired
private AddressRepository addressRepository;
@GetMapping("name/{name}")
Optional<Address> byAddressName(@PathVariable("name") String name) {
return addressRepository.findOneByAddressName(name);//方法名称派生查询
}
@GetMapping("tags")
Iterable<Address> byTags(@RequestParam("tags") Set<String> tags) {
return addressRepository.findByTags(tags);//方法名称派生查询
}
@GetMapping("all")
Page<Address> all(Pageable pageable) {
return addressRepository.findAll(pageable);//spring data自带
}
@GetMapping("{id}")
Optional<Address> byId(@PathVariable("id") String id) {
return addressRepository.findById(id);//spring data自带
}
}
6、Maven依赖
<dependency>
<groupId>com.redis.om.spring</groupId>
<artifactId>redis-om-spring</artifactId>
<version>${version}</version>
</dependency>
参考文档
官方介绍:https://redis.com/blog/introducing-redis-om-client-libraries/
git源码:https://github.com/redis/redis-om-spring
总结
Redis OM发布预览版后,引来各程序员们广泛的关注,大家称其为Redis界的Hibernate
有人说,Springboot Redis已经很简洁,此对象映射也是相当于一个Map,新开发一个框架,也是多此一举。
也有人说,能让redis的使用更加简易,更加的符合语言的规范,正所谓语言的优美,其重要的一部分在于它的规范性,是一个很好的进步。
官方解释,
目前redis客户端确实已经支持 Redis各种各样的工具,包括缓存、分布式锁、消息队列等
而此新框架的生成在于并非每个人都有时间自己重新封装这些工具。不是每个人都有时间来将 Redis 哈希映射到 Java 类(反之亦然)。通过构建Redis OM,这样即使大家没有时间使用 Redis 提供的核心数据结构编写自己的抽象,也可以获得 Redis 的性能。
我的想法是,每个框架的生成,都是一个思想的汇总表示,可以给我们的开发提供更多的技术选择。
而技术的进步,也正是因为这些可爱的程序员们在不断拓展和精益求精。
让我们一起期待正式版的发布,期待它更完整的功能!
作者:yana