Spring-data-redis操作redis知识总结

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 什么是spring-data-redis      spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis...

什么是spring-data-redis

      spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客户端的抽象,在开发中可以忽略掉切换具体的客户端所带来的影响,而且他本身就属于spring的一部分,比起单纯的使用jedis,更加稳定.管理起来更加自动化.(当然jedis的缺点不止以上).

spring-data-redis的特性

      1.自动管理连接池,提供了一个高度封装的RedisTemplate类

      2.针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了Operation接口.支持redis中的五种数据类型的操作.

  3.针对数据的"序列化与反序列化",提供了多种可以选择的策略(RedisSerializer)

            JdkSerializationRedisSerializer:当需要存储java对象时使用.

            StringRedisSerializer:当需要存储string类型的字符串时使用.

            JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,需要jackson-json工具的支持,(目前我还没使用过,不了解)

Operations

  redisTemplate有两个方法经常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Opercation,但是没有指定操作的key,可以在一个连接(事务)内操作多个key以及对应的value;后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value.

ValueOperation和BoundValueOperation

ValueOperations valueOperations = redisTemplate.opsForValue();

BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");

  ValueOperation可以缓存Integer,String,java对象等类型.使用.set(key,value)方法进行设置,get(key)方法用来获取.

      同样的方式可以获取ListOperations对象,可以用来缓存List,此外还有SetOperation,HashOperation

在spring+springmvc项目中使用spring-data-redis

   1.maven配置,添加pom依赖

 1 <dependency>
 2      <groupId>org.springframework.data</groupId>
 3      <artifactId>spring-data-redis</artifactId>
 4      <version>1.3.4.RELEASE</version>
 5 </dependency>
 6 
 7 <dependency>
 8      <groupId>redis.clients</groupId>
 9      <artifactId>jedis</artifactId>
10      <version>2.4.2</version>
11 </dependency>

  2.spring-redis.xml配置:

 <!--JedisPoolConfig 连接池参数配置-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--最大空闲实例数-->
        <property name="maxIdle" value="300" />
        <!--最大活跃实例数-->
        <property name="maxTotal" value="600" />
        <!--创建实例时最长等待时间-->
        <property name="maxWaitMillis" value="1000" />
        <!--创建实例时是否验证-->
        <property name="testOnBorrow" value="true" />
    </bean>

    <!--JedisConnectionFactory 跟配置数据库连接池类似,需要配置JedisConnectionFactory来通过服务器或者连接池的方式获取redis服务器的连接-->
    <bean id="connectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="127.0.0.1"/>
        <property name="port" value="6379"/>
        <property name="usePool" value="true"/>
        <property name="poolConfig" ref="poolConfig"/>
    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>


    <!-- redis模板配置  spring-data-redis提供了一个基础的泛型RedisTemplate封装了基础的crud操作-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="defaultSerializer" ref="stringRedisSerializer"/>
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="valueSerializer"/>

    </bean>

        以上配置完成后,就可以使用spring-data-redis了,为了演示一下具体的使用,这里接着写一个简单地demo.

3.创建实体类User

 1 public class User implements Serializable {
 2 
 3     private static final long serialVersionUID = 1L;
 4 
 5     /** 用户ID */
 6     private Long id;
 7 
 8     /** 用户名 */
 9     private String name;
10 
11     /** 用户年龄 */
12     private Integer age;
13 }

       注意:如果需要向redis内存储pojo对象,那么该对象必须要实现Serializable接口,因为在redis中存储pojo类仍然存储的是string,它会把数据转化成byte[]数组的形式,在存取的时候就要对数据格式进行转化,就涉及到了序列化与反序列化.

      4.创建UserCcontroller

@Controller
public class UserController extends BaseController {

    @Autowired
    private IUserService userService;

    @Autowired
    private RedisTemplate<String,User> redisTemplate;

    @ResponseBody
    @RequestMapping("/redis")
    public Object redis() {

        User u1=new User();
        u1.setId(1L);
        u1.setName("wang");
        u1.setAge(22);
        redisTemplate.opsForValue().set("user:wang",u1);

        User u2=redisTemplate.opsForValue().get("user:wang");
        return u2;
    }
}

         这里我们将user对象存储到redis中,再读出来,运行项目,测试这个接口,就可以在浏览器中看到json格式的user对象.

常见报错及解决方案

     最开始我测试spring-data-redis的功能是从一个空项目一点点配置的,启动时报了很多异常,下面一个一个来.

     1.启动tomcat报错

Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory, 
method: afterPropertiesSet signature: ()V) Incompatible argument to function

      原因及解决方案:

          在pom中我最开始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,网上搜索了一翻,发现有一个说法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 无法搭配使用,于是我把spring-data-redis的版本设成比较高的1.3.4,重新部署,果然此问题解决,紧接着问题又来了.

  2.启动tomcat报错

Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V

  原因及解决方案:同样是版本的问题(没错,都被我撞上了),jedis版本是2.7.3,太高了,改成2.4.3以后,问题解决.

  3.启动tomcat报错

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

      原因及解决方案:这个GenericObjectPool使用到了commons-pool.jar中的类,我们的依赖中没有这个jar,所以添加commons-pool的dependency即可.

  4.运行接口报错

HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: com.baomidou.springmvc.model.system.User cannot be cast to java.lang.String

  原因及解决方案:在spring-redis配置文件中的redisTemplate的property中缺少name="valueSerializer"的配置,因为存储在redis的value是user对象,需要使用JdkSerializationRedisSerializer对象进行对象的序列化操作,解决方案就是配置成上面spring-redis.xml的方式.

相关文章
|
29天前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
1月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
260 1
存储 JSON Java
442 0
|
2月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
170 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
2月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
282 0
|
4月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
525 2
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
228 32
|
7月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
740 4
|
7月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
431 0
|
8月前
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
1935 0

热门文章

最新文章