设为首页 收藏本站
查看: 938|回复: 0

[经验分享] Spring-data-redis操作redis知识总结

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-11-4 07:06:40 | 显示全部楼层 |阅读模式
什么是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 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  2      org.springframework.data 3      spring-data-redis 4      1.3.4.RELEASE 5  6  7  8      redis.clients 9      jedis10      2.4.211

  2.spring-redis.xml配置:

  
   
  
        
  
        
  
        
  
        
  
        
  
        
  
        
  
        
  
   
  

  
   
  
   
  
        
  
        
  
        
  
        
  
   
  

  
   
  
   
  

  

  
   
  
   
  
        
  
        
  
        
  
        
  

  
   

  以上配置完成后,就可以使用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

@Controllerpublic class UserController extends BaseController {  

  
    @Autowired    private IUserService userService;
  

  
    @Autowired    private RedisTemplate 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的方式



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630398-1-1.html 上篇帖子: 小白的web优化之路 一、使用redis来缓存信息 下篇帖子: redis3.2.1单机版本安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表