zoukankan      html  css  js  c++  java
  • redis集成到Springmvc中及使用实例

    redis是现在主流的缓存工具了,因为使用简单、高效且对服务器要求较小,用于大数据量下的缓存

    spring也提供了对redis的支持: org.springframework.data.redis.core.RedisTemplate

    为了在springmvc环境中使用redis,官方推荐是和jedis结合使用,由jedis来管理连接这些

    首先进行整合配置

    1.properties文件

    #############Common Redis configuration
    cache.redis.maxIdle=5
    cache.redis.maxActive=20
    cache.redis.maxWait=1000
    cache.redis.testOnBorrow=true
    
    ##############Redis configuration
    cache.redis.host=127.0.0.1
    cache.redis.port=6379
    cache.redis.password=
    cache.redis.db=0
    cache.redis.timeout=2000
    
    
    ##############
    cache.cacheExpire=500

    2.xml配置文档

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    
        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="${cache.redis.maxActive}" />
            <property name="maxIdle" value="${cache.redis.maxIdle}" />
            <property name="maxWaitMillis" value="${cache.redis.maxWait}" />
            <property name="testOnBorrow" value="${cache.redis.testOnBorrow}" />
        </bean>
    
        <bean id="redisConnectionFactory"
            class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <property name="usePool" value="true"></property>
            <property name="hostName" value="${cache.redis.host}" />
            <property name="port" value="${cache.redis.port}" />
            <property name="password" value="${cache.redis.password}" />
            <property name="timeout" value="${cache.redis.timeout}" />
            <property name="database" value="${cache.redis.db}"></property>
            <constructor-arg index="0" ref="jedisPoolConfig" />
        </bean>
    
        <bean id="redisCache" class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="redisConnectionFactory" />
            <property name="keySerializer" ref="stringRedisSerializer" />
            <property name="valueSerializer" ref="stringRedisSerializer" />
            <property name="hashKeySerializer" ref="stringRedisSerializer" />
            <property name="hashValueSerializer" ref="stringRedisSerializer" />
        </bean>
    
        <bean id="stringRedisSerializer"
            class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </beans>

    3.使用实例之,存入到redis

    package net.zicp.xiaochangwei.web.cache;
    
    import java.util.List;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import net.zicp.xiaochangwei.web.dao.CityDao;
    import net.zicp.xiaochangwei.web.dao.FeedBackDao;
    import net.zicp.xiaochangwei.web.dao.HobbyDao;
    import net.zicp.xiaochangwei.web.dao.PhotoDao;
    import net.zicp.xiaochangwei.web.dao.RolePermissionDao;
    import net.zicp.xiaochangwei.web.dao.UserDao;
    import net.zicp.xiaochangwei.web.entity.City;
    import net.zicp.xiaochangwei.web.entity.Hobby;
    import net.zicp.xiaochangwei.web.entity.HobbyType;
    import net.zicp.xiaochangwei.web.entity.Permission;
    import net.zicp.xiaochangwei.web.entity.Photos;
    import net.zicp.xiaochangwei.web.entity.Role;
    import net.zicp.xiaochangwei.web.entity.UserInfo;
    import net.zicp.xiaochangwei.web.utils.Constant;
    import net.zicp.xiaochangwei.web.utils.NamedThreadFactory;
    
    import org.apache.commons.collections.CollectionUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    import com.alibaba.fastjson.JSON;
    
    /**
     * 
     * @author xiaochangwei
     * redis缓存变动较少的数据并定时刷新
     */
    @Component
    public class BasicDataCacheLoader implements InitializingBean, DisposableBean {
    
        private final Logger log = LoggerFactory.getLogger(this.getClass());
    
        protected static final int CORE_SIZE = Runtime.getRuntime().availableProcessors() * 2;
        
        @Value("${cache.cacheExpire}")
        private long cacheExpire;
    
        private ScheduledThreadPoolExecutor executor = null;
    
        @Autowired
        private RedisTemplate<String, String> redisCache;
        
        @Autowired
        private FeedBackDao feedBackDao;
    
        @Autowired
        private RolePermissionDao rolePermissionDao;
    
        @Autowired 
        private CityDao cityDao;
        
        @Autowired
        private HobbyDao hobbyDao;
        
        @Autowired
        private UserDao userDao;
        
        @Autowired
        private PhotoDao photoDao;
        
        
        @Override
        public void destroy() throws Exception {
            executor.shutdownNow();
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            
            executor = new ScheduledThreadPoolExecutor(CORE_SIZE, new NamedThreadFactory("static-info-loader"));
            RefreshCache refreshCache = new RefreshCache();
            refreshCache.run();
            executor.scheduleWithFixedDelay(refreshCache, cacheExpire, cacheExpire, TimeUnit.SECONDS);
            
        }
    
        private class RefreshCache implements Runnable {
            @Override
            public void run() {
                log.info("---开始刷新角色权限缓存-----");
                List<Role> roles = rolePermissionDao.getAllRole();
                if (CollectionUtils.isNotEmpty(roles)) {
                    for (Role role : roles) {
                        List<Permission> permissions = rolePermissionDao.getPermissionByRole(role.getRid());
                        role.setPermissions(permissions);
                        redisCache.opsForValue().set(Constant.ROLE + role.getRid(), JSON.toJSONString(role));
                    }
                }
                
                log.info("---开始刷新城市缓存-----");
                List<City> cityProvince = cityDao.getAllProvince();
                redisCache.opsForValue().set(Constant.CITY_ROOT, JSON.toJSONString(cityProvince));
                if (CollectionUtils.isNotEmpty(cityProvince)) {
                    for (City sheng : cityProvince) {
                        List<City> shis = cityDao.getCityByParentId(sheng.getCid());
                        sheng.setChildren(shis);
                        redisCache.opsForValue().set(Constant.CITY + sheng.getCid(), JSON.toJSONString(sheng));
                        if (CollectionUtils.isNotEmpty(shis)) {
                            for (City shi : shis) {
                                List<City> xians = cityDao.getCityByParentId(shi.getCid());
                                shi.setChildren(xians);
                                redisCache.opsForValue().set(Constant.CITY + shi.getCid(), JSON.toJSONString(shi));
                                for (City xian : xians) {
                                    redisCache.opsForValue().set(Constant.CITY + xian.getCid(), JSON.toJSONString(xian));
                                }
                            }
                        }
                    }
                }
                
                log.info("---开始刷新兴趣爱好缓存-----");
                List<HobbyType> allHobby = hobbyDao.getAllHobbys();
                if(CollectionUtils.isNotEmpty(allHobby)){
                    for(HobbyType ht : allHobby){
                        List<Hobby> hobbys = hobbyDao.getHobbyItems(ht.getHtId());
                        if(CollectionUtils.isNotEmpty(hobbys)){
                            ht.setHobbys(hobbys);
                        }
                        redisCache.opsForValue().set(Constant.HOBBY + ht.getHtId(), JSON.toJSONString(ht));
                    }
                }
                
                log.info("---开始刷新用户信息缓存-----");
                List<UserInfo> userinfos = userDao.getAllUserInfo();
                if(CollectionUtils.isNotEmpty(userinfos)){
                    for(UserInfo userInfo : userinfos){
                        List<Photos> photos = photoDao.getUserPhotos(userInfo.getUserId());
                        if(CollectionUtils.isNotEmpty(photos)){
                            userInfo.setPhotos(photos);
                        }
                        redisCache.opsForValue().set(Constant.USER_INFO + userInfo.getUserId(), JSON.toJSONString(userInfo));
                    }
                }
    
            }
        }
    }

    4.从redis中获取并解析为对象

    @Override
        public List<UserInfo> getUserInfoFromCache(int number) {
            Set<String> sets = redis.keys(Constant.USER_INFO + "*");
            Iterator<String> it = sets.iterator();
            List<UserInfo> result = new LinkedList<UserInfo>();
            int i = 0;
            while(it.hasNext() && i<number){
                String item = it.next();
                String value = redis.opsForValue().get(item);
                result.add(JSON.parseObject(value,UserInfo.class));
                i++;
            }
            return result;
        }
  • 相关阅读:
    Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
    PHP imagearc
    PHP imageantialias
    PHP imagealphablending
    PHP imageaffinematrixget
    PHP imageaffinematrixconcat
    空单元 | empty-cells (Miscellaneous Level 2)
    矩阵 | matrix() (Transforms)
    相邻兄弟选择器 | Adjacent sibling selectors (Selectors)
    相抵路径 | offset-path (Motion Path)
  • 原文地址:https://www.cnblogs.com/xiaochangwei/p/5875441.html
Copyright © 2011-2022 走看看