SpringBoot连接Redis

下面就开始练习连接Redis,这里也是没有集成web模块。web模块感觉这些东西也没有必要。连接池这里可以讲一下,上一篇MySQL的连接池放在Mybatis那里再讲,估计也快了,如果不出意外的话。。。

首先安装Redis和配置Redis的信息,这里不再累述,我之前的博客也有。刚才看了一下,我之前的博客讲的还挺详细的,我这次有可能重复了,尽量讲讲之前没有讲到的。

仍然是添加依赖,因为Redis官方开发了一个连接工具Jedis,这个工具挺好用的。

<!--  Redis依赖      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--  不添加这个依赖会导致RedisTemplate无法注入      -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

下面就是配置Redis连接和连接池信息。

#Redis依赖
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=自己的密码
# 连接超时时间(毫秒)
spring.redis.timeout=1000
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=200
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=10
## 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0

下面就开始编写代码,需要注意的是代码中引用的类是StringRedisTemplate,有一些不同的地方。

  • RedisTemplate,RedisTemplate是最基本的操作类,它默认的序列化方式是JdkSerializationRedisSerializer,在存值时,键值会被序列化为字节数组,可读性差,取值时也是一样,如果redis中存的值正常的字符串形式,取值时将返回null。
  • StringRedisTemplateStringRedisTemplate继承于 RedisTemplate<String, String>,默认的序列化方式是StringRedisSerializer,存值取值都是按照字符串的形式。
    代码如下,但是中间遇到了一些问题,解决起来很蛋疼。下面说说,最开始使用的是上面的依赖,但是启动一直报错,一开始怀疑注入的方式不对,把@Resource换成@Autowired,结果还是不行,又怀疑方法不能正常调用(菜鸟的智障怀疑),后来又排除了。在网上找了一圈,怀疑redis版本的问题,换成了jedis,结果就可以了。然后就认为是依赖的版本问题,生菜(最新redis使用的)和目前的SpringBoot融合的不是很好。
package com.psq.train.redis;

import com.psq.train.mysql.TestUser;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * RedisTrain.java
 * Description: Redis练习
 *
 * @author Peng Shiquan
 * @date 2020/5/31
 */
@Component
public class RedisTrain {

    /**
     * 使用StringRedisTemplate,类似于RedisTemplate<String,String>
     */
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * Description: Redis练习的主方法
     *
     * @param
     * @return void
     * @Author: Peng Shiquan
     * @Date: 2020/5/31
     */
    @PostConstruct
    public void redisTrainmain() {
        TestUser testUser = new TestUser();
        testUser.setId(3);
        testUser.setName("张三");
        testUser.setPassword("1234567");
        System.err.println("下面开始Redis插入");
        redisTrainInsert(testUser);
        System.err.println("下面开始查询");
        redisTrainSelect(testUser.getName());
    }

    /**
     * Description: redis插入方法
     *
     * @param testUser
     * @return void
     * @Author: Peng Shiquan
     * @Date: 2020/6/1
     */
    public void redisTrainInsert(TestUser testUser) {
        String key = testUser.getName();
        String value = testUser.toString();
        stringRedisTemplate.opsForValue().set(key, value);
        System.err.println("存储成功,存储对象为:key:" + key + ",value:" + value);
    }

    /**
     * Description: redis查询方法
     *
     * @param name
     * @return void
     * @Author: Peng Shiquan
     * @Date: 2020/6/1
     */
    public void redisTrainSelect(String name) {
        System.err.println("需要查询的name为:" + name);
        System.err.println(name);
        String value = stringRedisTemplate.opsForValue().get(name);
        System.err.println("查询到到结果为:" + value);
    }
}
  • LettuceJedis的都是连接Redis Server的客户端程序。Jedis实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例
    我也这样认为,直到我再次启动的时候,发现下面一个问题。
  • springboot连接redis集群配置 springboot如何连接redis_redis

  • 如上图,最后显示的是一个密码的问题,是客户端配置了密码,但是服务端没有配置密码,我又查看了redis启动的时候,没有使用正确的配置文件。

springboot连接redis集群配置 springboot如何连接redis_spring_02

配置了密码后,一切都解决了。真是一个SB问题,果然是老了。。。

剩下就遗留了一个问题,我看别人的demo都写了一个redis配置类,估计是为了定制自己的RedisTemplate,我这里没有什么定制的,就是简单的用了一下,所以没有写redis配置类。如果我说错了,大家也指点一下。

就这样吧,结束。