重磅發(fā)布:Redis 對(duì)象映射框架來了,操作大大簡(jiǎn)化!
1
前言
最近,Redis 官方博客宣布推出四個(gè)用于 Redis 的客戶端工具庫(kù):Redis OM(對(duì)象映射庫(kù),Object Mapping),目標(biāo)是讓應(yīng)用程序盡可能地容易使用 Redis 和 Redis 模塊。
四個(gè)客戶端工具庫(kù)分別對(duì)應(yīng)四種編程語言
Redis OM for .NET:.Net 平臺(tái)的 Redis OM,依賴 StackExchange.Redis 實(shí)現(xiàn)。借助 Redis OM .NET 可以實(shí)現(xiàn)對(duì)象操作的方式操作 Redis 數(shù)據(jù),脫離 key/value 的操作方式。查詢支持大部分.Neter 最愛的 LINQ。
Redis OM for Node.js:為 TypeScript 和 JavaScript 提供一級(jí)支持
Redis OM for Python:原生集成流行的 FastAPI 框架,將 FastAPI 與 Redis 結(jié)合可構(gòu)建高性能 Web 服務(wù)。Redis OM Python 庫(kù)還支持同步和異步使用
Redis OM for Spring:原生集成 Spring,擴(kuò)展了 Spring Data Redis(提供熟悉的界面),添加了對(duì) RedisBloo 的部分支持。
換言之,在之后的開發(fā)中,開發(fā)者可以通過 Redis OM 庫(kù)直觀地將域?qū)ο?(domain objects) 保存在 Redis,然后使用流暢的、以語言為中心的 API 進(jìn)行查詢。
?
2
Redis OM for Spring
作為一枚java開發(fā),我們重點(diǎn)了解一下 Redis OM for Spring。
3
簡(jiǎn)介
?
Redis OM for Spring提供了強(qiáng)大的存儲(chǔ)庫(kù)和基于強(qiáng)大的 Spring Data Redis (SDR) 框架構(gòu)建的自定義對(duì)象映射抽象。
@Document 將 Spring Data 模型映射到 Redis JSON 文檔的注釋
@RedisHash通過以下方式增強(qiáng) SDR @EnableRedisEnhancedRepositories:
使用 Redis 的原生搜索引擎 (RediSearch) 進(jìn)行二級(jí)索引
將ULID用于帶@Id注釋的字段
RedisDocumentRepository 自動(dòng)實(shí)現(xiàn)存儲(chǔ)庫(kù)接口以實(shí)現(xiàn)復(fù)雜的查詢功能,使用 @EnableRedisDocumentRepositories
聲明性搜索索引通過 @Indexable
全文檢索索引通過 @Searchable
@Bloom 注釋可以非??焖俚卮_定一個(gè)值是否在集合中。
4
實(shí)踐
我們通過案例來了解一下Redis OM for Spring的具體用法
相關(guān)依賴
目前快照地址
<repositories>
??<repository>
????<id>snapshots-repoid>
????<url>https://s01.oss.sonatype.org/content/repositories/snapshots/url>
??repository>
repositories>pom文件
?? com.redis.om
?? redis-om-spring
?? ${version}version>
SpringBoot配置
@SpringBootApplication
@Configuration
@EnableRedisDocumentRepositories(basePackages = "com.redis.om.documents.*")
public?class?RomsDocumentsApplication?{
??@Autowired
??CompanyRepository companyRepo;
??@Bean
??CommandLineRunner loadTestData()?{
????return?args -> {
??????companyRepo.deleteAll();
??????// 創(chuàng)建兩組實(shí)體域 redis & microsoft
??????Company redis = Company.of(
????????"Redis", "https://redis.com", new?Point(-122.066540, 37.377690), 526, 2011?
??????);
??????redis.setTags(Set.of("fast", "scalable", "reliable"));
??????Company microsoft = Company.of(
????????"Microsoft", "https://microsoft.com", new?Point(-122.124500, 47.640160), 182268, 1975?
??????);
??????microsoft.setTags(Set.of("innovative", "reliable"));
??????// 將創(chuàng)建的兩組實(shí)體域持久化
??????companyRepo.save(redis);
??????companyRepo.save(microsoft);
????};
??}
??public?static?void?main(String[] args)?{
????SpringApplication.run(RomsDocumentsApplication.class, args);
??}
}整體使用上非常清晰,重點(diǎn)是類上開啟@EnableRedisDocumentRepositories注解,就可以注入可用于 CRUD 操作和自定義查詢的@Document存儲(chǔ)庫(kù) bean。
實(shí)體對(duì)象映射
這個(gè)我們使用SpringBoot非常熟悉,Redis OM Spring 也提供@Document注釋來為我們將模型保存為 JSON 文檔
@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Document
public class Company {
??@Id?private String id;
??@Searchable?private String name;
??@Indexed?private Point location;
??@Indexed?private Set tags = new HashSet();
??@Indexed?private Integer numberOfEmployees;
??@Indexed?private Integer yearFounded;
??private?String?url;
??private?boolean?publiclyListed;
??// ...
} 添加@Document注釋即可,定義格式省去了自己做轉(zhuǎn)換,Redis OM 庫(kù)直觀地將域?qū)ο?(domain objects) 保存在 Redis上。
接口使用
可以使用流暢的、以語言為中心的 API 進(jìn)行查詢,更符合我們平常的編寫習(xí)慣,看一組官方給的實(shí)現(xiàn)案例:
public?interface?CompanyRepository?extends?RedisDocumentRepository<Company, String> {
??// find one by property
??Optional findOneByName(String name) ;
??// geospatial query
??Iterable findByLocationNear(Point point, Distance distance) ;
??// find by tag field, using JRediSearch "native" annotation
??@Query("@tags:{$tags}")
??Iterable findByTags(@Param("tags")?Set tags) ;
??// find by numeric property
??Iterable findByNumberOfEmployees(int?noe) ;
??// find by numeric property range
??Iterable findByNumberOfEmployeesBetween(int?noeGT, int?noeLT) ;
??// starting with/ending with
??Iterable findByNameStartingWith(String prefix) ;
}?
5
總結(jié)
?
整體上,Redis OM Spring為我們節(jié)省了很多項(xiàng)目中整合Redis的步驟,可以更好的面向?qū)ο缶幊?,省去不少?shù)據(jù)格式的轉(zhuǎn)換,同時(shí)也提供了我們更熟悉的API接口,大大的贊,不過這輪操作下來,Redis更像一個(gè)數(shù)據(jù)庫(kù)了。
注意:Redis OM Spring 目前僅適用于 Jedis,同時(shí) Redis OM 的一些高級(jí)特性依賴于兩個(gè)可用 Redis 模塊的核心特性:RediSearch和RedisJSON。
你對(duì)這個(gè)Redis 對(duì)象映射庫(kù)期待嗎?
GitHub地址:https://github.com/redis/redis-om-spring
往期推薦
