<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5744字,需瀏覽 12分鐘

           ·

          2022-03-17 01:13


          源?/?? ? ? ??文/?



          之前在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


          一鍵三連「分享」、「點贊」和「在看」



          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰免费网站 | 狼人永久地址在线观看高清无码 | 国产 丝袜 人妻 制服 一区 | 大香蕉在线观看一区免费 | 囯产精品久久久久久久久久久久久久 |