springboot使用RedisRepository操作数据的实现

目录
  • 一、一个属性、一个属性的存取
  • 二、使用Jackson2HashMapper存取对象
  • 三、使用RedisRepository的对象操作

通过集成spring-boot-starter-data-redis之后一共有三种redis hash数据操作方式可以供我们选择

  • 一个属性、一个属性的存取
  • 使用Jackson2HashMapper存取对象
  • 使用RedisRepository的对象操作(本节核心内容)

一、一个属性、一个属性的存取

这种方式在本专栏上一文章中的代码,已经得以体现。

@Test
public void HashOperations() {
    Person person = new Person("kobe","byrant");
    person.setAddress(new Address("洛杉矶","美国"));
    //使用hash的方法存储对象数据(一个属性一个属性的存,下节教大家简单的方法)
    hashOperations.put("hash:player","firstname",person.getFirstname());
    hashOperations.put("hash:player","lastname",person.getLastname());
    hashOperations.put("hash:player","address",person.getAddress());

    String firstName = (String)hashOperations.get("hash:player","firstname");
    System.out.println(firstName);
}

数据在redis数据库里面存储结构是下面这样的

  • 一个hash代表一个对象的数据
  • 一个对象有多个属性key、value键值对数据,每一组键值对都可以单独存取

二、使用Jackson2HashMapper存取对象

上一小节我们操作hash对象的时候是一个属性一个属性设置的,那我们有没有办法将对象一次性hash入库呢?我们可以使用jacksonHashOperations和Jackson2HashMapper

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class RedisConfigTest3 {

    @Resource(name="redisTemplate")
    private HashOperations<String, String, Object> jacksonHashOperations;
    //注意这里的false,下文会讲解
    private HashMapper<Object, String, Object> jackson2HashMapper = new Jackson2HashMapper(false);

    @Test
    public void testHashPutAll(){

        Person person = new Person("kobe","bryant");
        person.setId("kobe");
        person.setAddress(new Address("洛杉矶","美国"));

        //将对象以hash的形式放入redis数据库
        Map<String,Object> mappedHash = jackson2HashMapper.toHash(person);
        jacksonHashOperations.putAll("player:" + person.getId(), mappedHash);

        //将对象从数据库取出来
        Map<String,Object> loadedHash = jacksonHashOperations.entries("player:" + person.getId());
        Object map = jackson2HashMapper.fromHash(loadedHash);
        Person getback = new ObjectMapper().convertValue(map,Person.class);

        //Junit5,验证放进去的和取出来的数据一致
        assertEquals(person.getFirstname(),getback.getFirstname());
    }
}

使用这种方式可以一次性的存取java 对象为redis数据库的hash数据类型。需要注意的是:执行上面的测试用例,Person和Address一定要有public无参构造方法,在将map转换成Person或Address对象的时候用到,如果没有的话会报错。

new Jackson2HashMapper(false),注意属性对象Address的存储格式(两张图对比观察)

new Jackson2HashMapper(true),注意属性对象Address的存储格式(两张图对比观察)

需要注意的是:使用这种方法存储hash数据,需要多出一个键值对@class说明该hash数据对应的java类。在反序列化的时候会使用到,用于将hash数据转换成java对象。

三、使用RedisRepository的对象操作

下面为大家介绍使用RedisRepository进行redis数据操作,它不只是能简单的存取数据,还可以做很多的CURD操作。使用起来和我们用JPA进行关系型数据库的单表操作,几乎是一样的。

首先,我们需要在需要操作的java实体类上面加上@RedisHash注解,并使用@Id为该实体类指定id。是不是和JPA挺像的?

@RedisHash("people")   //注意这里的person,下文会说明
public class Person {
  @Id
  String id;

  //其他和上一节代码一样

}

然后写一个PersonRepository ,继承CrudRepository,是不是也和JPA差不多?

//泛型第二个参数是id的数据类型
public interface PersonRepository extends CrudRepository<Person, String> {
 // 继承CrudRepository,获取基本的CRUD操作
}

CrudRepository默认为我们提供了下面的这么多方法,我们直接调用就可以了。

在项目入口方法上加上注解@EnableRedisRepositories(笔者测试,在比较新的版本中这个注解已经不需要添加了,默认支持),然后进行下面的测试

@SpringBootTest
public class RedisRepositoryTest {

    @Resource
    PersonRepository personRepository;

    @Test
    public void test(){

        Person rand = new Person("zimug", "汉神");
        rand.setAddress(new Address("杭州", "中国"));
        personRepository.save(rand);  //存

        Optional<Person> op = personRepository.findById(rand.getId()); //取
        Person p2 = op.get();

        personRepository.count(); //统计Person的数量
        personRepository.delete(rand);  //删除person对象rand
    }
}

测试结果:需要注意的是RedisRepository在存取对象数据的时候,实际上使用了redis的2种数据类型

第一种是Set类型,用于保存每一个存入redis的对象(Person)的id。我们可以利用这个Set实现person对象集合类的操作,比如说:count()统计,统计redis数据库中一共保存了多少个person。注意:下图中set集合的key名称,就是通过上文代码中@RedisHash("people") 指定的。

第二种是Hash类型,是用来保存Java对象的,id是RedisRepository帮我们生成的,这个id和上图中set集合中保存的id是一致的。

到此这篇关于springboot使用RedisRepository操作数据的实现的文章就介绍到这了,更多相关springboot RedisRepository操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot以Repository方式整合Redis的方法

    1 简介 Redis是高性能的NoSQL数据库,经常作为缓存流行于各大互联网架构中.本文将介绍如何在Springboot中整合Spring Data Redis,使用Repository的方式操作. 代码结构如下: 2 整合过程 2.1 安装Redis数据库 为了节省时间,就直接通过Docker来安装了,可以参考文章:Docker安装Redis并介绍漂亮的可视化客户端进行操作,可以快速安装并使用客户端进行查看和操作. 2.2 引入相关依赖 我们引入Springboot Web的依赖,以启动RES

  • springboot使用RedisRepository操作数据的实现

    目录 一.一个属性.一个属性的存取 二.使用Jackson2HashMapper存取对象 三.使用RedisRepository的对象操作 通过集成spring-boot-starter-data-redis之后一共有三种redis hash数据操作方式可以供我们选择 一个属性.一个属性的存取 使用Jackson2HashMapper存取对象 使用RedisRepository的对象操作(本节核心内容) 一.一个属性.一个属性的存取 这种方式在本专栏上一文章中的代码,已经得以体现. @Test

  • SpringBoot全局异常与数据校验的方法

    异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题.本文将结合SpringBoot框架一起和大家探讨下. 要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后能准确的返回给前端解析,那么需要异常发生时返回给前端的格式与正常失败场景的格式一致. 项目建立 利用idea 工具,很容易的搭建一个SpringBoot项目,要引入的mav

  • SpringBoot + Mybatis-plus实战之Mybatis-plus的一级缓存、二级缓存

    前言 现在的JAVA行业,貌似已经是SpringBoot + SpringCloud 的天下了,早期的SSH,SSM框架已经老去,与SpringBoot相结合的JPA框架虽然省去了很多的增删改查sql,但是比较笨拙,在面对一些复杂多变的逻辑时常常力不从心,而相对应的Mybatis由于其高度的灵活性受到广大JAVA攻城狮的欢迎.之前整合过了springboot+mybatis,前几天看到一个面试的问一个问题,Mybatis的一级缓存,二级缓存.我想这个应该也是一个重点吧,所以今天决定来详细解读一下

  • SpringBoot项目开发常用技术整合

    目录 1 创建一个springboot demo 1.1 创建Restful接口 2 接口返回通用JSON对象 2.1 构建通用返回对象JSONResult 2.2 使用Jackson 3 SpringBoot开发环境热部署 4 资源文件属性配置 4.1 资源文件中的属性配置与映射到实体类 4.2 Server和Tomcat配置(详细配置参考Gitee) 5 SpringBoot整合模板引擎 5.1 集成freemarker 5.2 集成thymeleaf 5.2.1 集成i18n属性配置 6

  • SpringBoot集成Redis的思路详解

    目录 SpringBoot集成Redis 1.概述 2.测试Redis 3.自定义redisTemplate SpringBoot集成Redis 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘

  • Java SpringBoot 集成 Redis详解

    目录 1.概述 Redis是什么? Redis能该干什么? 特性 2.测试Redis 3.自定义redisTemplate 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加

  • SpringBoot整合Ehcache3的实现步骤

    目录 前言 缓存配置 maven引用 个性化配置 代码注入配置 缓存操作 缓存预热 更新操作 查询操作 缓存与数据库数据一致性 前言 公司部门老项目要迁移升级java版本,需要进行缓存相关操作,原框架未支持这部分,经过调研java相关缓存方案大致分为ehcache和redis两种,redis的value最大值为500mb且超过1mb会对存取有性能影响,业务系统需要支持列表查询缓存就不可避免的涉及到大量的数据存取过滤,ehcache支持内存+磁盘缓存不用担心缓存容量问题,所以框架初步版本决定集成e

  • SpringBoot实现ORM操作MySQL的几种方法

    目录 1.第一种方式:@Mapper 2.第二种方式@MapperScan 3.第三种方式:Mapper文件和Dao接口分开管理 4.事务 使用mybatis框架操作数据,在springboot框架中集成mybatis 使用步骤: mybatis起步依赖:完成mybatis对象自动配置,对象放在容器中. <dependencies> <!-- web起步依赖--> <dependency> <groupId>org.springframework.boot&

  • SpringBoot整合Spring Data JPA的详细方法

    目录 前言 核心概念 新建SpringBoot项目 创建MySQL数据库 创建实体类 创建Repository 创建处理器 准备SQL文件 编写配置文件 最终效果 启动SpringBoot项目 查看数据库 自动更新数据表结构 测试JPA的增删改查 测试查询所有 测试保存数据 测试更新数据 测试删除数据 前言 Spring Data JPA 是更大的 Spring Data 家族的一部分,可以轻松实现基于 JPA 的存储库.该模块处理对基于 JPA 的数据访问层的增强支持.它使构建使用数据访问技术

  • SpringBoot整合Redis实现消息发布与订阅的示例代码

    当我们在多个集群应用中使用到本地缓存时,在数据库数据得到更新后,为保持各个副本当前被修改的数据与数据库数据保持同步,在数据被操作后向其他集群应用发出被更新数据的通知,使其删除;下次当其他应用请求该被更新的数据时,应用会到数据库去取,也就是最新的数据,从而使得被更新数据与数据库保持同步! 能实现发送与接收信息的中间介有很多,比如:RocketMQ.RabbitMQ.ActiveMQ.Kafka等,本次主要简单介绍Redis的推送与订阅功能并集成Spring Boot的实现. 1.添加SpringB

随机推荐