zoukankan      html  css  js  c++  java
  • Spring-data-redis操作redis知识总结

    什么是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的方式.

  • 相关阅读:
    数据库操作类
    并查集的使用
    简单的图片识别,源代码
    Sql Server清理缓存代码
    京东商城商品价格获取方法
    【转】 SEO的含义与意义
    隐藏控制台窗口的方法
    MySQL存储过程详解
    常见电商B2C网站购物车的设计
    UML建模之业务处理模型(Business Process Model,BPM)
  • 原文地址:https://www.cnblogs.com/fingerboy/p/6704812.html
Copyright © 2011-2022 走看看