Redis官方ORM框架比RedisTemplate更优雅

目录
  • RedisOM简介
  • JDK 11安装
  • 使用
  • 总结

RedisOM简介

之前在SpringBoot项目中,我一直使用RedisTemplate来操作Redis中的数据,这也是Spring官方支持的方式。对比Spring Data对MongoDB和ES的支持,这种使用Template的方式确实不够优雅!最近发现Redis官方新推出了Redis的专属ORM框架RedisOM,用起来够优雅,推荐给大家!

SpringBoot实战电商项目mall(50k+star)地址:github.com/macrozheng/…

RedisOM是Redis官方推出的ORM框架,是对Spring Data Redis的扩展。由于Redis目前已经支持原生JSON对象的存储,之前使用RedisTemplate直接用字符串来存储JOSN对象的方式明显不够优雅。通过RedisOM我们不仅能够以对象的形式来操作Redis中的数据,而且可以实现搜索功能!

JDK 11安装

由于目前RedisOM仅支持JDK 11以上版本,我们在使用前得先安装好它。

  • 首先下载JDK 11,下载地址:https://www.jb51.net/softs/638448.html
  • 下载压缩包版本即可,下载完成后解压到指定目录;

  • 然后在IDEA的项目配置中,将对应模块的JDK依赖版本设置为JDK 11即可。

使用

接下来我们以管理存储在Redis中的商品信息为例,实现商品搜索功能。注意安装Redis的完全体版本RedisMod,具体可以参考RediSearch 使用教程 。

  • 首先在pom.xml中添加RedisOM相关依赖;
<!--Redis OM 相关依赖-->
<dependency>
    <groupId>com.redis.om</groupId>
    <artifactId>redis-om-spring</artifactId>
    <version>0.3.0-SNAPSHOT</version>
</dependency>
  • 由于RedisOM目前只有快照版本,还需添加快照仓库;
<repositories>
    <repository>
        <id>snapshots-repo</id>
        <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数据库索引(默认为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);
    }

}
  • 然后创建商品的文档对象,使用@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这样的键来存储数据;
    • @Indexed:声明索引,通常用在非文本类型上;
    • @Searchable:声明可以搜索的索引,通常用在文本类型上。
  • 接下来创建一个文档仓库接口,继承RedisDocumentRepository接口;
/**
 * 商品管理Repository
 * Created by macro on 2022/3/1.
 */
public interface ProductRepository extends RedisDocumentRepository&lt;Product, Long&gt; {
}
  • 创建测试用的Controller,通过Repository实现对Redis中数据的创建、删除、查询及分页功能;
/**
 * 使用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&lt;Product&gt; productList = LocalJsonUtil.getListFromJson("json/products.json", Product.class);
        for (Product product : productList) {
            productRepository.save(product);
        }
        return CommonResult.success(null);
    }

    @ApiOperation("创建商品")
    @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&lt;Product&gt; detail(@PathVariable Long id) {
        Optional&lt;Product&gt; result = productRepository.findById(id);
        return CommonResult.success(result.orElse(null));
    }

    @ApiOperation("分页查询")
    @GetMapping("/page")
    public CommonResult&lt;List&lt;Product&gt;&gt; page(@RequestParam(defaultValue = "1") Integer pageNum,
                                            @RequestParam(defaultValue = "5") Integer pageSize) {
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
        Page&lt;Product&gt; pageResult = productRepository.findAll(pageable);
        return CommonResult.success(pageResult.getContent());
    }

}
  • 当我们启动项目时,可以发现RedisOM会自动为文档建立索引;

  • 接下来我们访问Swagger进行测试,先使用导入商品接口导入数据,访问地址:http://localhost:8088/swagger-ui/

  • 导入成功后我们可以发现RedisOM已经向Redis中插入了原生JSON数据,以全类名:ID的形式命名了键,同时将全部的ID存储到了一个SET集合中去了;

  • 我们可以通过ID来查询商品信息;

  • 当然RedisOM也是支持衍生查询的,通过我们创建的方法名称就可以自动实现查询逻辑,比如根据品牌名称查询商品,根据名称和副标题关键字来搜索商品;
/**
 * 商品管理Repository
 * Created by macro on 2022/3/1.
 */
public interface ProductRepository extends RedisDocumentRepository&lt;Product, Long&gt; {
    /**
     * 根据品牌名称查询
     */
    List&lt;Product&gt; findByBrandName(String brandName);

    /**
     * 根据名称或副标题搜索
     */
    List&lt;Product&gt; 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("根据品牌查询")
    @GetMapping("/getByBrandName")
    public CommonResult&lt;List&lt;Product&gt;&gt; getByBrandName(String brandName) {
        List&lt;Product&gt; resultList = productRepository.findByBrandName(brandName);
        return CommonResult.success(resultList);
    }

    @ApiOperation("根据名称或副标题搜索")
    @GetMapping("/search")
    public CommonResult&lt;List&lt;Product&gt;&gt; search(String keyword) {
        List&lt;Product&gt; resultList = productRepository.findByNameOrSubTitle(keyword, keyword);
        return CommonResult.success(resultList);
    }

}
  • 我们可以通过品牌名称来查询商品;

  • 也可以通过关键字来搜索商品;

  • 这类根据方法名称自动实现查询逻辑的衍生查询有什么规则呢,具体可以参考下表。

总结

今天体验了一把RedisOM,用起来确实够优雅,和使用Spring Data来操作MongoDB和ES的方式差不多。不过目前RedisOM只发布了快照版本,期待Release版本的发布,而且Release版本据说会支持JDK 8的!

如果你想了解更多Redis实战技巧的话,可以试试这个带全套教程的实战项目(50K+Star):github.com/macrozheng/…

参考资料

项目源码地址github.com/macrozheng/…

以上就是Redis官方ORM框架比RedisTemplate更优雅的详细内容,更多关于Redis官方ORM框架的资料请关注我们其它相关文章!

(0)

相关推荐

  • java若依框架集成redis缓存详解

    目录 1.添加依赖 2.修改配置 3.增加配置 4.增加工具类 总结 1.添加依赖 ruoyi-common\pom.xml模块添加整合依赖 <!-- springboot整合redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dep

  • Redis Java Lettuce驱动框架原理解析

    Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API,5.1版本的新特性如下: 支持Redis的新增命令ZPOPMIN, ZPOPMAX, BZPOPMIN, BZPOPMAX. 支持通过Brave模块跟踪Redis命令执行. 支持Redis Streams. 支持异步的主从连接. 支持异步

  • Redis框架Jedis及Redisson对比解析

    1概述 1.1. 主要内容 本文的主要内容为对比Redis的两个框架:Jedis与Redisson,分析各自的优势与缺点,为项目中Java缓存方案中的Redis编程模型的选择提供参考. 2. Jedis与Redisson对比 2.1. 概况对比 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持:Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序.事务.管道.分区等Redis特性.Redis

  • 从零搭建SpringBoot2.X整合Redis框架的详细教程

    最近也不知道写啥,看之前写过Kafka整合Springboot的文章,大家反响还挺热烈的,嘿嘿嘿,就感觉帮助到大家了还挺好的,也算是达到了自己的目的,正好,今天业务模块是springboot整合redis,因为之前做过,所以有现成的代码,cv一下之后就可以了,所以时间比较多,那就给大家整理一下Springboot整合Redis的代码实现吧,从项目搭建到源码实现,下面全都有,耐心看完,相信会对你有所帮助的 好了,话不多说,我们开始吧,同样的,还是建议能够自己在自己的PC端实现一下 个人公众号:Ja

  • Redis官方ORM框架比RedisTemplate更优雅

    目录 RedisOM简介 JDK 11安装 使用 总结 RedisOM简介 之前在SpringBoot项目中,我一直使用RedisTemplate来操作Redis中的数据,这也是Spring官方支持的方式.对比Spring Data对MongoDB和ES的支持,这种使用Template的方式确实不够优雅!最近发现Redis官方新推出了Redis的专属ORM框架RedisOM,用起来够优雅,推荐给大家! SpringBoot实战电商项目mall(50k+star)地址:github.com/mac

  • SpringBoot构建ORM框架的方法步骤

    目录 1.增加依赖 2.数据库实体模型 3.增加Mapper 4.@Mapper或者@MapperScan 5.配置连接 目前常用的ORM框架有 Mybatis(batis).MybatisPlus,Hibernate.Jpa等几个框架,今天就简单介绍一下搭建Mybatisplus框架的流程. 1.增加依赖 <dependencies>         <!--        第一步:选择ORM框架,使用springboot整合mybatis-plus依赖包-->        

  • 基于Java ORM框架的使用详解

    ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系.我们在这里主要关注Java中常用的两个ORM框架:Hibernate和iBatis.下面来介绍这两个框架简单的使用方法,如果将来有时间,我会深入的写一些更有意思的相关文章.HibernateHibernate是一个持久化框架和ORM框架,持久化和ORM是两个有区别的概念,持久化注重对象的存储方法是否随着程序的退出而消亡,ORM关注的是如何在数据库表和内存

  • 如何利用Promises编写更优雅的JavaScript代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. Promises 易于阅读 比如说我们想从 HipsterJesus 的API中抓取一些数据并将这些数据添加到我们的页面中.这些 API 的响应数据形式如下: { "text": "<p>Lorem ipsum...<

  • Python轻量级ORM框架Peewee访问sqlite数据库的方法详解

    本文实例讲述了Python轻量级ORM框架Peewee访问sqlite数据库的方法.分享给大家供大家参考,具体如下: ORM框架就是 object relation model,对象关系模型,用来实现把数据库中的表 映射到 面向对象编程语言中的类,不需要写sql,通过操作对象就能实现 增删改查. ORM的基本技术有3种: (1)映射技术 数据类型映射:就是把数据库中的数据类型,映射到编程语言中的数据类型.比如,把数据库的int类型映射到Python中的integer 类型. 类映射:把数据库中的

  • 简单了解java ORM框架JOOQ

    这篇文章主要介绍了简单了解java ORM框架JOOQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 今天给大家介绍一个新的ORM框架->JOOQ,可能很多朋友还没有听说过这个框架,码农哥之前也是一直在使用Mybatis框架作为Java工程中的持久层访问框架,但是最近的一些项目采用JOOQ框架开发后,码农哥表示再也不想用Mybatis了! 为什么这么说呢?因为JOOQ在代码层面要比Mybatis简洁得多,而且性能也非常优异.相信大家都有过

  • Hibernate 与 Mybatis 的共存问题,打破你的认知!(两个ORM框架)

    很长一段时间,网上有很多关于Hibernate与Mybatis孰优孰劣的争论,两个阵营的人谁也不能说服谁,每个人的理由都很有道理. 今天,我分享的主题是:在一个项目中同时使用Hibernate和Mybatis两个ORM框架. 作为一个开发者,没有必要花费过多的时间去证明技术无用论,当你开始指责某个框架垃圾,另外一个框架最好时,隐性的暴露出你对某个框架没有深入的研究,无知的指责对于技术的提升没有任何的帮助. 框架本身没有对错一说,只有适合和更适合项目的选择.任何框架都有自身的能力范围,就拿Hibe

  • Laravel 重写日志,让日志更优雅

    更改目的: 重写了日志格式 加入trace,一次请求的唯一标识 加入error级别信息推送,事例中使用企业微信群助手 让我们可以更及时.更优雅.更方便追踪日志信息 有助于初学者了解Laravel框架 1.将文件 AppTool.php.Logger.php.LogServiceProvider.php复制到 app/Providers文件夹下,将文件BaseCommand.php复制到App\Console下 2 .在config/app.php→providers中加入 'providers'

  • python轻量级orm框架 peewee常用功能速查详情

    目录 一.常见orm数据库框架 1.peewee 简单demo 二.Model 和 Field 关系 三.Model 模型 四.Filed 字段 1.字段初始化参数 2.字段特有参数 3.字段默认参数 4.索引 五.基本操作 增删改查 1.创建 2.删除 3.更新 4.查询 5.事务 6.过滤 7.记录分类 8.计数 9.分页 六.聚合查询 七.Scalar 八.窗口 九.复杂筛选 1.查询中支持的筛选运算符 2.筛选方法 3.联合查询逻辑操作 十.SQL 方法 1.SQL helper 2.安

  • 使用C++的ORM框架QxORM详解

    QxORM中,我们用的最多的无非是这两点 官方表述是这样的: 持久性:支持最常见的数据库,如SQLite.MySQL.PostgreSQL.Oracle.MS SQL Server.MongoDB(具有 1-1.1-n.n-1 和 n-n 关系):序列化:JSON.二进制和 XML 格式: 简洁一点就是: 连接访问各类主流数据库 能够将数据导入导出 下面我们进入主题: 第一步:建立对象模型.相对于常规的结构体,只是多了一些宏定义与声明. 头文件:QxModels.h #include "prec

随机推荐