Spring Cache 集成 Redis 简单实现

来源:互联网 发布:淘宝企业店铺搜索 编辑:程序博客网 时间:2024/06/05 17:38

前言

上篇文章简单配置了如何使用Spring集成cacheManager,使用的实现是spring提供的SimpleCacheManager,但是在项目中往往不采用这种实现,而是采用Redis来做缓存管理,下面是如果用java的方式在spring cache集成redis。

  1. 先上需要引入的jar
        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-redis</artifactId>            <version>1.7.8.RELEASE</version>        </dependency>        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <version>2.9.0</version>        </dependency>
2. 重点在与JedisConnectionFactory实现链接工厂方法,使用RedisCacheManager 实现具体的CacheManager
@Configuration@EnableCaching //开启缓存注解public class SpringCacheConfig {    /**     *  使用Redis管理缓存     * @param redisTemplate     * @return RedisCacheManager     */    @Bean    public CacheManager cacheManager(RedisTemplate redisTemplate){        return new RedisCacheManager(redisTemplate);    }    @Bean    public JedisConnectionFactory redisConnectionFactory(){        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();        redisConnectionFactory.setHostName("127.0.0.1");//redis 地址        redisConnectionFactory.setPort(6379);//端口        return redisConnectionFactory;    }    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        redisTemplate.afterPropertiesSet();        return redisTemplate;    }

RedisTemplate支持

熟悉Spring的JdbcTemplate对象的话,应该大概能猜出来RedisTemplate的作用了,RedisTemplate对象对RedisConnection进行了封装,它提供了连接管理,序列化等功能,它对Redis的交互进行了更高层次的抽象。另外还提供了Redis操作命令的操作视图,这极大的方便和简化了Redis的操作。

注意事项
1. 要缓存的 Java 对象必须实现 Serializable 接口,因为 Spring 会将对象先序列化再存入 Redis,比如本文中的 com.defonds.bdp.city.bean.City 类,如果不实现 Serializable 的话将会遇到类似这种错误:nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.defonds.bdp.city.bean.City]]。
2.缓存的生命周期我们可以配置,然后托管 Spring CacheManager,不要试图通过 redis-cli 命令行去管理缓存。比如 provinceCities 方法的缓存,某个省份的查询结果会被以 key-value 的形式存放在 Redis,key 就是我们刚才自定义生成的 key,value 是序列化后的对象,这个 key 会被放在 key 名为 provinceCities~keys key-value 存储中,参考下图”provinceCities 方法在 Redis 中的缓存情况”。可以通过 redis-cli 使用 del 命令将 provinceCities~keys 删除,但每个省份的缓存却不会被清除。
3.CacheManager 必须设置缓存过期时间,否则缓存对象将永不过期,这样做的原因如上,避免一些野数据“永久保存”。此外,设置缓存过期时间也有助于资源利用最大化,因为缓存里保留的永远是热点数据。
4. 缓存适用于读多写少的场合,查询时缓存命中率很低、写操作很频繁等场景不适宜用缓存。

0 0
原创粉丝点击