Redis 之九:Spring Data Redis -- Redis Template 用法

本文介绍了SpringDataRedis如何简化Java应用与Redis的交互,包括自动配置、RedisTemplate的使用、Repository支持、数据绑定、事务管理和Redis的各种数据结构操作,以及解决序列化问题的方法。
摘要由CSDN通过智能技术生成

SpringData Redis

Spring Data Redis 是 Spring Data 项目的一部分,它为 Java 应用程序提供了一种便捷的方式来与 Redis 数据库进行交互。

Spring Data Redis 提供了对 Redis 的抽象封装,使得开发者能够以面向对象的方式操作 Redis,并简化了 Redis 在 Spring 管理的应用中的集成工作。

其主要特性包括:

  1. 自动配置:在使用 Spring Boot 时,通过引入 spring-boot-starter-data-redis 启动器,可以快速实现自动配置和连接到 Redis 服务器。
  2. 模板类:提供了 RedisTemplate 类,这是一个通用的 Redis 操作类,用于执行 Redis 命令以及转换键值对的序列化和反序列化过程。
  3. Repository 支持:类似于 Spring Data JPA,Spring Data Redis 也支持自定义 Repository 接口,通过继承 CrudRepositoryPagingAndSortingRepository 或自定义方法来简化 CRUD 操作。
  4. 数据绑定:可以通过注解或元数据映射将 Java 对象与 Redis 中的数据结构(例如 Hash)关联起来,简化复杂类型的操作。
  5. 事务管理:支持 Redis 事务处理,可以通过编程式或者声明式事务管理来保证数据的一致性。
  6. 发布订阅(Pub/Sub):提供了对 Redis 发布/订阅功能的支持,方便构建消息驱动的系统。
  7. 缓存支持:结合 Spring Cache Abstraction,可以利用 Redis 作为分布式缓存解决方案

Spring Data Redis 提供的两个核心API:RedisTemplate 模板类 和 CrudRepository 持久化接口

下面先来介绍 Spring Data Redis 中的 RedisTemplate 的具体用法

一、配置pom.xml

首先创建springboot项目

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

二、配置 application

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=1      # 0~15 默认0

三、DAO RedisTemplate依赖

@Autowired
private RedisTemplate redisTemplate;
 public void set(Student student){
         //保存基本信息  String  注意:不能使用相同的 name 去redis客户端取值的。
        redisTemplate.opsForValue().set("name",student.getName());
 }

 public void get(String key){
        String name = redisTemplate.opsForValue().get("name").toString();
        System.out.println(name);
 }

四、测试

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private StudentDao studentDao;
    @Test
    void set() {
        Student student = new Student();
        student.setName("AAAAAAAAAAABBBBBBBBBBB");
        studentDao.set(student);
    }

    @Test
    void get(){
        studentDao.get(null);
    }
}

就此,来测试是否连通 redis 。保存和取值 String 进行测试。

五、保存一个对象

1. 实体类,实现序列化接口

@Data
public class Student implements Serializable {
    private String name;
    private int age;
}

2.编写DAO

    public void set(Student student){
        redisTemplate.opsForValue().set("student",student);  //存储对象
    }
  public Student get(String key){
        return (Student) redisTemplate.opsForValue().get(key);
    }

六、list 类型操作

public void pushlist(){
    //获取操作list类型的 工具类
    ListOperations<String,String> listOperations = redisTemplate.opsForList();

    listOperations.leftPush("words","Sky");
    listOperations.leftPush("words","Desk");
    listOperations.leftPush("words","Person");  //添加队头
    listOperations.rightPush("words","Apple");  //追加队尾
}
public void rangeList(){
    ListOperations<String,String> listOperations = redisTemplate.opsForList();
    List<String> list = listOperations.range("words", 0, Integer.MAX_VALUE);
    System.out.println(list);
}

七、set 类型

public void setadd(){
    SetOperations setOperations = redisTemplate.opsForSet();
    setOperations.add("myset","A","B","C");
    setOperations.add("myset","X","Y","C");

}
public void setmembers(){
    SetOperations setOperations = redisTemplate.opsForSet();
    Set myset = setOperations.members("myset");
    System.out.println(myset);
}

八、zset 类型

public void zsetadd(){
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    //第三个为score 排序依据分数 权重
    zSetOperations.add("zset","CCC",5);
    zSetOperations.add("zset","DDD",3);
    zSetOperations.add("zset","AAA",1);
    zSetOperations.add("zset","EEE",2);
    zSetOperations.add("zset","BBB",4);
}
public void zsetget(){
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    Set zset = zSetOperations.range("zset", 0, 100);
    System.out.println(zset);
}

九、hash 类型

public void hashadd(){
    HashOperations hashOperations = redisTemplate.opsForHash();
    hashOperations.put("person","sid","1001");
    hashOperations.put("person","age","23");

    Map<String,String> map = new HashMap<>();
    map.put("name","诸葛亮");
    map.put("email","zhuge@sina.com");
    hashOperations.putAll("person",map);
}

public void hashget(){
    HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();
    Map<String,String> map =  hashOperations.entries("person");
    System.out.println(map);
}

十、序列化乱码问题

使用 RedisTemplate 存取redis的数据时,因为序列化原因,存入的数据看上去乱码,不是原本设置的key。 但是不影响应用程序的存取。但是直接操作redis 查看还是不太方便。下面来解决这个问题

1. 添加 jackson 依赖

因为下面的配置类需要依赖json

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>

2. 编写配置类

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class Config {

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate redisTemplateInit() {
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

再次运行保存

 public void set(Student student){
//        redisTemplate.opsForValue().set("name",student.getName());
        redisTemplate.opsForValue().set("student",student);  //存储对象
    }

在redis 中就可以看到和使用 student 作为 key 来查看数据了。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
spring-data-redis 2.6 是一个用于与 Redis 数据库进行交互的 Java 框架。它提供了一系列的 API 和工具,让开发者能够方便地连接、存储、检索和操作 Redis 中的数据。 spring-data-redis 2.6 的主要特性包括: 1. 注解驱动的编程:通过添加注解,开发者可以轻松地将 Java 对象映射到 Redis 数据库中的数据结构,如字符串、哈希、列表等。这样可以简化开发过程,并提高代码的可读性。 2. 高性能的数据访问:spring-data-redis 2.6 提供了一系列的模板(Template)和存储库(Repository),可以让开发者灵活地进行数据操作。同时,它还支持批量操作和事务,能够提高数据访问的效率。 3. 持久化支持:spring-data-redis 2.6 提供了持久化的支持,可以将 Redis 数据库中的数据持久化到硬盘上,以防止数据丢失。 4. 缓存支持:spring-data-redis 2.6 支持将 Redis 作为缓存提供器,可以方便地使用 Redis 进行缓存管理,以加快应用程序的访问速度。 5. 分布式锁支持:spring-data-redis 2.6 提供了分布式锁的支持,可以在多个应用实例之间协调访问共享资源,避免并发冲突。 总的来说,spring-data-redis 2.6 是一个功能强大、易用性高的 Java 框架,使得与 Redis 数据库的交互变得简单而高效。它能够满足开发者在存储、检索和操作数据方面的需求,并提供了一些额外的功能,如数据持久化、缓存支持和分布式锁支持,以增强应用程序的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zp8126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值