還在用 RedisTemplate?試試 Redis 官方 ORM 框架吧,用起來夠優(yōu)雅!

源?/?? ? ? ??文/?
之前在SpringBoot項目中,我一直使用RedisTemplate來操作Redis中的數(shù)據(jù),這也是Spring官方支持的方式。對比Spring Data對MongoDB和ES的支持,這種使用Template的方式確實不夠優(yōu)雅!最近發(fā)現(xiàn)Redis官方新推出了Redis的專屬ORM框架
RedisOM,用起來夠優(yōu)雅,推薦給大家!
RedisOM簡介
RedisOM是Redis官方推出的ORM框架,是對Spring Data Redis的擴展。由于Redis目前已經(jīng)支持原生JSON對象的存儲,之前使用RedisTemplate直接用字符串來存儲JOSN對象的方式明顯不夠優(yōu)雅。通過RedisOM我們不僅能夠以對象的形式來操作Redis中的數(shù)據(jù),而且可以實現(xiàn)搜索功能!
JDK 11安裝
由于目前RedisOM僅支持
JDK 11以上版本,我們在使用前得先安裝好它。
首先下載 JDK 11,這里推薦去清華大學開源軟件鏡像站下載,下載地址:https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/

下載壓縮包版本即可,下載完成后解壓到指定目錄;

然后在IDEA的項目配置中,將對應模塊的JDK依賴版本設置為 JDK 11即可。

使用
接下來我們以管理存儲在Redis中的商品信息為例,實現(xiàn)商品搜索功能。注意安裝Redis的完全體版本
RedisMod,具體可以參考RediSearch 使用教程?。
首先在 pom.xml中添加RedisOM相關(guān)依賴;
<dependency>
????<groupId>com.redis.omgroupId>
????<artifactId>redis-om-springartifactId>
????<version>0.3.0-SNAPSHOTversion>
dependency>
由于RedisOM目前只有快照版本,還需添加快照倉庫;
<repositories>
????<repository>
????????<id>snapshots-repoid>
????????<url>https://s01.oss.sonatype.org/content/repositories/snapshots/url>
????repository>
repositories>
然后在配置文件 application.yml中添加Redis連接配置;
spring:
??redis:
????host:?192.168.3.105?#?Redis服務器地址
????database:?0?#?Redis數(shù)據(jù)庫索引(默認為0)
????port:?6379?#?Redis服務器連接端口
????password:?#?Redis服務器連接密碼(默認為空)
????timeout:?3000ms?#?連接超時時間
之后在啟動類上添加 @EnableRedisDocumentRepositories注解啟用RedisOM的文檔倉庫功能,并配置好文檔倉庫所在路徑;
@SpringBootApplication
@EnableRedisDocumentRepositories(basePackages?=?"com.macro.mall.tiny.*")
public?class?MallTinyApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(MallTinyApplication.class,?args);
????}
}
然后創(chuàng)建商品的文檔對象,使用 @Document注解標識其為文檔對象,由于我們的搜索信息中包含中文,我們需要設置語言為chinese;
/**
?*?商品實體類
?*?Created?by?macro?on?2021/10/12.
?*/
@Data
@EqualsAndHashCode(callSuper?=?false)
@Document(language?=?"chinese")
public?class?Product?{
????@Id
????private?Long?id;
????@Indexed
????private?String?productSn;
????@Searchable
????private?String?name;
????@Searchable
????private?String?subTitle;
????@Indexed
????private?String?brandName;
????@Indexed
????private?Integer?price;
????@Indexed
????private?Integer?count;
}
分別介紹下代碼中幾個注解的作用;
@Id:聲明主鍵,RedisOM將會通過全類名:ID這樣的鍵來存儲數(shù)據(jù);@Indexed:聲明索引,通常用在非文本類型上;@Searchable:聲明可以搜索的索引,通常用在文本類型上。接下來創(chuàng)建一個文檔倉庫接口,繼承
RedisDocumentRepository接口;
/**
?*?商品管理Repository
?*?Created?by?macro?on?2022/3/1.
?*/
public?interface?ProductRepository?extends?RedisDocumentRepository<Product,?Long>?{
}
創(chuàng)建測試用的Controller,通過 Repository實現(xiàn)對Redis中數(shù)據(jù)的創(chuàng)建、刪除、查詢及分頁功能;
/**
?*?使用Redis?OM管理商品
?*?Created?by?macro?on?2022/3/1.
?*/
@RestController
@Api(tags?=?"ProductController",?description?=?"使用Redis?OM管理商品")
@RequestMapping("/product")
public?class?ProductController?{
????@Autowired
????private?ProductRepository?productRepository;
????@ApiOperation("導入商品")
????@PostMapping("/import")
????public?CommonResult?importList()?{
????????productRepository.deleteAll();
????????List?productList?=?LocalJsonUtil.getListFromJson("json/products.json",?Product.class);
????????for?(Product?product?:?productList)?{
????????????productRepository.save(product);
????????}
????????return?CommonResult.success(null);
????}
????@ApiOperation("創(chuàng)建商品")
????@PostMapping("/create")
????public?CommonResult?create(@RequestBody?Product?entity)?{
????????productRepository.save(entity);
????????return?CommonResult.success(null);
????}
????@ApiOperation("刪除")
????@PostMapping("/delete/{id}")
????public?CommonResult?delete(@PathVariable?Long?id)?{
????????productRepository.deleteById(id);
????????return?CommonResult.success(null);
????}
????@ApiOperation("查詢單個")
????@GetMapping("/detail/{id}")
????public?CommonResult?detail(@PathVariable?Long?id)? {
????????Optional?result?=?productRepository.findById(id);
????????return?CommonResult.success(result.orElse(null));
????}
????@ApiOperation("分頁查詢")
????@GetMapping("/page")
????public?CommonResult>?page(@RequestParam(defaultValue?=?"1")?Integer?pageNum,
????????????????????????????????????????????@RequestParam(defaultValue?=?"5")?Integer?pageSize)?{
????????Pageable?pageable?=?PageRequest.of(pageNum?-?1,?pageSize);
????????Page?pageResult?=?productRepository.findAll(pageable);
????????return?CommonResult.success(pageResult.getContent());
????}
}
當我們啟動項目時,可以發(fā)現(xiàn)RedisOM會自動為文檔建立索引;

接下來我們訪問Swagger進行測試,先使用 導入商品接口導入數(shù)據(jù),訪問地址:http://localhost:8088/swagger-ui/

導入成功后我們可以發(fā)現(xiàn)RedisOM已經(jīng)向Redis中插入了原生JSON數(shù)據(jù),以 全類名:ID的形式命名了鍵,同時將全部的ID存儲到了一個SET集合中去了;

我們可以通過ID來查詢商品信息;

當然RedisOM也是支持衍生查詢的,通過我們創(chuàng)建的方法名稱就可以自動實現(xiàn)查詢邏輯,比如根據(jù)品牌名稱查詢商品,根據(jù)名稱和副標題關(guān)鍵字來搜索商品;
/**
?*?商品管理Repository
?*?Created?by?macro?on?2022/3/1.
?*/
public?interface?ProductRepository?extends?RedisDocumentRepository<Product,?Long>?{
????/**
?????*?根據(jù)品牌名稱查詢
?????*/
????List?findByBrandName(String?brandName) ;
????/**
?????*?根據(jù)名稱或副標題搜索
?????*/
????List?findByNameOrSubTitle(String?name,?String?subTitle) ;
}
在Controller中可以添加如下接口進行測試;
/**
?*?使用Redis?OM管理商品
?*?Created?by?macro?on?2022/3/1.
?*/
@RestController
@Api(tags?=?"ProductController",?description?=?"使用Redis?OM管理商品")
@RequestMapping("/product")
public?class?ProductController?{
????@Autowired
????private?ProductRepository?productRepository;
????@ApiOperation("根據(jù)品牌查詢")
????@GetMapping("/getByBrandName")
????public?CommonResult>?getByBrandName(String?brandName)?{
????????List?resultList?=?productRepository.findByBrandName(brandName);
????????return?CommonResult.success(resultList);
????}
????@ApiOperation("根據(jù)名稱或副標題搜索")
????@GetMapping("/search")
????public?CommonResult>?search(String?keyword)?{
????????List?resultList?=?productRepository.findByNameOrSubTitle(keyword,?keyword);
????????return?CommonResult.success(resultList);
????}
}
我們可以通過品牌名稱來查詢商品;

也可以通過關(guān)鍵字來搜索商品;

這類根據(jù)方法名稱自動實現(xiàn)查詢邏輯的衍生查詢有什么規(guī)則呢,具體可以參考下表。

總結(jié)
今天體驗了一把RedisOM,用起來確實夠優(yōu)雅,和使用Spring Data來操作MongoDB和ES的方式差不多。不過目前RedisOM只發(fā)布了快照版本,期待Release版本的發(fā)布,而且Release版本據(jù)說會支持JDK 8的!
參考資料
項目地址:https://github.com/redis/redis-om-spring 官方文檔:https://developer.redis.com/develop/java/spring/redis-om/redis-om-spring-json
項目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-redis-om
end

頂級程序員:topcoding
做最好的程序員社區(qū):Java后端開發(fā)、Python、大數(shù)據(jù)、AI
一鍵三連「分享」、「點贊」和「在看」
