一文读懂 Spring 集成 Redis

前言

关于 Redis已然是烂大街的技术了,但是近日新起了一个项目需要集成 Redis,看了一下之前的封装实在是不怎么优雅,于是查了一下发现了一个非常简单的解决方案,那就是 Spring家族的 SpringDataRedis。话不多说直接“上码”:

Spring Data Redis 介绍

Spring Data Redis是Spring Data系列的一部分,它可以轻松地使得Spring应用程序配置和访问Redis。

快速搭建 Spring Data Redis

直接可以参照官方地址进行配置,以往的 Spring的文档都写着预计阅读时间,这个没有写你就知道有多简单啦。你可以直接点击查看官方文档,或者往下阅读。 Maven直接引入如下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.8.8.RELEASE</version>
    </dependency>
</dependencies><repositories>
    <repository>
        <id>spring-libs-release</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

然后直接在 Spring的配置文件里面定义 bean就可以了,官方没有说怎么配置 hostname等等,但是点击 JedisConnectionFactory里面一看就知道了,直接添加一行 p:host-name="172.10.23.234"即可。

<bean id="jedisConnFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
    p:use-pool="true"
    p:host-name="172.10.23.234"
    />

<!-- redis template definition -->
<bean id="redisTemplate" 
    class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnFactory"/>

最后直接引入 bean使用:

public class Example {

    // inject the actual template
    @Autowired
    private RedisTemplate<String, String> template;

    // inject the template as ListOperations
    // can also inject as Value, Set, ZSet, and HashOperations
    @Resource(name="redisTemplate")
    private ListOperations<String, String> listOps;

    public void addLink(String userId, URL url) {
        listOps.leftPush(userId, url.toExternalForm());
        // or use template directly
        redisTemplate.boundListOps(userId).leftPush(url.toExternalForm());
    }
}

如上,根据 Spring的官方文档已经全部完成,是不是非常简单?那么接下来我们运行一下试一试。 这时候出现了第一个异常。

NoClassDefFoundError 问题解决

nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig

很明显是没有引入这个包嘛,我们直接从 spring-data-redis的 pom.xml里面可以看到多了一个 optional属性。

<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <optional>true</optional>
    </dependency>

那么这个问题就迎刃而解了,因为在 spring-data-redis里面声明的 commons-pool2是 optional的,根据 Maven的规则如果A项目依赖配置为optional的,那么依赖A项目的B项目如果不手动引入A里面optional的依赖B项目是不会自动引入依赖的的。说起来有点绕,反正就是导致我们必须手动添加下面的依赖。详情可以参照 Maven的官方网文档。点击查看官方文档。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.2</version>
</dependency>

再次运行的时候我们发现了另一个问题

nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/JedisPoolConfig

这问题就显而易见了,直接添加如下到 pom.xml中即可。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

这时候我们再次运行项目可以正常运行啦,然而有出现了一个奇怪的问题,存入 Redis里面的 Key有一个看起来像是乱码的前缀 \xac\xed\x00\x05t\x00:

\xac\xed\x00\x05t\x00 到底是啥

出现这个问题的原因是因为其使用的默认是RedisTemplate,它使用的是Java的Serialization方式,所以会在前面有一段类似乱码的东西。如果是String作为key的话可以直接修改为StringRedisTemplate这个问题就修改了

原文发布于微信公众号 - Web项目聚集地(web_resource)

原文发表时间:2018-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张宁的专栏

【腾讯云的1001种玩法】AMH 4.2 升级Nginx与PHP实战练习与笔记

最近对AMH的系统比较感兴趣,特拿来了AMH 4.2来尝试下对其内核版本升级一下,并做了笔记供需要的同学参考。前几天在对张宁网进行更新改版,配置SSL的时候碰见...

63300
来自专栏weixuqin 的专栏

springMVC 学习笔记(一):spring 入门

springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。springMVC 是一个基于 mvc ...

15220
来自专栏微信公众号:Java团长

Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Red...

34520
来自专栏张戈的专栏

gh-ost:在线DDL修改MySQL表结构工具

在之前,我分享过一次 pt-online-schema-change 在线 DDL 的工具实践记录,在实际使用过程中,发现部门的很多老系统大量使用了触发器,从而...

1.2K70
来自专栏SpringBoot 核心技术

第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化

774100
来自专栏蓝天

编译hbase-1.2.3源代码

确保机器可以正常访问Internet,如能正常访问https://repo.maven.apache.org等,如果是代理方式则需要设置好eclipse和m...

26620
来自专栏owent

注册表常用键值意义

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]

18620
来自专栏Golang语言社区

在 Golang 项目中使用 Spring Cloud Config Server 管理配置

最近用 Go 写后端写得很开心,写篇比较实用的博客总结下如何通过 Spring Cloud Config Server 管理 Go 程序中的配置。 实现并不复杂...

31840
来自专栏龙首琴剑庐

Spring Session 实现分布式会话管理

1、分布式会话管理是什么? 在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是...

58690
来自专栏ChaMd5安全团队

CVE-2018-1000156:GNU Patch任意代码执行漏洞分析

GNU Patch 源码下载地址:https://ftp.gnu.org/gnu/patch/

36920

扫码关注云+社区

领取腾讯云代金券