zoukankan      html  css  js  c++  java
  • spring + redis 实现数据的缓存

    转自:http://www.importnew.com/22868.html

    1、实现目标

    通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)

    2、所需jar包

    注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons-pooljar的目录根据版本的变化,目录结构会变。前面的版本是org.apache.pool,而后面的版本是org.apache.pool2…

    style=” color: white; font-size: 17px; font-weight: bold;”3、redis简介

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)

    4、编码实现

    1)、配置的文件(properties)

    将那些经常要变化的参数配置成独立的propertis,方便以后的修改

    redis.properties

    1
    2
    3
    4
    5
    6
    7
    8
    9
    redis.hostName=127.0.0.1
    redis.port=6379
    redis.timeout=15000
    redis.usePool=true
     
    redis.maxIdle=6
    redis.minEvictableIdleTimeMillis=300000
    redis.numTestsPerEvictionRun=3
    redis.timeBetweenEvictionRunsMillis=60000

    2)、spring-redis.xml

    redis的相关参数配置设置。参数的值来自上面的properties文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"
        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
            <!-- <property name="maxIdle" value="6"></property> 
            <property name="minEvictableIdleTimeMillis" value="300000"></property> 
            <property name="numTestsPerEvictionRun" value="3"></property> 
            <property name="timeBetweenEvictionRunsMillis" value="60000"></property>   -->
     
            <property name="maxIdle" value="${redis.maxIdle}"></property
            <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"></property
            <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"></property
            <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"></property>
        </bean
        <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy"
            <property name="poolConfig" ref="jedisPoolConfig"></property
            <property name="hostName" value="${redis.hostName}"></property
            <property name="port" value="${redis.port}"></property
            <property name="timeout" value="${redis.timeout}"></property
            <property name="usePool" value="${redis.usePool}"></property
        </bean
        <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
            <property name="connectionFactory" ref="jedisConnectionFactory"></property
            <property name="keySerializer"
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> 
            </property
            <property name="valueSerializer"
                <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> 
            </property
        </bean
    </beans>

    3)、applicationContext.xml

    spring的总配置文件,在里面假如一下的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
            <property name="ignoreResourceNotFound" value="true" />
            <property name="locations">
                <list>
     
                    <value>classpath*:/META-INF/config/redis.properties</value>
                </list>
            </property>
        </bean>
     
    <import resource="spring-redis.xml" />

    4)、web。xml

    设置spring的总配置文件在项目启动时加载

    1
    2
    3
    4
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/META-INF/applicationContext.xml</param-value><!--  -->
    </context-param>

    5)、redis缓存工具类

    ValueOperations  ——基本数据类型和实体类的缓存
    ListOperations     ——list的缓存
    SetOperations    ——set的缓存

    HashOperations  Map的缓存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.data.redis.core.BoundSetOperations;
    import org.springframework.data.redis.core.HashOperations;
    import org.springframework.data.redis.core.ListOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.SetOperations;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Service;
     
    @Service
    public class RedisCacheUtil<T>
    {
     
        @Autowired @Qualifier("jedisTemplate")
        public RedisTemplate redisTemplate;
     
        /**
         * 缓存基本的对象,Integer、String、实体类等
         * @param key    缓存的键值
         * @param value    缓存的值
         * @return        缓存的对象
         */
        public <T> ValueOperations<String,T> setCacheObject(String key,T value)
        {
     
            ValueOperations<String,T> operation = redisTemplate.opsForValue();
            operation.set(key,value);
            return operation;
        }
     
        /**
         * 获得缓存的基本对象。
         * @param key        缓存键值
         * @param operation
         * @return            缓存键值对应的数据
         */
        public <T> T getCacheObject(String key/*,ValueOperations<String,T> operation*/)
        {
            ValueOperations<String,T> operation = redisTemplate.opsForValue();
            return operation.get(key);
        }
     
        /**
         * 缓存List数据
         * @param key        缓存的键值
         * @param dataList    待缓存的List数据
         * @return            缓存的对象
         */
        public <T> ListOperations<String, T> setCacheList(String key,List<T> dataList)
        {
            ListOperations listOperation = redisTemplate.opsForList();
            if(null != dataList)
            {
                int size = dataList.size();
                for(int i = 0; i < size ; i ++)
                {
     
                    listOperation.rightPush(key,dataList.get(i));
                }
            }
     
            return listOperation;
        }
     
        /**
         * 获得缓存的list对象
         * @param key    缓存的键值
         * @return        缓存键值对应的数据
         */
        public <T> List<T> getCacheList(String key)
        {
            List<T> dataList = new ArrayList<T>();
            ListOperations<String,T> listOperation = redisTemplate.opsForList();
            Long size = listOperation.size(key);
     
            for(int i = 0 ; i < size ; i ++)
            {
                dataList.add((T) listOperation.leftPop(key));
            }
     
            return dataList;
        }
     
        /**
         * 缓存Set
         * @param key        缓存键值
         * @param dataSet    缓存的数据
         * @return            缓存数据的对象
         */
        public <T> BoundSetOperations<String,T> setCacheSet(String key,Set<T> dataSet)
        {
            BoundSetOperations<String,T> setOperation = redisTemplate.boundSetOps(key);   
            /*T[] t = (T[]) dataSet.toArray();
                 setOperation.add(t);*/
     
            Iterator<T> it = dataSet.iterator();
            while(it.hasNext())
            {
                setOperation.add(it.next());
            }
     
            return setOperation;
        }
     
        /**
         * 获得缓存的set
         * @param key
         * @param operation
         * @return
         */
        public Set<T> getCacheSet(String key/*,BoundSetOperations<String,T> operation*/)
        {
            Set<T> dataSet = new HashSet<T>();
            BoundSetOperations<String,T> operation = redisTemplate.boundSetOps(key);   
     
            Long size = operation.size();
            for(int i = 0 ; i < size ; i++)
            {
                dataSet.add(operation.pop());
            }
            return dataSet;
        }
     
        /**
         * 缓存Map
         * @param key
         * @param dataMap
         * @return
         */
        public <T> HashOperations<String,String,T> setCacheMap(String key,Map<String,T> dataMap)
        {
     
            HashOperations hashOperations = redisTemplate.opsForHash();
            if(null != dataMap)
            {
     
                for (Map.Entry<String, T> entry : dataMap.entrySet()) { 
     
                    /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  */
                    hashOperations.put(key,entry.getKey(),entry.getValue());
                }
     
            }
     
            return hashOperations;
        }
     
        /**
         * 获得缓存的Map
         * @param key
         * @param hashOperation
         * @return
         */
        public <T> Map<String,T> getCacheMap(String key/*,HashOperations<String,String,T> hashOperation*/)
        {
            Map<String, T> map = redisTemplate.opsForHash().entries(key);
            /*Map<String, T> map = hashOperation.entries(key);*/
            return map;
        }
     
        /**
         * 缓存Map
         * @param key
         * @param dataMap
         * @return
         */
        public <T> HashOperations<String,Integer,T> setCacheIntegerMap(String key,Map<Integer,T> dataMap)
        {
            HashOperations hashOperations = redisTemplate.opsForHash();
            if(null != dataMap)
            {
     
                for (Map.Entry<Integer, T> entry : dataMap.entrySet()) { 
     
                    /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  */
                    hashOperations.put(key,entry.getKey(),entry.getValue());
                }
     
            }
     
            return hashOperations;
        }
     
        /**
         * 获得缓存的Map
         * @param key
         * @param hashOperation
         * @return
         */
        public <T> Map<Integer,T> getCacheIntegerMap(String key/*,HashOperations<String,String,T> hashOperation*/)
        {
            Map<Integer, T> map = redisTemplate.opsForHash().entries(key);
            /*Map<String, T> map = hashOperation.entries(key);*/
            return map;
        }
    }

    6)、测试

    这里测试我是在项目启动的时候到数据库中查找出国家和城市的数据,进行缓存,之后将数据去出

    6.1  项目启动时缓存数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.stereotype.Service;
     
    import com.test.model.City;
    import com.test.model.Country;
    import com.zcr.test.User;
     
    /*
     * 监听器,用于项目启动的时候初始化信息
     */
    @Service
    public class StartAddCacheListener implements ApplicationListener<ContextRefreshedEvent>
    {
        //日志
        private final Logger log= Logger.getLogger(StartAddCacheListener.class);
     
        @Autowired
        private RedisCacheUtil<Object> redisCache;
     
        @Autowired
        private BrandStoreService brandStoreService;
     
        @Override
        public void onApplicationEvent(ContextRefreshedEvent  event)
        {
            //spring 启动的时候缓存城市和国家等信息
            if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext"))
            {
                System.out.println(" _________ 缓存数据 ________ ");
                List<City> cityList = brandStoreService.selectAllCityMessage();
                List<Country> countryList = brandStoreService.selectAllCountryMessage();
     
                Map<Integer,City> cityMap = new HashMap<Integer,City>();
     
                Map<Integer,Country> countryMap = new HashMap<Integer, Country>();
     
                int cityListSize = cityList.size();
                int countryListSize = countryList.size();
     
                for(int i = 0 ; i < cityListSize ; i ++ )
                {
                    cityMap.put(cityList.get(i).getCity_id(), cityList.get(i));
                }
     
                for(int i = 0 ; i < countryListSize ; i ++ )
                {
                    countryMap.put(countryList.get(i).getCountry_id(), countryList.get(i));
                }
     
                redisCache.setCacheIntegerMap("cityMap", cityMap);
                redisCache.setCacheIntegerMap("countryMap", countryMap);
            }
        }
     
    }

    6.2  获取缓存数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Autowired
        private RedisCacheUtil<User> redisCache;
     
        @RequestMapping("testGetCache")
        public void testGetCache()
        {
            /*Map<String,Country> countryMap = redisCacheUtil1.getCacheMap("country");
            Map<String,City> cityMap = redisCacheUtil.getCacheMap("city");*/
            Map<Integer,Country> countryMap = redisCacheUtil1.getCacheIntegerMap("countryMap");
            Map<Integer,City> cityMap = redisCacheUtil.getCacheIntegerMap("cityMap");
     
            for(int key : countryMap.keySet())
            {
                System.out.println("key = " + key + ",value=" + countryMap.get(key));
            }
     
            System.out.println("------------city");
            for(int key : cityMap.keySet())
            {
                System.out.println("key = " + key + ",value=" + cityMap.get(key));
            }
        }

    由于Spring在配置文件中配置的bean默认是单例的,所以只需要通过Autowired注入,即可得到原先的缓存类。

  • 相关阅读:
    经历:如何设置jquery easyui中下拉框不可编辑
    经历:easyui的layout自适应高度布局
    JavaScript高级程序设计(九):基本概念----函数
    JavaScript高级程序设计(九):基本概念----语句的特殊点
    JavaScript高级程序设计(八):基本概念--操作符
    JavaScript高级程序设计(三):基本概念:数据类型
    JavaScript高级程序设计(七):JavaScript中的in关键字
    JavaScript高级程序设计(六):关键字 void 和 delete 使用
    JavaScript高级程序设计(五): js的关键字instanceof和typeof使用
    SQL Server 存储过程
  • 原文地址:https://www.cnblogs.com/sharpest/p/10474434.html
Copyright © 2011-2022 走看看