精品欧美一区二区三区在线观看 _久久久久国色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)

在线无限看免费粉色视频| 国产成人精品网站| 中文字幕人妻一区二区三区| 午夜激情电影在线播放| 久久久久久综合| 成人免费激情视频| 国产无遮挡又黄又爽| 欧美日韩爱爱| 欧美一级日韩不卡播放免费| 欧美 国产 综合| 黄色片免费在线观看| 成人一区二区三区中文字幕| xxxxx成人.com| 国产女人18毛片水真多18| 成人精品一区二区三区电影| 亚洲综合激情另类小说区| 日韩精品伦理第一区| www日本视频| 久久资源在线| 久久久久久久久久久成人| 日本人亚洲人jjzzjjz| 国产伦精品一区二区三区在线播放 | 国产伦精品一区二区三区四区免费| 亚洲精品国产无码| 精品动漫3d一区二区三区免费| 亚洲一区二区福利| 中国一级特黄录像播放| 国产视频一区二| 欧美色电影在线| 久久久999免费视频| 成人影院在线看| 中文字幕av一区二区三区| 国产综合第一页| www.99视频| 国产尤物一区二区| 欧洲亚洲免费视频| 日韩欧美三级在线观看| 国精品一区二区三区| 久久视频在线观看免费| 日本视频在线免费| 国产一区日韩| 亚洲视频在线播放| 日韩在线免费观看av| 日本精品影院| 亚洲国产精品系列| 中文字幕在线观看91| 日本精品在线播放| 日韩一区二区高清| 国产999免费视频| 久久国产精品美女| 欧美一级黄色片| 天天色天天综合网| 国产95亚洲| 欧美一区二区三区四区在线观看| 欧美性受xxxxxx黑人xyx性爽| 成人免费一区| 4438成人网| 五月天婷婷亚洲| 四虎视频在线精品免费网址| 51精品视频一区二区三区| 天天操精品视频| 中文字幕久久精品一区二区| 精品少妇一区二区三区免费观看 | 国产精品美女www爽爽爽| 神马影院一区二区| 日本免费视频在线观看| 亚洲视频每日更新| 天天想你在线观看完整版电影免费| 搞黄网站在线观看| 一区二区三区在线观看动漫| 国产日韩亚洲欧美在线| 国产99在线| 色8久久精品久久久久久蜜| 欧美黄色性生活| 精品99re| 日韩成人性视频| av电影网站在线观看| 久久在线视频免费观看| 欧美理论电影在线播放| 日韩免费一级片| 日韩制服丝袜先锋影音| 91久久在线观看| 欧美一级免费片| 国产欧美日韩激情| 免费在线精品视频| 久草在线资源站资源站| 欧美性猛交xxxx乱大交| 一区二区三区视频网| 亚洲3区在线| 亚洲区免费影片| 91高清免费看| 美女久久一区| 3d蒂法精品啪啪一区二区免费| 色窝窝无码一区二区三区成人网站| 久久综合给合久久狠狠狠97色69| 亚洲欧美国产一区二区| 欧美色图天堂| 欧美性生活大片视频| 日韩av成人网| 精品久久国产| 久久久视频在线| 中文字幕一区二区三区免费看| 国产成人在线观看免费网站| 欧美日韩国产精品一卡| 一二三四区在线观看| 色婷婷av一区二区三区大白胸 | 日韩在线免费高清视频| 国产精品自拍视频一区| 久久精品72免费观看| 久久波多野结衣| 成人免费网址| 欧美午夜宅男影院| a天堂视频在线观看| 欧美激情欧美| 日本精品久久久久久久| 黑人精品一区二区| 中文字幕一区二区三区视频| 久久国产色av免费观看| 老牛国内精品亚洲成av人片| 久久亚洲精品中文字幕冲田杏梨| 日本黄色一级视频| 不卡的av电影| www.激情网| 国产高清精品二区| 国产一区二区三区在线播放免费观看| 99免费在线观看| 国产精品综合视频| 一区二区三区av在线| 欧美最新精品| 日韩精品视频免费| 国产乡下妇女做爰| 国产91精品久久久久久久网曝门| 亚洲精品一区二区毛豆| 亚洲日本在线观看视频| 亚洲另类xxxx| 天天操天天操天天操天天| 成人国产精品免费观看视频| 狠狠精品干练久久久无码中文字幕| 亚洲综合av一区二区三区| 亚洲欧美精品中文字幕在线| 男女啊啊啊视频| 播五月开心婷婷综合| av在线免费观看国产| 日韩精品视频一区二区三区| 久久精品欧美视频| 91超薄丝袜肉丝一区二区| 国产精品全国免费观看高清 | 国产亚洲激情视频在线| 一级黄色在线视频| 久久久影视传媒| 又粗又黑又大的吊av| 色橹橹欧美在线观看视频高清| 97在线精品国自产拍中文| 日韩在线观看视频一区| 黄网站色欧美视频| 香蕉视频黄色在线观看| 免费日韩av| 欧美一区二区三区四区在线观看地址| 欧美91看片特黄aaaa| 亚洲人成网站777色婷婷| 中文字幕手机在线视频| 国产女同性恋一区二区| 五月天激情播播| 欧美一区免费| 国内一区在线| 欧美日韩不卡| www.亚洲天堂| 亚洲av综合色区无码一区爱av| 亚洲一区二区三区视频在线播放| a级片在线观看视频| 一本色道88久久加勒比精品| 欧美一区二区在线视频观看| 国产精品亚洲成在人线| 日韩一区二区三区国产| xxxx18国产| 欧美视频在线看| 无码人妻丰满熟妇啪啪欧美| 激情深爱一区二区| 国产伦精品一区二区三区四区视频_| 婷婷精品在线| 国产一区在线播放| 波多野结衣精品| 亚洲一区二区福利| www.av导航| 色香蕉成人二区免费| 婷婷社区五月天| av在线播放成人| 天天操,天天操| 亚洲免费播放| 中文字幕精品—区二区日日骚| 亚洲不卡在线| 日本在线精品视频| 91福利国产在线观看菠萝蜜| 日韩精品欧美国产精品忘忧草| 一级黄色片在线播放| 午夜亚洲福利老司机| 欧洲性xxxx| av成人动漫在线观看| 中文字幕第38页| 亚洲久久一区二区| 自拍视频一区二区三区| 神马午夜久久| 99久久综合狠狠综合久久止| 韩国精品主播一区二区在线观看| 欧美乱大交xxxxx| 国产区在线视频| 欧美精品一区二区在线观看| 亚洲天堂视频在线| 欧美性高潮床叫视频| 日韩高清dvd碟片| 国产欧美精品在线观看| 亚洲av人人澡人人爽人人夜夜| 久久se精品一区精品二区| www一区二区www免费| 欧美精品首页| 中文字幕欧美人与畜| 少妇一区二区视频| 精品一区二区不卡| 9999在线精品视频| 国产精品专区一| 在线观看精品| 91国产高清在线| 爱情岛论坛亚洲品质自拍视频网站| 久久久精品网站| 91大神在线网站| 国产小视频国产精品| 日韩精品视频在线观看一区二区三区| 日韩精品影音先锋| 国产偷拍一区二区| 欧美久久婷婷综合色| 中文字幕制服诱惑| 91国偷自产一区二区开放时间| 久久99精品波多结衣一区| 亚洲国产三级在线| 久久久美女视频| 亚洲午夜免费视频| 久久99久久98精品免观看软件 | 91精品国产91久久久久麻豆 主演| 羞羞答答成人影院www| 亚洲一区二区三区精品动漫| 精品九九在线| 在线视频亚洲自拍| 97久久视频| 男人的天堂成人| 在线中文字幕第一区| japanese在线播放| 欧美精品日韩| 男人添女荫道口女人有什么感觉| 欧美性久久久| 国产精品国产对白熟妇| 亚洲激情成人| 国模吧无码一区二区三区| 国产日韩一区二区三区在线| 午夜精品久久久久久久无码 | 日韩av电影手机在线| xxxxx性欧美特大| 国产成人久久精品| 欧美videos粗暴| 成人自拍性视频| 日韩中文字幕无砖| 国产精品日韩高清| 欧美激情15p| 日韩电影免费观看在| 色综合色综合| 日本中文字幕一级片| 亚洲激情另类| 日韩一级在线免费观看| 精品中文字幕一区二区小辣椒| 天天干天天曰天天操| 成人免费福利片| 男人操女人动态图| 国产精品久久久久久亚洲毛片| 免费在线黄色网| 亚洲r级在线视频| aaaaaa毛片| 91精品蜜臀在线一区尤物| 亚洲国产精品国自产拍久久| 日韩av在线导航| 高h视频在线| 欧美激情18p| 欧美色网在线| 亚洲japanese制服美女| 欧美调教网站| 亚洲国产精品毛片| 在线中文字幕第一区| 5月婷婷6月丁香| 韩国欧美一区二区| 一二三不卡视频| 成人欧美一区二区三区| 日韩精品一区二区三| 欧美色电影在线| 婷婷五月综合激情| 精品国产美女在线| 人在线成免费视频| 91精品综合视频| 九九综合在线| 美女黄色免费看| 麻豆视频观看网址久久| 中文字幕在线观看网址| 亚洲色图另类专区| 亚洲 欧美 中文字幕| 精品国产网站在线观看| av男人的天堂在线| 91sa在线看| jizz18欧美18| 在线观看日韩羞羞视频| 亚洲一区二区三区免费在线观看| 波多野结衣国产精品| 久久青草欧美一区二区三区| 久久久精品视频在线| 欧美日韩国产中文| 美国成人毛片| 午夜精品99久久免费| va天堂va亚洲va影视| 亚洲成人自拍| 久久九九99| 欧美成人三级伦在线观看| 亚洲精品中文在线影院| 一级片在线免费观看视频| 亚洲毛片在线免费观看| av3级在线| 99久久精品免费看国产一区二区三区| 久久国产电影| 色多多视频在线播放| 久久亚洲免费视频| 国产午夜视频在线| 欧美成人福利视频| 高清全集视频免费在线| 国产欧美精品一区二区| 沈樵精品国产成av片| 那种视频在线观看| 成人综合在线视频| 麻豆成人在线视频| 日韩一级大片在线观看| 麻豆传媒视频在线观看免费| 国产精品视频网址| 日韩国产一区| 国产wwwxx| 国产精品久久久久毛片软件| 亚洲无码久久久久久久| 中文字幕精品在线| 久久91视频| 伊人久久青草| 久久精品国产久精国产爱| 欧美福利在线视频| 欧美人体做爰大胆视频| 久久亚洲天堂| 亚洲xxxxx| 午夜精品久久久久99热蜜桃导演| 北条麻妃亚洲一区| 亚洲午夜av在线| 欧美 日韩 国产 在线| 高清一区二区三区日本久| 成人激情自拍| 国产 福利 在线| 国产欧美视频在线观看| 中文字幕第99页| 久久av红桃一区二区小说| 日本高清精品| 每日在线更新av| 国产亚洲欧洲一区高清在线观看| 中文字幕一区二区三区四区欧美| 正在播放亚洲1区| 久久久久久亚洲精品美女| av在线观看地址| 久久亚区不卡日本| 中文字幕永久在线观看| 久久综合电影一区| 懂色av一区二区| 无码人妻丰满熟妇区毛片| 国产精品女同互慰在线看| 国产超碰人人模人人爽人人添| 高清欧美性猛交xxxx| 少妇精品久久久一区二区三区| 国产欧美一区二| 亚洲成人精品一区| 福利在线播放| 99久久免费国| 肉肉av福利一精品导航| 成人免费精品动漫网站| 日韩激情在线视频| 欧美成人一二区| 99在线免费视频观看| 久久亚洲精华国产精华液| 国产裸体永久免费无遮挡| 性视频1819p久久| 日本不卡高清| 日本五十肥熟交尾| 欧美精品一二三区| 国产中文在线播放| 亚洲精品在线视频观看| 福利电影一区二区| 色综合色综合久久综合频道88| 99只有精品| 人人妻人人做人人爽| 亚洲国产成人自拍| 老牛影视av牛牛影视av| 国产精品久久中文| 亚洲九九精品| 少妇aaaaa|