一文读懂 Spring 集成 Redis

一文读懂 Spring 集成 Redis


Web项目聚集地

图文教程,技术交流

一文读懂 Spring 集成 Redis

一文读懂 Spring 集成 Redis

小编写文章花了30分钟,作图花了30分钟,喜欢图的朋友也可以给文章点赞哦。

前言

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

Spring Data Redis 介绍

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

快速搭建 Spring Data Redis

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

  
  
  
  1. <dependencies>

  2.    <dependency>

  3.        <groupId>org.springframework.data</groupId>

  4.        <artifactId>spring-data-redis</artifactId>

  5.        <version>1.8.8.RELEASE</version>

  6.    </dependency>

  7. </dependencies><repositories>

  8.    <repository>

  9.        <id>spring-libs-release</id>

  10.        <name>Spring Releases</name>

  11.        <url>https://repo.spring.io/libs-release</url>

  12.        <snapshots>

  13.            <enabled>false</enabled>

  14.        </snapshots>

  15.    </repository>

  16. </repositories>

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

  
  
  
  1. <bean id="jedisConnFactory"

  2.    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"

  3.    p:use-pool="true"

  4.    p:host-name="172.10.23.234"

  5.    />

  6. <!-- redis template definition -->

  7. <bean id="redisTemplate"

  8.    class="org.springframework.data.redis.core.RedisTemplate"

  9.    p:connection-factory-ref="jedisConnFactory"/>

最后直接引入 bean使用:

  
  
  
  1. public class Example {

  2.    // inject the actual template

  3.    @Autowired

  4.    private RedisTemplate<String, String> template;

  5.    // inject the template as ListOperations

  6.    // can also inject as Value, Set, ZSet, and HashOperations

  7.    @Resource(name="redisTemplate")

  8.    private ListOperations<String, String> listOps;

  9.    public void addLink(String userId, URL url) {

  10.        listOps.leftPush(userId, url.toExternalForm());

  11.        // or use template directly

  12.        redisTemplate.boundListOps(userId).leftPush(url.toExternalForm());

  13.    }

  14. }

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

NoClassDefFoundError 问题解决

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

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

  
  
  
  1.  <dependency>

  2.      <groupId>org.apache.commons</groupId>

  3.      <artifactId>commons-pool2</artifactId>

  4.      <optional>true</optional>

  5.    </dependency>

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

  
  
  
  1. <dependency>

  2.    <groupId>org.apache.commons</groupId>

  3.    <artifactId>commons-pool2</artifactId>

  4.    <version>2.2</version>

  5. </dependency>

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

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

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

  
  
  
  1. <dependency>

  2.    <groupId>redis.clients</groupId>

  3.    <artifactId>jedis</artifactId>

  4.    <version>2.9.0</version>

  5. </dependency>

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

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

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

推荐阅读

1. 你真的了解JAVA实参和形参吗

2. 你的URL被篡改了怎么办

3. 你真的懂类加载机制吗

欢迎您的转发和点赞

一文读懂 Spring 集成 Redis

▲长按关注我们


文章首发于码匠笔记 ,老哥先后就职于 ThoughtWorks 、阿里巴巴等互联网公司 ,擅长 Java 、Scala 等多种语言 ,并熟悉前端开发 ,从事多年全栈开发工程师 。热衷于技术分享 ,博文创作 ,开源社区 ,开源工具等 。有兴趣的可以扫码关注他哦 。

一文读懂 Spring 集成 Redis

▲识别二维码关注

本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年8月30日 上午5:16。
转载请注明:一文读懂 Spring 集成 Redis | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...