zoukankan      html  css  js  c++  java
  • Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存

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

    整合Redis

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

    pom.xml依赖安装

            <!-- Start: redis -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.7.2.RELEASE</version>
            </dependency>
            
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
            <!-- End: redis -->
    

    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<String, String> redisTemplate(RedisConnectionFactory cf) {
            RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
            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配置文件中添加如下配置:

    <context:component-scan base-package="com.ssm.promotion.core.redis"/>
    

    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

        <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
        <!-- redis连接池 -->
        <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="${redis.maxActive}"></property>
            <property name="maxIdle" value="${redis.maxIdle}"></property>
            <property name="maxWaitMillis" value="${redis.maxWait}"></property>
            <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
        </bean>
        <!-- redis连接工厂 -->
        <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <property name="hostName" value="${redis.host}"></property>
            <property name="port" value="${redis.port}"></property>
            
            <!-- 即使没有设置密码,password可以不设置值,但这项设置一定要保留 -->
            <property name="password" value="${redis.password}"></property>
            <!-- 即使没有设置密码,password可以不设置值,但这项设置一定要保留 -->
            
            <property name="poolConfig" ref="jedisConfig"></property>
        </bean>
        <!-- redis操作模板 -->
        <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
            <property name="connectionFactory" ref="connectionFactory"/>
            <property name="keySerializer">
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
            </property>
            <property name="valueSerializer">
                <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
            </property>
            <!--开启事务-->
            <property name="enableTransactionSupport" value="true"/>
        </bean>
    </beans>
    

    注意事项:

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

    <property name="password" value=""></property>
    

    如若不然的话,项目在启动时会报错,无法连接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<String> 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<String> stringList = (List<String>) redisUtil.get("stringList", List.class);
            if (stringList.size() > 0) {
                for (String string : stringList
                        ) {
                    System.out.println(string);
                }
            }
        }
    

    测试结果如下:
    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
    

    exception

     @Test
        public void redisPutListArticleTest() {
            List<Article> 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<Article> articles = (List<Article>) 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整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。

  • 相关阅读:
    【c/c++】#pragma的用法
    【c/c++】#pragma的用法
    【matlab】matlab中 mcc、mbuild和mex命令详解
    【codecs】数据流ES、PES、TS、PS简介
    【codecs】数据流ES、PES、TS、PS简介
    【SVAC】SVAC标准简介
    【python】Python实现SMTP发送邮件
    【c】#pragma once 与#ifndef的区别与作用
    【c】#pragma once 与#ifndef的区别与作用
    【Tools/PC】如何在一台电脑上实现双屏幕显示?
  • 原文地址:https://www.cnblogs.com/han-1034683568/p/7994231.html
Copyright © 2011-2022 走看看