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

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