zoukankan      html  css  js  c++  java
  • 向项目中添加redis缓存(整理)

    1.添加redis配置文件redis.properties

    redis.host=192.168.5.114
    
    redis.port=6379
    
    redis.maxIdle=100
    
    redis.maxTotal=200
    
    redis.maxWait=1000
    
    redis.testOnBorrow=false
    
    redis.timeout=10000

    2.添加redis.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"
        xmlns:p       = "http://www.springframework.org/schema/p"
        xmlns:context = "http://www.springframework.org/schema/context"
        xmlns:mvc     = "http://www.springframework.org/schema/mvc"
        xsi:schemaLocation = "
            http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
            <!-- redis -->
        
        
        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxIdle" value="${redis.maxIdle}" />
            <property name="maxWaitMillis" value="${redis.maxWait}" />
            <property name="testOnBorrow" value="${redis.testOnBorrow}" />
            <property name="maxTotal" value="${redis.maxTotal}" /> 
            <property name="blockWhenExhausted" value="true" /> 
        </bean>
        
        <!-- jedis连接工程的配置 -->
        <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
            <property name="hostName" value="${redis.host}" />
            <property name="port" value="${redis.port}" />
            <property name="poolConfig" ref="jedisPoolConfig" /> 
            <!-- <property name="password" value="${redis.password}" /> -->
            <property name="usePool" value="true"/> 
            <property name="timeout" value="${redis.timeout}"></property>
        </bean> 
    
        <!-- redisTemplate配置 -->
        <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">   
            <property name="connectionFactory"   ref="jedisConnectionFactory" />  
            <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="hashKeySerializer">     
               <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>     
            </property>   
            <property name="hashValueSerializer">   
               <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>     
            </property> 
         </bean> 
        
    </beans>

    3.添加拦截器

    <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/app/**/*.json*" />
                <bean class="com.censoft.app.main.ReadRedisHandlerInterceptor"/>  
            </mvc:interceptor> 
        </mvc:interceptors>

    4.借助RedisTemplate进行增删改查

    @Service
    public class RedisMainDao {
        
        @Resource(name="redisTemplate")
        private RedisTemplate<String, Object> redisTemplate;
        /**
         * 添加redis数据方法
         * @param key
         * @param value
         */
        public void addRedis(String key,String value){
             Object object = redisTemplate.opsForValue().get(key);
             if (object!=null) {
                 redisTemplate.delete(key);
            }
                redisTemplate.opsForValue().set(key, value);
        }
        /**
         * 添加redis临时数据方法
         * @param key
         * @param value
         * @param timeMin
         */
        public void addRedisTime(String key,String value,long timeMin){
             Object object = redisTemplate.opsForValue().get(key);
             if (object!=null) {
                 redisTemplate.delete(key);
            }
                redisTemplate.opsForValue().set(key, value,timeMin,TimeUnit.MINUTES);
            
        }
        /**
         * 获取redis数据方法
         * @param key
         */
        public String getRedis(String key){
            try {
                return (String) redisTemplate.opsForValue().get(key);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
            
            
        }
        
        /**
         * 获取redis数据方法
         */
        public List<HashMap<String, String>> getRedisList(String keyPath){
            List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
            Set<String> keys = redisTemplate.keys(keyPath+"*");
            
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                HashMap<String, String> map = new HashMap<String, String>();
                String key = it1.next();
                String value = getRedis(key);
                if(value.length()>100){
                    value = value.substring(0, 100)+"...";
                }
                map.put("key", key);
                map.put("value", value.replaceAll(" ", ""));
                list.add(map);
            }
            return list;
        }
        
        /**
         * 获取redis数据方法
         */
        public List<HashMap<String, String>> getRedisList_main(){
            
            List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
            List<String> lists = new ArrayList<String>();
            Set<String> keys = redisTemplate.keys("*");
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                HashMap<String, String> map = new HashMap<String, String>();
                String key = it1.next();
                int l = key.indexOf(":");
                if(l<0){
                    l = key.length();
                }
                String keyPath = key.substring(0, l);
                int n = lists.indexOf(keyPath);
                if(n>-1){
                    HashMap<String, String> map0 = list.get(n);
                    map0.put("count", (Integer.valueOf(map0.get("count"))+1)+"");
                }else{
                    lists.add(keyPath);
                    map.put("key", keyPath);
                    map.put("count", "1");
                    list.add(map);
                }
            }
            
            
            Collections.sort(list,new Comparator<HashMap<String, String>>(){  
                public int compare(HashMap<String, String> arg0, HashMap<String, String> arg1) {  
                    return arg0.get("key").compareTo(arg1.get("key"));  
                }
            }); 
            
            return list;
        }
        /**
         * 删除redis数据
         * @param key
         */
        public void removeRedis(String key){
            Set<String> keys = redisTemplate.keys(key+"*");
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                String keyd = it1.next();
                redisTemplate.delete(keyd);
            }
        }
        
        /**
         * 删除redis数据
         */
        public void removeRedisAllData(){
            Set<String> keys = redisTemplate.keys("*");
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                redisTemplate.delete(it1.next());
            }
        }
        
        public void removeRedisAllData(String index){
            Set<String> keys = redisTemplate.keys("*");
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                String key = it1.next();
                if(key.indexOf(index)>-1){
                    redisTemplate.delete(key);
                }
            }
        }
        
        
        /**
         * 刷新redis数据
         */
        public List<String> reloadRedisByKey(String urlPath,String keyPath){
            List<String> list = new ArrayList<String>();
            Set<String> keys = redisTemplate.keys(keyPath+"*");
            Iterator<String> it1 = keys.iterator();
            while (it1.hasNext()) {
                String key = it1.next().replaceAll(":", "?");
                String url = urlPath + key;
                if(url.indexOf("?")>-1){
                    url = url + "&clean=0";
                }else{
                    url = url + "?clean=0";
                }
                list.add(url);
            }
            return list;
        }
        
        public long  getReidsTime(String key){
            long min=redisTemplate.getExpire(key,TimeUnit.MINUTES);
            return min;
        }
        
    }

    5.完善拦截器类 ReadRedisHandlerInterceptor

    public class ReadRedisHandlerInterceptor extends HandlerMethodHandlerInterceptor {
    
    //    CenConf cenConf = new CenConf();
        private static final ThreadLocal<HashMap> LOCAL = new ThreadLocal<HashMap>();
        
        @Autowired
        private RedisMainDao rs;
        
        @Autowired
        private CensearchService censearchService;
        
        @Override
        protected boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler)
                throws Exception {
    //        HandlerMethod handlerMethod=(HandlerMethod) handler;
    //        String controller = handlerMethod.getBean().getClass().getName();//控制器全限定名
    //        String methodname = handlerMethod.getMethod().getName();//方法名
            
            String reqURL = request.getRequestURL().toString();
            
            HashMap<String, String> pramMap = parseRequest(request);
            String pram = pramMap.get("prams");
    //        System.out.println(reqURL+"?"+pram);
            String b = pramMap.get("clean");
            
            if(reqURL.indexOf("/app/qyfwb/")>-1){
                return true;
            }
            if(reqURL.indexOf("/app/qyfwb/")>-1){
                return true;
            }
            
            if(reqURL.indexOf("app/main/getMdsInfo.json")>-1){
                if(reqURL.contains("getMdsInfo.jsonp")){
                    b = "y";
                }else{
                    return true;
                }
            }
    
            String key = reqURL.substring(reqURL.indexOf("lyjj")+4,reqURL.length());
            if(!"".equals(pram)){
                key = key + ":" + pram;
            }
            if(reqURL.indexOf("/app/censearch/search")>-1){
                censearchService.insertLog(key);
            }
    //        System.out.println(key);
    //        if(true){
    //            rs.removeRedis(key);
    //            return true;
    //        }
            if("y".equals(b)){
                rs.removeRedis(key);
                String cleanValue = pramMap.get("cleanValue");
                if("nocache".equals(cleanValue)){
                    return true;
                }
                if("all".equals(cleanValue)){
                    rs.removeRedisAllData();
                }
                if("jsonp".equals(cleanValue)){
                    rs.removeRedisAllData("jsonp");
                }
            }
            
    //        System.out.println("key="+key);
            String jsonStr = rs.getRedis(key);
            if(jsonStr==null){
                HashMap<String, String> hm = new HashMap();
                hm.put("key", key);
                hm.put("isSave", "y");
                set(hm);
    //            System.out.println("没有缓存数据:"+key);
                return true;
            }else{
    //            System.out.println("直接返回:"+jsonStr);
                if(key.indexOf(".jsonp")>-1){
                    jsonStr = "("+jsonStr+")";
                    String functionName = pramMap.get("functionName");
                    if(!"".equals(functionName) && functionName!=null){
                        jsonStr = functionName + jsonStr;
                    }
                }
                JSONUtils.printString(jsonStr, response);
                return false;
            }
                
    //        System.out.println(controller+"/"+methodname+"/"+responseStrBuilder.toString ());
            
        }
        
        @Override
        protected void postHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler,
                ModelAndView modelAndView) throws Exception {
            // TODO Auto-generated method stub
            super.postHandle(request, response, handler, modelAndView);
            HashMap<String, String> hm = get();
            if(hm!=null){
                String isSave = hm.get("isSave");
                if("y".equals(isSave)){
                    String key = hm.get("key");
                    if(modelAndView==null){
                        System.out.println(key+"-----modelAndView==null");
                        return;
                    }else{
                        Map<String, Object> m = clMap(modelAndView.getModel());
                        String json = "";
                        try {
                            json = com.alibaba.druid.support.json.JSONUtils.toJSONString(m);
                            //json = json.replaceAll(":null", ":""");
                            //存redis
                            rs.addRedis(key, json);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    
                    
                }
            }
            
            
        }
        
        @Override
        protected void afterCompletion(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler,
                Exception ex) throws Exception {
            super.afterCompletion(request, response, handler, ex);
            
            set(null);
            
        }
        
        private static void set(HashMap hm){
            LOCAL.set(hm);
        }
    
        private static HashMap get(){
            return LOCAL.get();
        }
        
        private HashMap<String, String> parseRequest(HttpServletRequest request){
            HashMap<String, String> map = new HashMap<String, String>();
            String returnS = "";
            Map properties = request.getParameterMap();
            Iterator entries = properties.entrySet().iterator(); 
            Map.Entry entry; 
            String name = "";  
            String value = "";  
            String b = "n";
            String cleanValue = "";
            String functionName = "";
            while (entries.hasNext()) {
                entry = (Map.Entry) entries.next(); 
                name = (String) entry.getKey(); 
                if("_".equals(name)){
                    continue;
                }
                Object valueObj = entry.getValue(); 
                if(null == valueObj){ 
                    value = ""; 
                }else if(valueObj instanceof String[]){ 
                    String[] values = (String[])valueObj;
                    for(int i=0;i<values.length;i++){ 
                         value = values[i] + ",";
                    }
                    value = value.substring(0, value.length()-1);
                }else{
                    value = valueObj.toString();
                }
                if("callback".equals(name)){
                    map.put("functionName", value);
                    continue;
                }
                if("clean".equals(name)){
                    b = "y";
                    cleanValue = value;
                    continue;
                }
                returnS += "&"+name+"="+value;
            }
            
            //session  key为jd 时   拼上... 其他跳过
            Enumeration enumeration =request.getSession().getAttributeNames();
            while(enumeration.hasMoreElements()){
                String skey=enumeration.nextElement().toString();
                Object obj = request.getSession().getAttribute(skey);
                if(obj instanceof String){
                    String svalue = obj.toString();
                    if("jd".equals(skey)){
                        returnS += "&_"+skey+"="+svalue;
                    }else if(returnS.indexOf(skey)>-1){
                        continue;
                    }else{
                        continue;
                    }
                }
            }
            
            if(returnS.length()>0){
                returnS = returnS.substring(1,returnS.length());
            }
                    
            map.put("prams", returnS);
            map.put("clean", b);
            map.put("cleanValue", cleanValue);
            return map;
        }
        
        private Map<String, Object> clMap(Map<String, Object> map){
            for(Entry<String, Object> entry : map.entrySet()) {
                String key = entry.getKey();
                Object obj = entry.getValue();
                if("pagination".equals(key)){
                    Pagination page = (Pagination)obj;
                    HashMap hm = new HashMap();
                    hm.put("pageNum", page.getPageNum());
                    hm.put("pageSize", page.getPageSize());
                    hm.put("totalCount", page.getTotalCount());
                    hm.put("totalPages", page.getTotalPages());
                    map.put("pagination", hm);
                }else if("org.springframework.validation.BindingResult.pagination".equals(key) || "mapList".equals(map)){
                    map.remove(key);
                }else{
                    if(obj==null){
                        map.put(key, "");
                    }else{
                        if(obj instanceof List){
                            List<Object> list = (List<Object>) obj;
                            for(int i=0;i<list.size();i++){
                                Object o = list.get(i);
                                if(o instanceof Map){
                                    Map<String,Object> map0 = (Map<String, Object>) o;
                                    for(Entry<String, Object> entry0 : map0.entrySet()) {
                                        String key0 = entry0.getKey();
                                        Object value0 = entry0.getValue();
                                        if(value0==null){
                                            map0.put(key0, "");
                                        }
                                    }
                                }else if(o instanceof String){
                                    if(o==null){
                                        list.set(i, "");
                                    }
                                }else{
                                    System.out.println("未匹配类型.Object="+o);
                                }
                            }
                        }else if(obj instanceof Map){
                            Map<String,Object> map0 = (Map<String, Object>) obj;
                            for(Entry<String, Object> entry0 : map0.entrySet()) {
                                String key0 = entry0.getKey();
                                Object value0 = entry0.getValue();
                                if(value0==null){
                                    map0.put(key0, "");
                                }
                            }
                        }else{
                            
                        }
                    }
                }
            }
            return map;
        }
        
    }
  • 相关阅读:
    02
    循环语句的注意点
    unsigned/signed int/char类型表示的数值范围
    C程序设计语言(第二版)--- 习题选
    第一篇来自博客园的博客--哈哈希望大家点赞
    脆弱的GPS系统--摘抄《环球科学》
    【Python入门自学笔记专辑】——函数式编程
    c++标准库conio.h文件
    推荐几个配色和图标网站
    Ajax实现简单下拉选项
  • 原文地址:https://www.cnblogs.com/winddogg/p/12652854.html
Copyright © 2011-2022 走看看