精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring中集成Ehcache使用頁(yè)面、對(duì)象緩存

開發(fā) 后端
Ehcache在很多項(xiàng)目中都出現(xiàn)過,用法也比較簡(jiǎn)單。一般的加些配置就可以了,而且Ehcache可以對(duì)頁(yè)面、對(duì)象、數(shù)據(jù)進(jìn)行緩存,同時(shí)支持集群/分布式緩存。如果整合Spring、Hibernate也非常的簡(jiǎn)單,Spring對(duì)Ehcache的支持也非常好。

Ehcache在很多項(xiàng)目中都出現(xiàn)過,用法也比較簡(jiǎn)單。一般的加些配置就可以了,而且Ehcache可以對(duì)頁(yè)面、對(duì)象、數(shù)據(jù)進(jìn)行緩存,同時(shí)支持集群/分布式緩存。如果整合Spring、Hibernate也非常的簡(jiǎn)單,Spring對(duì)Ehcache的支持也非常好。EHCache支持內(nèi)存和磁盤的緩存,支持LRU、LFU和FIFO多種淘汰算法,支持分布式的Cache,可以作為Hibernate的緩存插件。同時(shí)它也能提供基于Filter的Cache,該Filter可以緩存響應(yīng)的內(nèi)容并采用Gzip壓縮提高響應(yīng)速度。

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

一、準(zhǔn)備工作

如果你的系統(tǒng)中已經(jīng)成功加入Spring、Hibernate;那么你就可以進(jìn)入下面Ehcache的準(zhǔn)備工作。

1、 下載jar包

Ehcache 對(duì)象、數(shù)據(jù)緩存:http://ehcache.org/downloads/destination?name=ehcache-core-2.5.2-distribution.tar.gz&bucket=tcdistributions&file=ehcache-core-2.5.2-distribution.tar.gz

Web頁(yè)面緩存:http://ehcache.org/downloads/destination?name=ehcache-web-2.0.4-distribution.tar.gz&bucket=tcdistributions&file=ehcache-web-2.0.4-distribution.tar.gz

2、 需要添加如下jar包到lib目錄下

 ehcache-core-2.5.2.jar

ehcache-web-2.0.4.jar 主要針對(duì)頁(yè)面緩存

3、 當(dāng)前工程的src目錄中加入配置文件

 ehcache.xml

ehcache.xsd

這些配置文件在ehcache-core這個(gè)jar包中可以找到

二、Ehcache基本用法

  1. CacheManager cacheManager = CacheManager.create(); 
  2. // 或者 
  3. cacheManager = CacheManager.getInstance(); 
  4. // 或者 
  5. cacheManager = CacheManager.create("/config/ehcache.xml"); 
  6. // 或者 
  7. cacheManager = CacheManager.create("http://localhost:8080/test/ehcache.xml"); 
  8. cacheManager = CacheManager.newInstance("/config/ehcache.xml"); 
  9. // ....... 
  10.   
  11. // 獲取ehcache配置文件中的一個(gè)cache 
  12. Cache sample = cacheManager.getCache("sample"); 
  13. // 獲取頁(yè)面緩存 
  14. BlockingCache cache = new BlockingCache(cacheManager.getEhcache("SimplePageCachingFilter")); 
  15. // 添加數(shù)據(jù)到緩存中 
  16. Element element = new Element("key""val"); 
  17. sample.put(element); 
  18. // 獲取緩存中的對(duì)象,注意添加到cache中對(duì)象要序列化 實(shí)現(xiàn)Serializable接口 
  19. Element result = sample.get("key"); 
  20. // 刪除緩存 
  21. sample.remove("key"); 
  22. sample.removeAll(); 
  23.   
  24. // 獲取緩存管理器中的緩存配置名稱 
  25. for (String cacheName : cacheManager.getCacheNames()) { 
  26.     System.out.println(cacheName); 
  27. // 獲取所有的緩存對(duì)象 
  28. for (Object key : cache.getKeys()) { 
  29.     System.out.println(key); 
  30.   
  31. // 得到緩存中的對(duì)象數(shù) 
  32. cache.getSize(); 
  33. // 得到緩存對(duì)象占用內(nèi)存的大小 
  34. cache.getMemoryStoreSize(); 
  35. // 得到緩存讀取的命中次數(shù) 
  36. cache.getStatistics().getCacheHits(); 
  37. // 得到緩存讀取的錯(cuò)失次數(shù) 
  38. cache.getStatistics().getCacheMisses(); 

三、頁(yè)面緩存

頁(yè)面緩存主要用Filter過濾器對(duì)請(qǐng)求的url進(jìn)行過濾,如果該url在緩存中出現(xiàn)。那么頁(yè)面數(shù)據(jù)就從緩存對(duì)象中獲取,并以gzip壓縮后返回。其速度是沒有壓縮緩存時(shí)速度的3-5倍,效率相當(dāng)之高!其中頁(yè)面緩存的過濾器有CachingFilter,一般要擴(kuò)展filter或是自定義Filter都繼承該CachingFilter。

CachingFilter功能可以對(duì)HTTP響應(yīng)的內(nèi)容進(jìn)行緩存。這種方式緩存數(shù)據(jù)的粒度比較粗,例如緩存整張頁(yè)面。它的優(yōu)點(diǎn)是使用簡(jiǎn)單、效率高,缺點(diǎn)是不夠靈活,可重用程度不高。

EHCache使用SimplePageCachingFilter類實(shí)現(xiàn)Filter緩存。該類繼承自CachingFilter,有默認(rèn)產(chǎn)生cache key的calculateKey()方法,該方法使用HTTP請(qǐng)求的URI和查詢條件來(lái)組成key。也可以自己實(shí)現(xiàn)一個(gè)Filter,同樣繼承CachingFilter類,然后覆寫calculateKey()方法,生成自定義的key。

CachingFilter輸出的數(shù)據(jù)會(huì)根據(jù)瀏覽器發(fā)送的Accept-Encoding頭信息進(jìn)行Gzip壓縮。

在使用Gzip壓縮時(shí),需注意兩個(gè)問題:

1. Filter在進(jìn)行Gzip壓縮時(shí),采用系統(tǒng)默認(rèn)編碼,對(duì)于使用GBK編碼的中文網(wǎng)頁(yè)來(lái)說,需要將操作系統(tǒng)的語(yǔ)言設(shè)置為:zh_CN.GBK,否則會(huì)出現(xiàn)亂碼的問題。

2. 默認(rèn)情況下CachingFilter會(huì)根據(jù)瀏覽器發(fā)送的請(qǐng)求頭部所包含的Accept-Encoding參數(shù)值來(lái)判斷是否進(jìn)行Gzip壓縮。雖然IE6/7瀏覽器是支持Gzip壓縮的,但是在發(fā)送請(qǐng)求的時(shí)候卻不帶該參數(shù)。為了對(duì)IE6/7也能進(jìn)行Gzip壓縮,可以通過繼承CachingFilter,實(shí)現(xiàn)自己的Filter,然后在具體的實(shí)現(xiàn)中覆寫方法acceptsGzipEncoding。

具體實(shí)現(xiàn)參考:

  1. protected boolean acceptsGzipEncoding(HttpServletRequest request) { 
  2.  
  3. boolean ie6 = headerContains(request, "User-Agent""MSIE 6.0"); 
  4.  
  5. boolean ie7 = headerContains(request, "User-Agent""MSIE 7.0"); 
  6.  
  7. return acceptsEncoding(request, "gzip") || ie6 || ie7; 
  8.  

在ehcache.xml中加入如下配置

  1. <?xml version="1.0" encoding="gbk"?> 
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"
  3.     <diskStore path="java.io.tmpdir"/> 
  4.  
  5.     <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/> 
  6.     <!--  
  7.         配置自定義緩存 
  8.         maxElementsInMemory:緩存中允許創(chuàng)建的***對(duì)象數(shù) 
  9.         eternal:緩存中對(duì)象是否為***的,如果是,超時(shí)設(shè)置將被忽略,對(duì)象從不過期。 
  10.         timeToIdleSeconds:緩存數(shù)據(jù)的鈍化時(shí)間,也就是在一個(gè)元素消亡之前, 
  11.                     兩次訪問時(shí)間的***時(shí)間間隔值,這只能在元素不是***駐留時(shí)有效, 
  12.                     如果該值是 0 就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。 
  13.         timeToLiveSeconds:緩存數(shù)據(jù)的生存時(shí)間,也就是一個(gè)元素從構(gòu)建到消亡的***時(shí)間間隔值, 
  14.                     這只能在元素不是***駐留時(shí)有效,如果該值是0就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。 
  15.         overflowToDisk:內(nèi)存不足時(shí),是否啟用磁盤緩存。 
  16.         memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法。 
  17.     --> 
  18.     <cache name="SimplePageCachingFilter"  
  19.         maxElementsInMemory="10000"  
  20.         eternal="false" 
  21.         overflowToDisk="false"  
  22.         timeToIdleSeconds="900"  
  23.         timeToLiveSeconds="1800" 
  24.         memoryStoreEvictionPolicy="LFU" /> 
  25.  
  26. </ehcache> 

具體代碼:

  1. package com.hoo.ehcache.filter; 
  2.  
  3. import java.util.Enumeration; 
  4. import javax.servlet.FilterChain; 
  5. import javax.servlet.http.HttpServletRequest; 
  6. import javax.servlet.http.HttpServletResponse; 
  7. import net.sf.ehcache.CacheException; 
  8. import net.sf.ehcache.constructs.blocking.LockTimeoutException; 
  9. import net.sf.ehcache.constructs.web.AlreadyCommittedException; 
  10. import net.sf.ehcache.constructs.web.AlreadyGzippedException; 
  11. import net.sf.ehcache.constructs.web.filter.FilterNonReentrantException; 
  12. import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter; 
  13. import org.apache.commons.lang.StringUtils; 
  14. import org.apache.log4j.Logger; 
  15.  
  16. /** 
  17.  * <b>function:</b> mobile 頁(yè)面緩存過濾器 
  18.  * @author hoojo 
  19.  * @createDate 2012-7-4 上午09:34:30 
  20.  * @file PageEhCacheFilter.java 
  21.  * @package com.hoo.ehcache.filter 
  22.  * @project Ehcache 
  23.  * @blog http://blog.csdn.net/IBM_hoojo 
  24.  * @email hoojo_@126.com 
  25.  * @version 1.0 
  26.  */ 
  27. public class PageEhCacheFilter extends SimplePageCachingFilter { 
  28.  
  29.     private final static Logger log = Logger.getLogger(PageEhCacheFilter.class); 
  30.  
  31.     private final static String FILTER_URL_PATTERNS = "patterns"
  32.     private static String[] cacheURLs; 
  33.  
  34.     private void init() throws CacheException { 
  35.         String patterns = filterConfig.getInitParameter(FILTER_URL_PATTERNS); 
  36.         cacheURLs = StringUtils.split(patterns, ","); 
  37.     } 
  38.  
  39.     @Override 
  40.     protected void doFilter(final HttpServletRequest request, 
  41.             final HttpServletResponse response, final FilterChain chain) 
  42.             throws AlreadyGzippedException, AlreadyCommittedException, 
  43.             FilterNonReentrantException, LockTimeoutException, Exception { 
  44.         if (cacheURLs == null) { 
  45.             init(); 
  46.         } 
  47.  
  48.         String url = request.getRequestURI(); 
  49.         boolean flag = false
  50.         if (cacheURLs != null && cacheURLs.length > 0) { 
  51.             for (String cacheURL : cacheURLs) { 
  52.                 if (url.contains(cacheURL.trim())) { 
  53.                     flag = true
  54.                     break
  55.                 } 
  56.             } 
  57.         } 
  58.         // 如果包含我們要緩存的url 就緩存該頁(yè)面,否則執(zhí)行正常的頁(yè)面轉(zhuǎn)向 
  59.         if (flag) { 
  60.             String query = request.getQueryString(); 
  61.             if (query != null) { 
  62.                 query = "?" + query; 
  63.             } 
  64.             log.info("當(dāng)前請(qǐng)求被緩存:" + url + query); 
  65.             super.doFilter(request, response, chain); 
  66.         } else { 
  67.             chain.doFilter(request, response); 
  68.         } 
  69.     } 
  70.  
  71.     @SuppressWarnings("unchecked"
  72.     private boolean headerContains(final HttpServletRequest request, final String header, final String value) { 
  73.         logRequestHeaders(request); 
  74.         final Enumeration accepted = request.getHeaders(header); 
  75.         while (accepted.hasMoreElements()) { 
  76.             final String headerValue = (String) accepted.nextElement(); 
  77.             if (headerValue.indexOf(value) != -1) { 
  78.                 return true
  79.             } 
  80.         } 
  81.         return false
  82.     } 
  83.  
  84.     /** 
  85.      * @see net.sf.ehcache.constructs.web.filter.Filter#acceptsGzipEncoding(javax.servlet.http.HttpServletRequest) 
  86.      * <b>function:</b> 兼容ie6/7 gzip壓縮 
  87.      * @author hoojo 
  88.      * @createDate 2012-7-4 上午11:07:11 
  89.      */ 
  90.     @Override 
  91.     protected boolean acceptsGzipEncoding(HttpServletRequest request) { 
  92.         boolean ie6 = headerContains(request, "User-Agent""MSIE 6.0"); 
  93.         boolean ie7 = headerContains(request, "User-Agent""MSIE 7.0"); 
  94.         return acceptsEncoding(request, "gzip") || ie6 || ie7; 
  95.     } 
  96. 這里的PageEhCacheFilter繼承了SimplePageCachingFilter,一般情況下SimplePageCachingFilter就夠用了,這里是為了滿足當(dāng)前系統(tǒng)需求才做了覆蓋操作。使用SimplePageCachingFilter需要在web.xml中配置cacheName,cacheName默認(rèn)是SimplePageCachingFilter,對(duì)應(yīng)ehcache.xml中的cache配置。 
  97.  
  98. 在web.xml中加入如下配置 
  99.  
  100. <!-- 緩存、gzip壓縮核心過濾器 --> 
  101. <filter> 
  102.     <filter-name>PageEhCacheFilter</filter-name> 
  103.     <filter-class>com.hoo.ehcache.filter.PageEhCacheFilter</filter-class
  104.     <init-param> 
  105.         <param-name>patterns</param-name> 
  106.         <!-- 配置你需要緩存的url --> 
  107.         <param-value>/cache.jsp, product.action, market.action </param-value> 
  108.     </init-param> 
  109. </filter> 
  110. <filter-mapping> 
  111.     <filter-name>PageEhCacheFilter</filter-name> 
  112.     <url-pattern>*.action</url-pattern> 
  113. </filter-mapping> 
  114. <filter-mapping> 
  115.     <filter-name>PageEhCacheFilter</filter-name> 
  116.     <url-pattern>*.jsp</url-pattern> 
  117. </filter-mapping> 
  118. 當(dāng)***次請(qǐng)求這些頁(yè)面后,這些頁(yè)面就會(huì)被添加到緩存中,以后請(qǐng)求這些頁(yè)面將會(huì)從緩存中獲取。你可以在cache.jsp頁(yè)面中用小腳本來(lái)測(cè)試該頁(yè)面是否被緩存。<%=new Date()%>如果時(shí)間是變動(dòng)的,則表示該頁(yè)面沒有被緩存或是緩存已經(jīng)過期,否則則是在緩存狀態(tài)了。 
  119.  
  120. 四、對(duì)象緩存 
  121.  
  122. 對(duì)象緩存就是將查詢的數(shù)據(jù),添加到緩存中,下次再次查詢的時(shí)候直接從緩存中獲取,而不去數(shù)據(jù)庫(kù)中查詢。 
  123.  
  124. 對(duì)象緩存一般是針對(duì)方法、類而來(lái)的,結(jié)合Spring的Aop對(duì)象、方法緩存就很簡(jiǎn)單。這里需要用到切面編程,用到了Spring的MethodInterceptor或是用@Aspect。 
  125.  
  126. 代碼如下: 
  127.  
  128. package com.hoo.common.ehcache; 
  129.  
  130. import java.io.Serializable; 
  131. import net.sf.ehcache.Cache; 
  132. import net.sf.ehcache.Element; 
  133. import org.aopalliance.intercept.MethodInterceptor; 
  134. import org.aopalliance.intercept.MethodInvocation; 
  135. import org.apache.log4j.Logger; 
  136. import org.springframework.beans.factory.InitializingBean; 
  137.  
  138. /** 
  139.  * <b>function:</b> 緩存方法攔截器核心代碼  
  140.  * @author hoojo 
  141.  * @createDate 2012-7-2 下午06:05:34 
  142.  * @file MethodCacheInterceptor.java 
  143.  * @package com.hoo.common.ehcache 
  144.  * @project Ehcache 
  145.  * @blog http://blog.csdn.net/IBM_hoojo 
  146.  * @email hoojo_@126.com 
  147.  * @version 1.0 
  148.  */ 
  149. public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean { 
  150.  
  151.     private static final Logger log = Logger.getLogger(MethodCacheInterceptor.class); 
  152.  
  153.     private Cache cache; 
  154.  
  155.     public void setCache(Cache cache) { 
  156.         this.cache = cache; 
  157.     } 
  158.  
  159.     public void afterPropertiesSet() throws Exception { 
  160.         log.info(cache + " A cache is required. Use setCache(Cache) to provide one."); 
  161.     } 
  162.  
  163.     public Object invoke(MethodInvocation invocation) throws Throwable { 
  164.         String targetName = invocation.getThis().getClass().getName(); 
  165.         String methodName = invocation.getMethod().getName(); 
  166.         Object[] arguments = invocation.getArguments(); 
  167.         Object result; 
  168.  
  169.         String cacheKey = getCacheKey(targetName, methodName, arguments); 
  170.         Element element = null
  171.         synchronized (this) { 
  172.             element = cache.get(cacheKey); 
  173.             if (element == null) { 
  174.                 log.info(cacheKey + "加入到緩存: " + cache.getName()); 
  175.                 // 調(diào)用實(shí)際的方法 
  176.                 result = invocation.proceed(); 
  177.                 element = new Element(cacheKey, (Serializable) result); 
  178.                 cache.put(element); 
  179.             } else { 
  180.                 log.info(cacheKey + "使用緩存: " + cache.getName()); 
  181.             } 
  182.         } 
  183.         return element.getValue(); 
  184.     } 
  185.  
  186.     /** 
  187.      * <b>function:</b> 返回具體的方法全路徑名稱 參數(shù) 
  188.      * @author hoojo 
  189.      * @createDate 2012-7-2 下午06:12:39 
  190.      * @param targetName 全路徑 
  191.      * @param methodName 方法名稱 
  192.      * @param arguments 參數(shù) 
  193.      * @return 完整方法名稱 
  194.      */ 
  195.     private String getCacheKey(String targetName, String methodName, Object[] arguments) { 
  196.         StringBuffer sb = new StringBuffer(); 
  197.         sb.append(targetName).append(".").append(methodName); 
  198.         if ((arguments != null) && (arguments.length != 0)) { 
  199.             for (int i = 0; i < arguments.length; i++) { 
  200.                 sb.append(".").append(arguments[i]); 
  201.             } 
  202.         } 
  203.         return sb.toString(); 
  204.     } 

這里的方法攔截器主要是對(duì)你要攔截的類的方法進(jìn)行攔截,然后判斷該方法的類路徑+方法名稱+參數(shù)值組合的cache key在緩存cache中是否存在。如果存在就從緩存中取出該對(duì)象,轉(zhuǎn)換成我們要的返回類型。沒有的話就把該方法返回的對(duì)象添加到緩存中即可。值得主意的是當(dāng)前方法的參數(shù)和返回值的對(duì)象類型需要序列化。

我們需要在src目錄下添加applicationContext.xml完成對(duì)MethodCacheInterceptor攔截器的配置,該配置主意是注入我們的cache對(duì)象,哪個(gè)cache來(lái)管理對(duì)象緩存,然后哪些類、方法參與該攔截器的掃描。

添加配置如下:

  1. <context:component-scan base-package="com.hoo.common.interceptor"/>  
  2.  
  3. <!-- 配置eh緩存管理器 --> 
  4. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/> 
  5.  
  6. <!-- 配置一個(gè)簡(jiǎn)單的緩存工廠bean對(duì)象 --> 
  7. <bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"
  8.     <property name="cacheManager" ref="cacheManager" /> 
  9.     <!-- 使用緩存 關(guān)聯(lián)ehcache.xml中的緩存配置 --> 
  10.     <property name="cacheName" value="mobileCache" /> 
  11. </bean> 
  12.  
  13. <!-- 配置一個(gè)緩存攔截器對(duì)象,處理具體的緩存業(yè)務(wù) --> 
  14. <bean id="methodCacheInterceptor" class="com. hoo.common.interceptor.MethodCacheInterceptor"
  15.     <property name="cache" ref="simpleCache"/> 
  16. </bean> 
  17.  
  18. <!-- 參與緩存的切入點(diǎn)對(duì)象 (切入點(diǎn)對(duì)象,確定何時(shí)何地調(diào)用攔截器) --> 
  19. <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
  20.     <!-- 配置緩存aop切面 --> 
  21.     <property name="advice" ref="methodCacheInterceptor" /> 
  22.     <!-- 配置哪些方法參與緩存策略 --> 
  23.     <!--   
  24.         .表示符合任何單一字元                   
  25.         ###  +表示符合前一個(gè)字元一次或多次                   
  26.         ###  *表示符合前一個(gè)字元零次或多次                   
  27.         ###  \Escape任何Regular expression使用到的符號(hào)                   
  28.     -->                  
  29.     <!-- .*表示前面的前綴(包括包名) 表示print方法--> 
  30.     <property name="patterns"
  31.         <list> 
  32.             <value>com.hoo.rest.*RestService*\.*get.*</value> 
  33.             <value>com.hoo.rest.*RestService*\.*search.*</value> 
  34.         </list> 
  35.     </property> 
  36. </bean> 
  37. 在ehcache.xml中添加如下cache配置 
  38.  
  39. <cache name="mobileCache" 
  40.         maxElementsInMemory="10000" 
  41.         eternal="false" 
  42.         overflowToDisk="true" 
  43.         timeToIdleSeconds="1800" 
  44.         timeToLiveSeconds="3600" 
  45.         memoryStoreEvictionPolicy="LFU" /> 

原文鏈接:http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html

責(zé)任編輯:張偉 來(lái)源: 博客園
相關(guān)推薦

2014-12-31 09:45:48

EhCache

2023-02-14 07:47:20

SpringBootEhcache

2023-01-11 15:11:36

SpringEhcache

2022-03-15 08:22:31

Ehcachespring緩存

2009-06-01 16:18:30

SpringJPA集成

2021-09-26 05:02:00

緩存Ehcache用法

2009-06-11 13:28:18

Glassfish集成

2019-04-23 08:42:42

EhcacheMemcacheRedis

2009-09-21 17:23:49

Hibernate使用

2009-06-23 09:33:20

FCKEditorJSFJSP

2011-03-02 17:42:35

2025-01-26 00:00:40

Seata分布式事務(wù)

2012-02-01 15:53:03

JavaEhcache

2011-07-20 17:10:05

iPhone iAd

2021-02-17 21:04:03

Ehcache緩存Java

2011-11-16 10:46:33

Ehcache

2023-10-12 08:00:48

2015-12-28 10:48:44

RedisSpring緩存實(shí)例

2009-01-03 15:01:16

ibmdwLptus

2011-08-23 09:50:29

LuaPlusLua 腳本
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产91在线播放精品91| 国内不卡的二区三区中文字幕| 亚洲成色999久久网站| 免费av手机在线观看| 国产高中女学生第一次| 欧美日韩视频| 亚洲精品视频免费在线观看| 91精品国产91久久久久久| 日本熟妇人妻中出| 中国日本在线视频中文字幕| 狠狠色丁香久久婷婷综| 欧美国产日韩视频| 中文字幕日韩三级片| 亚洲成a人v欧美综合天堂麻豆| 亚洲色图网站| 欧美精品一区二区蜜臀亚洲| 毛片一区二区三区四区| 国产不卡精品视频| 国产日韩视频| 日韩视频一区二区三区在线播放 | 成人免费图片免费观看| 久久先锋资源网| 在线成人一区二区| 午夜诱惑痒痒网| 在线看的毛片| 国产999精品久久久久久| 26uuu另类亚洲欧美日本一 | 国产一区二区三区四区五区入口| 日韩av影视综合网| 天天干在线影院| 色呦呦在线播放| 久久久精品黄色| 91美女片黄在线观| 午夜在线观看一区| 欧美三级一区| 在线视频国内自拍亚洲视频| 成人综合电影| 免费在线不卡av| 伊人成年综合电影网| 欧美日本国产视频| 亚洲日本japanese丝袜| 在线观看国产区| 亚洲三级国产| 日韩性生活视频| 国产男女猛烈无遮挡a片漫画| 超碰在线网址| 国产欧美日韩卡一| 激情五月综合色婷婷一区二区| 紧身裙女教师波多野结衣| 国产亚洲精彩久久| 欧美日韩国产在线看| 国产女人水真多18毛片18精品 | 亚洲xxxxx性| 精品少妇一区二区三区密爱| 天堂av一区二区三区在线播放| 日韩一区二区三区av| 亚洲精品高清无码视频| 在线手机中文字幕| 亚洲成人动漫精品| 欧美大黑帍在线播放| 米奇精品一区二区三区| 久久久久久久久久久电影| 国内精品国语自产拍在线观看| 国产内射老熟女aaaa∵| 久久激五月天综合精品| 国产精品久久久久久久久粉嫩av| 黄色aaa视频| 国产综合色区在线观看| 国产亚洲精品7777| 国产极品精品在线观看| 国产精品酒店视频| 国产区精品区| 欧美人与禽zozo性伦| 久久国产亚洲精品无码| 黄色在线观看www| 午夜电影网一区| 精品国产一区三区| 亚洲私拍视频| 91福利国产成人精品照片| 亚洲看片网站| 国产一级片在线| 久久精品在这里| 日本一区免费观看| 久草视频免费播放| 蜜桃久久久久| 亚洲精品黄网在线观看| 3d动漫精品啪啪一区二区下载| 小说区图片区色综合区| 一本一本久久a久久精品综合小说| 日韩女同一区二区三区| 久久精品影视| 亚洲精品xxxx| 亚洲熟妇无码av| 视频一区中文| 日韩精品一区二区三区老鸭窝| 少妇极品熟妇人妻无码| 中文在线综合| 日韩乱码在线视频| 老司机福利在线观看| 亚洲天堂免费| 91国内在线视频| 国产99免费视频| 国内精品在线播放| 精品一区在线播放| 91大神xh98hx在线播放| 亚洲综合在线第一页| 欧美激情 国产精品| www.一区| 亚洲精品一区二区三区在线观看 | 在线观看成人黄色| 国产一区二区精彩视频| 狠狠色狠狠色综合日日tαg| 青青青国产精品一区二区| 国产女优在线播放| 国v精品久久久网| 日本午夜精品电影| 最新国产在线拍揄自揄视频| 99久久精品99国产精品| 午夜精品视频在线观看一区二区| 影音先锋男人资源在线| 色婷婷av一区| 中文字幕资源在线观看| 日韩伦理在线一区| 亚洲一卡二卡三卡四卡无卡久久| 人妻精品无码一区二区三区| av伦理在线| 欧美性受xxxx| 亚洲精品乱码久久| 日韩欧美中文| 欧美在线xxx| 99热这里只有精品9| 久久久久88色偷偷免费| 欧美精品一区二区性色a+v| 中文字幕在线看片| 精品国产精品一区二区夜夜嗨| 99热这里只有精品4| 久久xxxx| 欧美一区二区三区四区在线| 国产不卡精品视频| 国产精品你懂的在线欣赏| 精品视频第一区| caoporm免费视频在线| 色婷婷av一区二区| 人人妻人人澡人人爽人人精品| 欧美/亚洲一区| 欧美裸身视频免费观看| 波多野结衣av无码| 91视频一区二区三区| 99热久久这里只有精品| 视频一区日韩| 久久亚洲精品网站| 91麻豆国产在线| 欧美国产日韩精品免费观看| 男人天堂999| jazzjazz国产精品久久| 美女视频久久黄| 国产精品特级毛片一区二区三区| www国产亚洲精品久久麻豆| 日韩精品在线中文字幕| 香蕉免费一区二区三区在线观看 | 成人自拍爱视频| 婷婷在线播放| 日韩欧美国产不卡| 麻豆疯狂做受xxxx高潮视频| 激情综合色播五月| 亚洲人成77777| 国产精品99| 上原亚衣av一区二区三区| 中国a一片一级一片| 欧美国产97人人爽人人喊| 欧美大尺度做爰床戏| 大胆日韩av| 国产精品老牛影院在线观看| 91女主播在线观看| 91 com成人网| 九九热精彩视频| 国产麻豆91精品| 91国在线高清视频| 国产精品chinese在线观看| 日韩亚洲欧美综合| 美国黄色小视频| 国产成人精品免费网站| 黄色一级片在线看| 亚洲精华一区二区三区| 国产精品久久久久久久久影视| 91ph在线| 日韩写真欧美这视频| 久久无码精品丰满人妻| 福利一区二区在线| 午夜免费福利小电影| 国产91久久精品一区二区| 国产精品久久激情| 午夜老司机在线观看| 日韩亚洲欧美在线| 黄色片中文字幕| 国产精品国产三级国产三级人妇| 两性午夜免费视频| 亚洲韩日在线| 日韩亚洲欧美精品| 欧美一级片网址| 91成人在线播放| 一本一道波多野毛片中文在线 | 麻豆chinese极品少妇| 92国产精品观看| 亚洲最大天堂网| 日韩啪啪网站| 国产精品久久久久久久av电影| 中文字幕中文字幕在线中高清免费版 | 美女被啪啪一区二区| 电影亚洲一区| 欧美极品少妇xxxxⅹ免费视频| 欧美色视频免费| 欧美一区欧美二区| 黄色片中文字幕| 亚洲最大成人网4388xx| 免费福利视频网站| 国产精品18久久久久久久网站| 欧美一级二级三级| 成人黄色91| 国产精品久久二区| 不卡av影片| 97香蕉超级碰碰久久免费软件 | 中文字幕一区二区三区在线视频 | 亚洲在线观看视频| 久久精品黄色| 国产精品扒开腿做爽爽爽视频| 波多野一区二区| 欧美激情一二区| 在线免费观看a视频| 日韩最新在线视频| 91高清在线| 这里只有精品丝袜| 成人av电影观看| 国产午夜精品视频| 国产主播福利在线| 亚洲色图综合久久| 高清中文字幕一区二区三区| 亚洲精品在线观看www| 亚洲av成人精品毛片| 亚洲黄色免费三级| 天天射天天操天天干| 色噜噜狠狠色综合中国| 天天操夜夜操视频| 午夜精品一区二区三区三上悠亚| 国产一级二级三级视频| 亚洲一区二区视频在线观看| 国产一级特黄a高潮片| 亚洲影视在线观看| 国产极品美女高潮无套嗷嗷叫酒店| 亚洲已满18点击进入久久| 青青草手机在线视频| 一区二区三区不卡视频在线观看| 麻豆国产尤物av尤物在线观看| 一级日本不卡的影视| 国产精品99精品无码视| 午夜电影网一区| 国产免费av一区| 欧美午夜理伦三级在线观看| 亚洲一区二区激情| 日韩你懂的电影在线观看| 性生活黄色大片| 亚洲国产日韩欧美在线动漫| 欧洲毛片在线| 久久精品国产久精国产一老狼 | 五月激情丁香婷婷| 亚洲欧美日韩精品久久| 999免费视频| 精品久久久久久无| 黄色片在线看| 久久亚洲精品国产亚洲老地址| 黄色羞羞视频在线观看| 欧美一级高清免费播放| 91综合国产| 99se婷婷在线视频观看| 亚洲婷婷丁香| 一区二区三区电影| 狠狠爱成人网| 在线看的黄色网址| 国产成人av一区二区三区在线| 800av在线播放| 欧美激情一区三区| 国产小视频在线看| 欧美在线色视频| 国产成人精品亚洲精品色欲| 日韩av最新在线| 黄色的网站在线观看| 国语自产精品视频在免费| 成人免费黄色| 精品国产综合| 天天操综合网| 成熟老妇女视频| 国产乱国产乱300精品| 久久久久久亚洲中文字幕无码| 亚洲三级电影全部在线观看高清| 少妇一级淫片免费放中国| 欧美日本一区二区| 亚洲欧洲精品视频| 插插插亚洲综合网| 欧美片第1页| 国产精品伊人日日| 国产精品久久久久无码av| 黄色片视频在线免费观看| 国产综合色在线| 日本少妇xxxxx| 亚洲图片欧美综合| 国产精品一二三四五区| 亚洲美女av黄| 不卡av免费观看| 92福利视频午夜1000合集在线观看| 人妖一区二区三区| 国产精品av免费观看| 精品制服美女久久| 永久免费毛片在线观看| 精品久久久久久久久久ntr影视| 国产成人久久精品77777综合| 在线视频日韩精品| 亚洲国产福利| 韩国成人av| 欧美日韩国产探花| www.成年人| 国产精品视频一二三| 五月天婷婷导航| 日韩国产在线播放| 波多野结衣精品| 国产精品v欧美精品v日韩精品| 国产精品久久久久久久| 日韩一级免费片| 中文子幕无线码一区tr| 日韩 国产 欧美| 亚洲精品一区二区在线| 涩涩网在线视频| 精品一区二区国产| 一区二区自拍| 国产a√精品区二区三区四区| 91在线精品一区二区三区| 久久免费视频精品| 精品福利一区二区三区| 激情av在线| 国产精品乱码视频| 在线视频观看日韩| 99久久人妻精品免费二区| 午夜精品在线视频一区| 四虎在线观看| 日本一区二区三区在线播放| 欧美**字幕| 美女网站视频黄色| 国产精品久久久久久久岛一牛影视| 亚洲视频一区二区三区四区| www.欧美免费| 美女精品久久| 91成人综合网| 91蝌蚪国产九色| 中文字幕免费观看| 中文字幕视频在线免费欧美日韩综合在线看| 蜜桃精品在线| 一区二区三区一级片| 国产精品一区一区三区| 国产真实乱人偷精品视频| 亚洲成人av在线| 第84页国产精品| 亚洲精品一区二区三区av| 国产一区二区中文字幕| 国产一级中文字幕| 亚洲精品午夜精品| yy6080久久伦理一区二区| 久久精品在线免费视频| 日韩精品一级中文字幕精品视频免费观看| 黄色录像a级片| 91激情五月电影| 黄视频网站在线| 国产欧美丝袜| 日韩中文字幕麻豆| 91香蕉视频网| 精品国产91久久久久久久妲己| 特黄毛片在线观看| 在线不卡视频一区二区| 国产ts人妖一区二区| 国产九色在线播放九色| 在线看片第一页欧美| 欧一区二区三区| 欧美亚洲日本在线观看| 一个色综合网站| 国产黄色免费在线观看| 亚洲最大福利网| 日韩精品视频网| 久久久久久福利| 一区二区在线视频播放| 日本精品视频| 精品免费国产一区二区| 一区二区三区久久| 激情小说 在线视频| 99久久久精品免费观看国产| 三级久久三级久久久| 国产精品9191| 久久亚洲国产精品| 欧美系列电影免费观看| 影音先锋人妻啪啪av资源网站| 91 com成人网| 日韩一区二区三区在线免费观看 | 国产污视频在线观看|