springboot使用RedisRepository操作数据的实现

 更新时间:2022年05月30日 09:06:25   作者:字母哥哥  
本文主要介绍了springboot使用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操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Ribbon负载均衡原理

    SpringCloud Ribbon负载均衡原理

    这篇文章主要介绍了SpringCloud Ribbon负载均衡原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下
    2022-09-09
  • 带你了解Java数据结构和算法之链表

    带你了解Java数据结构和算法之链表

    这篇文章主要为大家介绍了Java数据结构和算法之链表 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目

    IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目

    这篇文章主要介绍了IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java中初始化List集合的八种方式汇总

    Java中初始化List集合的八种方式汇总

    List 是 Java 开发中经常会使用的集合,下面这篇文章主要给大家介绍了关于Java中初始化List集合的八种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 详解微信小程序 同步异步解决办法

    详解微信小程序 同步异步解决办法

    这篇文章主要介绍了详解微信小程序 同步异步解决办法的相关资料,需要的朋友可以参考下
    2017-06-06
  • springboot项目之相互依赖报错问题(基于idea)

    springboot项目之相互依赖报错问题(基于idea)

    这篇文章主要介绍了springboot项目之相互依赖报错问题(基于idea),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用注解解决ShardingJdbc不支持复杂SQL方法

    使用注解解决ShardingJdbc不支持复杂SQL方法

    这篇文章主要为大家介绍了使用注解解决ShardingJdbc不支持复杂SQL方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java多线程模拟电影售票过程

    Java多线程模拟电影售票过程

    这篇文章主要为大家详细介绍了Java多线程模拟电影售票过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Java关于JDK1.8新特性的Stream流

    Java关于JDK1.8新特性的Stream流

    这篇文章主要介绍了版本薇JDK1.8 的Java中的Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作,感兴趣的朋友可以参考下面文章内容
    2021-09-09
  • 基于Java Socket实现一个简易在线聊天功能(一)

    基于Java Socket实现一个简易在线聊天功能(一)

    这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧
    2016-05-05

最新评论