springboot--redis

作者: c809f591bd50 | 来源:发表于2017-12-26 14:40 被阅读63次

一、添加依赖
SpringBoot本身就提供了一个支持redis的jar,因此,首先添加以下依赖

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、配置redis
这里我使用的是application.yml,如使用的是application.properties的话需更改下

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

配置config的时候,我遇到了个坑,程序报了以下错误:

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

造成这个异常的原因是,在服务器上配置redis.conf的时候,没把bind 127.0.0.1注释掉,导致外网无法访问,因此这里需要注意下。
然后不知道是因为我电脑原因还是application格式的原因,当配置redis服务器连接密码时,如果不加双引号,会报密码错误,因此如果有报redis密码错误的话,可以尝试把双引号删去试试。
三、创建RedisConfig.java类

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
    /**
     * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
     * @return
     */
   @Bean
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){
            @Override
            public Object generate(Object target, Method method, Object... params){
                //格式化缓存key字符串
                StringBuilder sb = new StringBuilder();
                //追加类名
                sb.append(target.getClass().getName());
                //追加方法名
                sb.append(method.getName());
                //遍历参数并且追加
                for(Object object : params){
                    sb.append(object.toString());
                }
                return sb;
            }
        };
    }

    /**
     * 设置缓存过期时间
     * @param redisTemplate
     * @return
     */
    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间(秒)
        rcm.setDefaultExpiration(60*60*24);
        return rcm;
    }

    /**
     * RedisTemplate缓存操作类,类似于jdbcTemplate的一个类
     *
     * @param factory 通过Spring进行注入,参数在application.properties进行配置
     * @return
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){

        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();

        redisTemplate.setConnectionFactory(factory);
        //key序列化,不然会出现乱码,不能出现long类型的数据,否则会报类型转换错误
        //自己实现ObjectRedisSerializer或者JdkSerializationRedisSerializer序列化方式
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);

        return redisTemplate;
    }
}

四、通过key-value形式操作缓存
这里最重要的就是,先要将StringRedisTemplate这个类注入到bean中,当然,除了这个类,还可以调用RedisTemplate这个类

@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisTemplate redisTemplate;
//添加缓存
@Test
public void add()  {
    stringRedisTemplate.opsForValue().set("aaa", "111");
}
//通过key获取缓存
@Test
public void get(){
    System.out.println(stringRedisTemplate.opsForValue().get("aaa"));
}
//通过key删除缓存
@Test
public void del(){
    stringRedisTemplate.delete("aaa");
}

获取redis里的缓存时,如果key不存在,那么会返回null。
五、通过在方法上加注解的方式,操作redis

@Cacheable()
public User findUser(String name){
    User user = userMapper.findUser(name);
    retrun user;
}

这里我直接在service层的方法上添加注解,他会自动根据我们在RedisConfig.java这个类中配置的KeyGenerator来进行存储。

相关文章

  • springboot--redis

    一、添加依赖SpringBoot本身就提供了一个支持redis的jar,因此,首先添加以下依赖 二、配置redis...

  • springboot--redis配置

    基于spring.version:4.x;4.2.4.RELEASE不同spring版本对应的redis版本也不一...

网友评论

    本文标题:springboot--redis

    本文链接:https://www.haomeiwen.com/subject/vagdgxtx.html