向项目中添加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;
    }
    
}

 

posted @ 2020-04-07 13:29  听风的dog  阅读(2897)  评论(0编辑  收藏  举报