zoukankan      html  css  js  c++  java
  • Spring Boot Redis 分布式缓存的使用

    一、pom 依赖

    <!-- 分布式缓存 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    二、资源文件

    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=localhost
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=

    三、Java文件

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    
    @Configuration
    public class RedisDBConfig {
    
        @Value("${spring.redis.host}")
        private String host;
    
        @Value("${spring.redis.port}")
        private int port;
    
        @Value("${spring.redis.password}")
        private String password;
    
        @Bean
        public JedisConnectionFactory jedisConnectionFactory() {
            JedisConnectionFactory factory = new JedisConnectionFactory();
            factory.setHostName(host);
            factory.setPort(port);
            factory.setPassword(password);
            return factory;
        }
    
    }
    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 java.lang.reflect.Method;
    
    /**
     * @author zxguan
     * @description
     * @create 2018-01-29 15:32
     */
    @Configuration
    @EnableCaching
    public class RedisCacheConfig extends CachingConfigurerSupport {
        /**
         * 缓存管理器.
         * @param redisTemplate
         * @return
         */
        @Bean
        public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
            CacheManager cacheManager = new RedisCacheManager(redisTemplate);
            return cacheManager;
        }
    
        /**
         * redis模板操作类,类似于jdbcTemplate的一个类;
         *
         * 虽然CacheManager也能获取到Cache对象,但是操作起来没有那么灵活;
         *
         * 这里在扩展下:RedisTemplate这个类不见得很好操作,我们可以在进行扩展一个我们
         *
         * 自己的缓存类,比如:RedisStorage类;
         *
         * @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等非String类型的话,会报类型转换错误;
            //所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
            //或者JdkSerializationRedisSerializer序列化方式;
    //     RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;
    //     redisTemplate.setKeySerializer(redisSerializer);
    //     redisTemplate.setHashKeySerializer(redisSerializer);
    
            return redisTemplate;
        }
    
        /**
         * 自定义key.
         * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
         */
        @Override
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    // This will generate a unique key of the class name, the method name
                    //and all method parameters appended.
                    StringBuilder sb = new StringBuilder();
                    sb.append(o.getClass().getName());
                    sb.append(method.getName());
                    for (Object obj : objects) {
                        sb.append(obj.toString());
                    }
                    return sb.toString();
                }
            };
        }
    }
    import com.wsjia.ms.model.AliyunOauth2StateCache;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Component;
    
    /**
     * @author zxguan
     * @description
     * @create 2018-01-29 15:11
     */
    @Component
    public class CacheService {
    
        @Cacheable(value = "aliyunStates", key = "#id")
        public AliyunOauth2StateCache findBy(String id) {
            return null;
        }
    
        @CachePut(value = "aliyunStates", key = "#stateCache.id")
        public AliyunOauth2StateCache saveOrUpdate(AliyunOauth2StateCache stateCache) {
            return stateCache;
        }
    
        @CacheEvict(value = "aliyunStates", key = "#stateCache.id")
        public AliyunOauth2StateCache delete(AliyunOauth2StateCache stateCache) {
            return stateCache;
        }
    }

      其他就是调用接口实现增删改查


  • 相关阅读:
    springboot~gradle4.7之后的lombok引用方法
    fzu 2107 Hua Rong Dao(状态压缩)
    jquery 按钮效果 正常、移上、按下
    HDU4550+贪心
    谈mvc开发中gzip压缩的应用
    GET方法传递中文参数乱码解决办法
    游戏开发工具之纹理打包器-3.使用GDI+绘图
    处理机调度
    Adroid学习系列-入门(1)
    Drupal 7.23版本升级笔记
  • 原文地址:https://www.cnblogs.com/zxguan/p/8378654.html
Copyright © 2011-2022 走看看