Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存

作者:13
GItHub:https://github.com/ZHENFENG13
版权声明:本文为原创文章,未经允许不得转载。

整合Redis

本来以为类似的Redis教程和整合代码应该会很多,因此也没打算特别认真的做这个教程,但是看了一下网上类似的教程好像不是特别多,刚好也要在perfect-ssm项目中整合Redis,因此花了两天时间做了整合和测试,并整理在这篇文章中,希望给看到教程的朋友一些帮助。

pom.xml依赖安装

        
        
            org.springframework.data
            spring-data-redis
            1.7.2.RELEASE
        
        
        
            redis.clients
            jedis
            2.9.0
        
        

Spring+Redis集成代码

有两种集成方式,一种是通过Spring配置文件,另外一种是通过继承CachingConfigurerSupport,两种方式虽然方式不同,但是目的和结果是一样的。

方式一:

RedisCacheConfig.java

@Component
@EnableCaching
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
        //ip地址
        redisConnectionFactory.setHostName("127.0.0.1");
        //端口号
        redisConnectionFactory.setPort(17779);
        //redis登录密码
        redisConnectionFactory.setPassword("ILfr6LTKhpNJ0x5i");
        //database 默认是16个,不设置的话默认为0
        redisConnectionFactory.setDatabase(2);
        return redisConnectionFactory;
    }

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(cf);
        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //默认过期时间
        cacheManager.setDefaultExpiration(3000);
        return cacheManager;
    }

}

完成后要将bean注入到Spring中,因此需要在spring-context.xml配置文件中添加如下配置:


perfect-ssm项目中用到的是此方法,本文中后续的测试用例代码中也是根据这种方式来测试的,代码已经上传至github仓库,源码可以到我的github仓库中查看和下载。

方式二:

redis.properties

#ip地址
redis.host=127.0.0.1
#端口号
redis.port=17779
#密码
redis.password=ILfr6LTKhpNJ0x5i
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=200
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=300
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=1500
redis.testOnBorrow=true

spring-redis.xml

    
    
    
        
        
        
        
    
    
    
        
        
        
        
        
        
        
        
    
    
    
        
        
            
        
        
            
        
        
        
    

注意事项:

如果在安装redis时没有设置密码,配置文件中的password可以不设置值,但是这项设置一定要保留:


如若不然的话,项目在启动时会报错,无法连接redis,没有特别去研究为什么会这样,但是需要注意。

RedisUtil

由于采用的是第一种方式,在测试的时候又写了一个Redis的工具类,RedisUtil:

/**
 * Created by 13 on 2017/12/4.
 */
@Component
public class RedisUtil {

    private static final String CACHE_NAME = "perfect-ssm-cache:";
    // 过期时间
    private static final int EXPIRE_TIME = 3000;

    private RedisTemplate template;

    private RedisCache cache;

    public RedisUtil() {
        init();
    }

    public void init() {
        template = SpringUtil.getBean("redisTemplate");//RedisCacheConfig中定义了
        cache = new RedisCache(CACHE_NAME, CACHE_NAME.getBytes(), template, EXPIRE_TIME);
    }

    //添加
    public void put(String key, Object obj) {
        cache.put(key, obj);
    }

    //获取
    public Object get(String key, Class clazz) {
        return cache.get(key) == null ? null : cache.get(key, clazz);
    }

    //删除
    public void del(String key) {
        cache.evict(key);
    }
}

整合测试

测试用例代码:

  • 首先是简单的String测试:
    @Test
    public void redisPutTest() {
        //添加
        redisUtil.put("name", "perfect-ssm");
    }
put-string
    @Test
    public void redisGetTest() {
        //获取
        String str = (String) redisUtil.get("name", String.class);
        System.out.println(str);
    }

测试结果如下:


get-string
  • 然后是复杂类型java.util.List测试:
    @Test
    public void redisPutListTest() {
        List stringList = new ArrayList<>();
        stringList.add("github");
        stringList.add("13");
        stringList.add("cnblog");
        stringList.add("perfect-ssm");
        //添加
        redisUtil.put("stringList", stringList);
    }
put-list
    @Test
    public void redisGetListTest() {
        //获取
        List stringList = (List) redisUtil.get("stringList", List.class);
        if (stringList.size() > 0) {
            for (String string : stringList
                    ) {
                System.out.println(string);
            }
        }
    }

测试结果如下:


Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存_第1张图片
get-list
  • 最后是项目中自定义的JavaBean的测试:

要缓存的JavaBean必须实现Serializable接口,因为Spring会将对象先序列化再存入 Redis,如测试用例中的com.ssm.promotion.core.entity.Article类,如果不实现 Serializable的话将会报出如下异常:

org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: com.ssm.promotion.core.entity.Article
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存_第2张图片
exception
 @Test
    public void redisPutListArticleTest() {
        List
articles = new ArrayList<>(); Article article1 = new Article(); article1.setId("1"); article1.setArticleContent("article1"); Article article2 = new Article(); article2.setId("2"); article2.setArticleContent("article2"); articles.add(article1); articles.add(article2); //添加 redisUtil.put("articles", articles); }
put-article
@Test
    public void redisGetArticleListTest() {
        //获取
        List
articles = (List
) redisUtil.get("articles", List.class); if (articles.size() > 0) { for (Article article : articles ) { System.out.println(article); } } }

测试结果如下:


get-article

总结

配置文件中的密码、端口、ip地址要改成你自己的配置,不要直接用这里的配置,如果是这个原因导致项目报错就很尴尬了。

每周抽出一些时间做点事情,虽然感觉很压抑,但是看到结果的时候心里真的是乐开了花。

首发于我的个人博客,新的项目演示地址:perfect-ssm,登录账号:admin,密码:123456

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存_第3张图片
image

如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友。

如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。

你可能感兴趣的:(Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存)