springboot使用redis做缓存

2019-04-15  本文已影响0人  则一城终老
此文纯属第一次用redis时记的笔记;
1 .springboot整合redis有两种方式:分别是jedis连接和redisTemplate
2 .pom.xml中引入jar宝版本
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
3. 引入jar包之后,我们再来看看配置文件:application.yml
# redis单服务器配置
spring:   
  redis:
    database: 0 # 使用第一个数据库,默认一共创建16个数据库
    host: 10.175.94.63  # Redis服务器地址  测试服务器中的redis
    port: 6379 # Redis服务器连接端口  
    password: # Redis服务器连接密码(默认为空) 
    pool:
      max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 
      max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
      max-idle: 8 # 连接池中的最大空闲连接
      min-idle: 0 # 连接池中的最小空闲连接
    timeout: 0 # 连接超时时间(毫秒)
    commandTimeout: 5000
4 . 再来看看序列化问题:请参考 https://blog.csdn.net/f641385712/article/details/84679456,我觉得讲的很具体;

这边写一下比较常用的几种,大家酌情选用:

@Configuration
@EnableCaching // 启用缓存,这个注解很重要
public class RedisConfig  implements CachingConfigurer{

private Logger logger = LoggerFactory.getLogger(this.getClass());
//-----------------------序列化配置-------------------------------
@Bean
    public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        // key序列化方式;但是如果方法上有Long等非String类型的话,会报类型转换错误;
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();// Long类型不可以会出现异常信息;
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);

        // JdkSerializationRedisSerializer序列化方式;
        JdkSerializationRedisSerializer jdkRedisSerializer = new JdkSerializationRedisSerializer();
        redisTemplate.setValueSerializer(jdkRedisSerializer);
        redisTemplate.setHashValueSerializer(jdkRedisSerializer);
        redisTemplate.afterPropertiesSet();
        
        // Json序列化方式
//      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//      ObjectMapper om = new ObjectMapper();
//      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//      jackson2JsonRedisSerializer.setObjectMapper(om);
//      RedisSerializer stringSerializer = new StringRedisSerializer();
//      redisTemplate.setKeySerializer(stringSerializer);// key序列化;
//      redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 
//      redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化
//      redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 
//      redisTemplate.afterPropertiesSet();
        
        return redisTemplate;
    }


//------------------------连接配置---------------------------------------




    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.database}")
    private int database;

    @Value("${spring.redis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.pool.min-idle}")
    private int minIdle;
/**
     * redis连接的基础设置
     * 
     * @Description:
     * @return
     */
    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(host);
        factory.setPort(port);
        factory.setPassword(password);
        // 存储的库
        factory.setDatabase(database);
        // 设置连接超时时间
        factory.setTimeout(timeout);
        factory.setUsePool(true);
        factory.setPoolConfig(jedisPoolConfig());
        return factory;
    }

    /**
     * 连接池配置
     * 
     * @Description:
     * @return
     */
    @Bean
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMinIdle(minIdle);
        // jedisPoolConfig.set ...
        return jedisPoolConfig;
    }

    /**
     * redis数据操作异常处理 这里的处理:在日志中打印出错误信息,但是放行
     * 保证redis服务器出现连接等问题的时候不影响程序的正常运行,使得能够出问题时不用缓存
     * 
     * @return
     */
    @Bean
    @Override
    public CacheErrorHandler errorHandler() {
        CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
                logger.error("redis异常:key=[{}]", key, e);
            }

            @Override
            public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
                logger.error("redis异常:key=[{}]", key, e);
            }

            @Override
            public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) {
                logger.error("redis异常:key=[{}]", key, e);
            }

            @Override
            public void handleCacheClearError(RuntimeException e, Cache cache) {
                logger.error("redis异常:", e);
            }
        };
        return cacheErrorHandler;
    }

}

5. key的自定义策略:
@Configuration
public class RedisConfig{
/**
     * 注解@Cache key生成规则
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }

        };
    }


      /**
     * 
     * @Title: appProjectCacheKeyGenerator
     * @Description: 自定key生成規則
     * @author admin
     * @return
     */
    @Bean
    public KeyGenerator appProjectCacheKeyGenerator() {
        AppProjectCacheKeyGenerator apckg = new AppProjectCacheKeyGenerator();
        return apckg;
    }
}

上面自定义key中的AppProjectCacheKeyGenerator是👇自定义的keyGenerator

public class AppProjectCacheKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        return "MODEL-USER-ROLE";//自定义的key;
    }

}

这个KeyGenerator在注解缓存中的用法如下:相当于自定义key


@Cacheable(value = "user-resource",  keyGenerator = "appProjectCacheKeyGenerator")
    public List<GroupLevel> listuser() {
        return groupUserMapper.listAllUser();
    }

6. 关于注解:
上一篇下一篇

猜你喜欢

热点阅读