日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Cache和EhCache實現(xiàn)緩存管理方式

瀏覽:358日期:2023-07-10 13:01:05
目錄1、認(rèn)識 Spring Cache2、認(rèn)識 EhCache3、創(chuàng)建SpringBoot與MyBatis的整合項目3.1 創(chuàng)建數(shù)據(jù)表3.2 創(chuàng)建項目4、配置EhCache緩存管理器4.1 創(chuàng)建 ehcache.xml 配置文件4.2 配置緩存管理器4.3 開啟緩存功能5、使用EhCache實現(xiàn)緩存管理5.1 創(chuàng)建實體類(Entity層)5.2 數(shù)據(jù)庫映射層(Mapper層)5.3 業(yè)務(wù)邏輯層(Service層)5.4 控制器方法(Controller層)5.5 顯示頁面(View層)1、認(rèn)識 Spring Cache

Spring Cache是Spring提供的一整套緩存解決方案。它本身并不提供緩存實現(xiàn),而是提供統(tǒng)一的接口和代碼規(guī)范、配置、注解等,以便整合各種Cache方案,使用戶不用關(guān)心Cache的細(xì)節(jié)。

Spring支持“透明”地向應(yīng)用程序添加緩存,將緩存應(yīng)用于方法,在方法執(zhí)行前檢查緩存中是否有可用的數(shù)據(jù)。這樣可以減少方法執(zhí)行的次數(shù),同時提高響應(yīng)的速度。緩存的應(yīng)用方式“透明”,不會對調(diào)用者造成任何干擾。只要通過注解@EnableCaching啟用了緩存支持,Spring Boot就會自動處理好緩存的基礎(chǔ)配置。

Spring Cache作用在方法上。當(dāng)調(diào)用一個緩存方法時,會把該方法參數(shù)和返回結(jié)果作為一個“鍵值對”(key / value)存放在緩存中,下次用同樣的參數(shù)來調(diào)用該方法時將不再執(zhí)行該方法,而是直接從緩存中獲取結(jié)果進(jìn)行返回。所以在使用Spring Cache時,要保證在緩存的方法和方法參數(shù)相同時返回相同的結(jié)果。

Spring Boot提供的聲明式緩存(cache)注解,如下表:

注解 說明 @EnableCaching 開啟緩存。 @Cacheable 可以作用在類和方法上,以鍵值對的方式緩存類或方法的返回值。 @CachePut 方法被調(diào)用,然后結(jié)果被緩存。 @CacheEvict 清空緩存。 @Caching 用來組合多個注解標(biāo)簽。 2、認(rèn)識 EhCache

Spring Boot支持多種不同的緩存產(chǎn)品。在默認(rèn)情況下使用的是簡單緩存,不建議在正式環(huán)境中使用。我們可以配置一些更加強(qiáng)大的緩存,比如Ehcache。

Ehcache是一種廣泛使用的開源Java分布式緩存,它具有內(nèi)存和磁盤存儲、緩存加載器、緩存擴(kuò)展、緩存異常處理、GZIP緩存、Servlet 過濾器,以及支持 REST 和 SOAP API 等特點(diǎn)。

3、創(chuàng)建SpringBoot與MyBatis的整合項目

【實例】創(chuàng)建SpringBoot與MyBatis的整合項目,實現(xiàn)用戶信息的查詢、新增、修改、刪除功能。并使用 Spring Cache 和 EhCache 實現(xiàn)緩存管理,執(zhí)行結(jié)果如下圖:

Spring Cache和EhCache實現(xiàn)緩存管理方式

3.1 創(chuàng)建數(shù)據(jù)表

在MySQL數(shù)據(jù)庫中創(chuàng)建用戶信息表(tb_user),并添加數(shù)據(jù)。

-- 判斷數(shù)據(jù)表是否存在,存在則刪除DROP TABLE IF EXISTS tb_user; -- 創(chuàng)建“用戶信息”數(shù)據(jù)表CREATE TABLE IF NOT EXISTS tb_user( user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT ’用戶編號’,user_name VARCHAR(50) NOT NULL COMMENT ’用戶姓名’,age INT DEFAULT(0) NOT NULL COMMENT ’年齡’,blog_url VARCHAR(50) NOT NULL COMMENT ’博客地址’,blog_remark VARCHAR(50) COMMENT ’博客信息’) COMMENT = ’用戶信息表’; -- 添加數(shù)據(jù)INSERT INTO tb_user(user_name,age,blog_url,blog_remark) VALUES(’pan_junbiao的博客’,32,’https://blog.csdn.net/pan_junbiao’,’您好,歡迎訪問 pan_junbiao的博客’);3.2 創(chuàng)建項目

(1)創(chuàng)建SpringBoot項目,項目結(jié)構(gòu)如下圖:

Spring Cache和EhCache實現(xiàn)緩存管理方式

(2)添加pom.xml配置信息

在pom.xml配置文件中添加MyBatis、 MySQL的JDBC數(shù)據(jù)庫驅(qū)動、Spring Boot 緩存支持啟動器、Ehcache 緩存等。

<!-- MyBatis與SpringBoot整合依賴 --><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency> <!-- MySQL的JDBC數(shù)據(jù)庫驅(qū)動 --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version></dependency> <!-- 引入Thymeleaf模板引擎 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> <!-- Spring Boot緩存支持啟動器 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> <version>2.3.2.RELEASE</version></dependency> <!-- Ehcache緩存管理器 --><dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId></dependency>

(3)配置相關(guān)信息

將默認(rèn)的application.properties文件的后綴修改為“.yml”,即配置文件名稱為:application.yml,并配置以下信息:

#Spring配置spring: #緩存管理器 cache: type: ehcache ehcache: config: classpath:ehcache.xml #緩存加載配置文件 #使用Thymeleaf模板引擎 thymeleaf: mode: HTML5 encoding: UTF-8 cache: false #使用Thymeleaf模板引擎,關(guān)閉緩存 servlet: content-type: text/html #DataSource數(shù)據(jù)源 datasource: url: jdbc:mysql://localhost:3306/db_admin?useSSL=false&amp username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver #MyBatis配置mybatis: type-aliases-package: com.pjb.entity #別名定義 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定 MyBatis 所用日志的具體實現(xiàn),未指定時將自動查找 map-underscore-to-camel-case: true #開啟自動駝峰命名規(guī)則(camel case)映射 lazy-loading-enabled: true #開啟延時加載開關(guān) aggressive-lazy-loading: false #將積極加載改為消極加載(即按需加載),默認(rèn)值就是false #lazy-load-trigger-methods: '' #阻擋不相干的操作觸發(fā),實現(xiàn)懶加載 cache-enabled: true #打開全局緩存開關(guān)(二級環(huán)境),默認(rèn)值就是true4、配置EhCache緩存管理器4.1 創(chuàng)建 ehcache.xml 配置文件

在 resources (資源目錄)下,創(chuàng)建 ehcache.xml 配置文件,配置信息如下:

<ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='../config/ehcache.xsd'> <!-- 這個是磁盤存儲路徑,當(dāng)內(nèi)存緩存滿了的時候,就會往這里面放, java.io.tmdir是操作系統(tǒng)緩存的臨時目錄,不同操作系統(tǒng)緩存目錄不一樣 --> <diskStore path='java.io.tmpdir'/> <!--defaultCache:echcache的默認(rèn)緩存策略 --> <defaultCache maxElementsInMemory='10000' eternal='false' timeToIdleSeconds='120' timeToLiveSeconds='120' maxElementsOnDisk='10000000' diskExpiryThreadIntervalSeconds='120' memoryStoreEvictionPolicy='LRU'><persistence strategy='localTempSwap'/> </defaultCache> <cache name='userCache' maxElementsInMemory='10000' eternal='false' timeToIdleSeconds='120' timeToLiveSeconds='120' maxElementsOnDisk='10000000' diskExpiryThreadIntervalSeconds='120' memoryStoreEvictionPolicy='LRU'><persistence strategy='localTempSwap'/> </cache></ehcache>

配置屬性說明:

屬性 說明 <diskStore path='java.io.tmpdir'/> 這個是磁盤存儲路徑,當(dāng)內(nèi)存緩存滿了的時候,就會往這里面放,java.io.tmdir是操作系統(tǒng)緩存的臨時目錄,不同操作系統(tǒng)緩存目錄不一樣。 maxElementsInMemory 內(nèi)存緩存中最多可以存放的元素數(shù)量,若放入Cache中的元素超過這個數(shù)值,則有以下兩種情況: (1)若 overflowToDisk=true,則會將Cache中多出的元素放入磁盤文件中。 (2)若 overflowToDisk=false,則根據(jù)memoryStoreEvictionPolicy策略替換Cache中原有的元素。 overflowToDisk 內(nèi)存不足時,是否啟用磁盤緩存。 eternal 緩存中對象是否永久有效。 timeToIdleSeconds 緩存數(shù)據(jù)在失效前的允許閑置時間(單位:秒),僅當(dāng) eternal=false 時使用,默認(rèn)值是0表示可閑置時間無窮大,若超過這個時間沒有訪問此Cache中的某個元素,那么此元素將被從Cache中清除。 timeToLiveSeconds 緩存數(shù)據(jù)的總的存活時間(單位:秒),僅當(dāng) eternal=false 時使用,從創(chuàng)建開始計時,失效結(jié)束。 maxElementsOnDisk 磁盤緩存中最多可以存放的元素數(shù)量,0表示無窮大。 diskExpiryThreadIntervalSeconds 磁盤緩存的清理線程運(yùn)行間隔,默認(rèn)是120秒。 memoryStoreEvictionPolicy 內(nèi)存存儲與釋放策略,即達(dá)到 maxElementsInMemory 限制時,Ehcache會根據(jù)指定策略清理內(nèi)存,共有三種策略,分別為LRU(最近最少使用)、LFU(最常用的)、FIFO(先進(jìn)先出)。 defaultCache 默認(rèn)緩存方式。 cache 自定義的緩存方式,自行設(shè)置 name。 4.2 配置緩存管理器

在 application.yml 配置文件中配置目標(biāo)緩存管理器,支持 Ehcache、Generic、Redis、Jcache等。這里配置使用Ehcache。

#Spring配置spring: #緩存管理器 cache: type: ehcache ehcache: config: classpath:ehcache.xml #緩存加載配置文件4.3 開啟緩存功能

在SpringBoot項目啟動入口類中添加注解@EnableCaching,開啟緩存功能。

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication@EnableCachingpublic class SpringcacheDemoApplication{ public static void main(String[] args) {SpringApplication.run(SpringcacheDemoApplication.class, args); }}5、使用EhCache實現(xiàn)緩存管理5.1 創(chuàng)建實體類(Entity層)

在com.pjb.entity包中,創(chuàng)建UserInfo類(用戶信息實體類)。

package com.pjb.entity; import java.io.Serializable; /** * 用戶信息實體類 * @author pan_junbiao **/public class UserInfo implements Serializable{ private int userId; //用戶編號 private String userName; //用戶姓名 private int age; //年齡 private String blogUrl; //博客地址 private String blogRemark; //博客信息 //省略getter與setter方法...}

注意:實體類必須實現(xiàn) Serializable 接口,否則無法實現(xiàn)緩存功能。

5.2 數(shù)據(jù)庫映射層(Mapper層)

在com.pjb.mapper包中,創(chuàng)建UserMapper接口(用戶信息Mapper動態(tài)代理接口)。

package com.pjb.mapper; import com.pjb.entity.UserInfo;import org.apache.ibatis.annotations.*;import org.springframework.stereotype.Repository; /** * 用戶信息Mapper動態(tài)代理接口 * @author pan_junbiao **/@Mapper@Repositorypublic interface UserMapper{ /** * 根據(jù)用戶ID,獲取用戶信息 */ @Select('SELECT * FROM tb_user WHERE user_id = #{userId}') public UserInfo getUserById(int userId); /** * 新增用戶,并獲取自增主鍵 */ @Insert('INSERT INTO tb_user(user_name,age,blog_url,blog_remark) VALUES(#{userName},#{age},#{blogUrl},#{blogRemark});') @Options(useGeneratedKeys = true, keyColumn = 'user_id', keyProperty = 'userId') public int insertUser(UserInfo userInfo); /** * 修改用戶 */ @Update('UPDATE tb_user SET user_name = #{userName} ,age = #{age} ,blog_url = #{blogUrl} ,blog_remark = #{blogRemark} WHERE user_id = #{userId}') public int updateUser(UserInfo userInfo); /** * 刪除用戶 */ @Delete('DELETE FROM tb_user WHERE user_id = #{userId}') public int deleteUser(int userId);}5.3 業(yè)務(wù)邏輯層(Service層)

在com.pjb.service包下,創(chuàng)建UserService接口(用戶信息業(yè)務(wù)邏輯接口)。

package com.pjb.service; import com.pjb.entity.UserInfo; /** * 用戶信息業(yè)務(wù)邏輯接口 * @author pan_junbiao **/public interface UserService{ /** * 根據(jù)用戶ID,獲取用戶信息 */ public UserInfo getUserById(int userId); /** * 新增用戶,并獲取自增主鍵 */ public UserInfo insertUser(UserInfo userInfo); /** * 修改用戶 */ public UserInfo updateUser(UserInfo userInfo); /** * 刪除用戶 */ public int deleteUser(int userId);}

在com.pjb.service.impl包下,創(chuàng)建UserServiceImpl類(用戶信息業(yè)務(wù)邏輯類)。

package com.pjb.service.impl; import com.pjb.entity.UserInfo;import com.pjb.mapper.UserMapper;import com.pjb.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheConfig;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service; /** * 用戶信息業(yè)務(wù)邏輯類 * @author pan_junbiao **///注意:必須對應(yīng)配置文件ehcache.xml中cache節(jié)點(diǎn)的name屬性值//@CacheConfig(cacheNames = 'userCache')@Servicepublic class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; //注意:必須對應(yīng)配置文件ehcache.xml中cache節(jié)點(diǎn)的name屬性值 private static final String CACHE_NAME = 'userCache'; /** * 根據(jù)用戶ID,獲取用戶信息 */ @Override @Cacheable(value = CACHE_NAME, key = '#userId') public UserInfo getUserById(int userId) {return userMapper.getUserById(userId); } /** * 新增用戶,并獲取自增主鍵 */ @Override @CachePut(value = CACHE_NAME, key = '#userInfo.userId') public UserInfo insertUser(UserInfo userInfo) {userMapper.insertUser(userInfo);return userInfo; } /** * 修改用戶 */ @Override @CachePut(value = CACHE_NAME, key = '#userInfo.userId') public UserInfo updateUser(UserInfo userInfo) {userMapper.updateUser(userInfo);return userInfo; } /** * 刪除用戶 */ @Override @CacheEvict(value = CACHE_NAME, key = '#userId') public int deleteUser(int userId) {return userMapper.deleteUser(userId); }}

從上述代碼可以看出,查詢用戶的方法使用了 @Cacheable 注解來開啟緩存。添加和修改方法使用了 @CachePut 注解,它是先處理方法,然后把結(jié)果進(jìn)行緩存的。要想刪除數(shù)據(jù),則需要使用 @CacheEvict 注解來清空緩存。

@CacheConfig注解:如果所有的 @Cacheable() 里面都有一個 value=“xxx” 的屬性,這顯然如果方法多了,寫起來也是挺累的,如果可以一次性聲明完 那就省事了,所以有了 @CacheConfig 這個配置,@CacheConfig is a class-level annotation that allows to share the cache names,如果你在方法寫別的名字,那么依然以方法的名字為準(zhǔn)。

5.4 控制器方法(Controller層)

在com.pjb.controller包中,創(chuàng)建UserController類(用戶控制器),實現(xiàn)用戶數(shù)據(jù)的查詢、新增、修改、刪除,并實現(xiàn)數(shù)據(jù)的返回。

package com.pjb.controller; import com.pjb.entity.UserInfo;import com.pjb.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView; /** * 用戶信息控制器 * @author pan_junbiao **/@Controller@RequestMapping('/user')public class UserController{ @Autowired private UserService userService; /** * 獲取用戶信息 */ @RequestMapping('getUserById') public ModelAndView getUserById(int userId) {//根據(jù)用戶ID,獲取用戶信息UserInfo userInfo = userService.getUserById(userId); if(userInfo==null){ userInfo = new UserInfo();} //返回結(jié)果ModelAndView modelAndView = new ModelAndView();modelAndView.addObject('userInfo',userInfo);modelAndView.setViewName('/user-info.html');return modelAndView; } /** * 新增用戶 */ @ResponseBody @RequestMapping('insertUser') public boolean insertUser() {//創(chuàng)建新用戶UserInfo userInfo = new UserInfo();userInfo.setUserName('pan_junbiao的博客');userInfo.setAge(32);userInfo.setBlogUrl('https://blog.csdn.net/pan_junbiao');userInfo.setBlogRemark('您好,歡迎訪問 pan_junbiao的博客'); //執(zhí)行新增方法userService.insertUser(userInfo); //返回結(jié)果return userInfo.getUserId() > 0 ? true : false; } /** * 修改用戶 */ @ResponseBody @RequestMapping('updateUser') public boolean updateUser(int userId) {UserInfo userInfo = new UserInfo();userInfo.setUserId(userId);userInfo.setUserName('pan_junbiao的博客_02');userInfo.setAge(35);userInfo.setBlogUrl('https://blog.csdn.net/pan_junbiao');userInfo.setBlogRemark('您好,歡迎訪問 pan_junbiao的博客'); //執(zhí)行修改方法userService.updateUser(userInfo); //返回結(jié)果return true; } /** * 刪除用戶 */ @ResponseBody @RequestMapping('deleteUser') public boolean deleteUser(int userId) {//執(zhí)行新增方法int result = userService.deleteUser(userId); //返回結(jié)果return result > 0 ? true : false; }}5.5 顯示頁面(View層)

在 resources/templates 目錄下,創(chuàng)建 user-info.html 用戶信息顯示頁面。

<!DOCTYPE html><html lang='en' xmlns:th='http://www.thymeleaf.org'><head> <meta charset='UTF-8'> <title>用戶信息</title> <meta name='author' content='pan_junbiao的博客'> <style>table { border-collapse: collapse; margin-bottom: 10px}table,table tr th, table tr td { border:1px solid #000000; padding: 5px 10px;} </style></head><body> <div align='center'> <table><caption>用戶信息</caption><tr> <th>用戶ID:</th> <td th:text='${userInfo.userId}'></td></tr><tr> <th>用戶名稱:</th> <td th:text='${userInfo.userName}'></td></tr><tr> <th>年齡:</th> <td th:text='${userInfo.age}'></td></tr><tr> <th>博客地址:</th> <td th:text='${userInfo.blogUrl}'></td></tr><tr> <th>備注信息:</th> <td th:text='${userInfo.blogRemark}'></td></tr> </table></div></body></html>

至此,項目已經(jīng)編寫完成,執(zhí)行結(jié)果如下圖:

Spring Cache和EhCache實現(xiàn)緩存管理方式

接著運(yùn)行項目的其他方法,然后多次訪問查詢方法的URL,體驗緩存效果。主要觀察數(shù)據(jù)庫是否進(jìn)行了操作,如果數(shù)據(jù)庫沒有操作數(shù)據(jù)而正常返回數(shù)據(jù),則代表緩存成功。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区三区久久久久久久久| 蜜臀久久99精品久久久久宅男| 欧美一区成人| 免费福利视频一区二区三区| 青青草视频一区| 在线一区视频| 日韩不卡手机在线v区| 欧美在线黄色| 成人在线免费观看91| 精品九九久久| 91精品综合| 蜜桃av一区二区三区电影| 一区在线观看| 日韩影片在线观看| 日本aⅴ精品一区二区三区| 亚洲专区视频| 视频一区日韩精品| 噜噜噜躁狠狠躁狠狠精品视频 | 国产欧美一区二区色老头| 不卡中文字幕| 亚洲经典在线| 国产欧美精品| 国产精品传媒麻豆hd| 亚洲三级观看| 九九久久国产| 欧美日韩在线网站| 日本成人在线视频网站| 亚洲在线一区| 97精品国产99久久久久久免费| 欧美日韩18| 四虎在线精品| 欧美日韩免费观看一区=区三区| 91亚洲精品视频在线观看| 日韩欧美视频专区| 久久99性xxx老妇胖精品| 久久九九精品| 日韩av网站在线免费观看| 欧美黄色网页| 国产精品日韩精品在线播放| 蜜桃免费网站一区二区三区| 日韩一区中文| 免费日韩一区二区三区| 久久99偷拍| 亚洲成人不卡| 免费日韩一区二区| 国产精品久久久久毛片大屁完整版| 欧美激情福利| 激情自拍一区| 欧美亚洲tv| 日韩大片在线观看| 麻豆视频观看网址久久| 成人黄色av| 成人三级高清视频在线看| 日韩二区在线观看| 国产在线观看91一区二区三区 | 欧美日韩在线二区| 69精品国产久热在线观看| www在线观看黄色| 日本一区中文字幕| 日韩精品免费一区二区在线观看 | 国产精品丝袜xxxxxxx| 日本不卡一区二区三区| 国产亚洲一区二区手机在线观看| 亚洲久久视频| 狠狠久久婷婷| 欧美gv在线| 日本少妇精品亚洲第一区| 国户精品久久久久久久久久久不卡| 日本亚洲欧洲无免费码在线| 99精品视频在线| 精品91福利视频| 日本欧美韩国一区三区| 天堂av在线一区| 欧美国产偷国产精品三区| 午夜久久av| 欧美日韩国产精品一区二区亚洲| 九九99久久精品在免费线bt| 激情欧美一区二区三区| 国产精品国产三级在线观看| 在线视频亚洲| 日韩不卡视频在线观看| 日本午夜精品久久久| 91九色精品国产一区二区| 国产一区二区三区天码| 国产探花在线精品一区二区| 在线精品福利| 亚洲一区中文| 中文日韩在线| 亚洲少妇在线| 喷白浆一区二区| 久久福利影视| 久久亚洲欧美| 69精品国产久热在线观看| 日本精品另类| 国产精品xxxav免费视频| 欧美日韩一区二区三区在线电影| 久久精品国产大片免费观看| 精品一区二区三区四区五区| 久久中文字幕一区二区三区| 国产欧美综合一区二区三区| 欧美黄页在线免费观看| 欧美黄页在线免费观看| 国产欧洲在线| 久久国产精品亚洲77777| 日韩中文字幕一区二区高清99| 天堂久久av| 精品视频免费| 国产美女高潮在线| 蜜臀久久99精品久久久画质超高清| 欧美影院视频| 久久久成人网| 日韩一区精品视频| 国产福利亚洲| 91久久国产| 日本少妇一区二区| 精品网站999| 亚洲播播91| 亚洲精品一二| 国产精品chinese| 国产精品v一区二区三区| 精品久久久久久久| 国内精品福利| 日韩精品中文字幕吗一区二区| 国产精品夜夜夜| 欧美日韩在线网站| 999国产精品永久免费视频app| 国产精品97| 亚洲三级av| 国产va免费精品观看精品视频| 亚洲夜间福利| 国产精品xvideos88| 亚洲一区二区三区高清| 欧美综合社区国产| 欧洲一级精品| 少妇精品久久久一区二区| 日韩欧美一区二区三区免费看| 天堂精品久久久久| 午夜久久久久| 久久精品亚洲人成影院| 欧美一区在线观看视频| 欧美a级一区| 青青草国产精品亚洲专区无| 久久久久国产一区二区| 日韩综合小视频| 欧美成人午夜| 国产成人免费av一区二区午夜| 日韩在线观看一区二区| 肉色欧美久久久久久久免费看 | 99成人超碰| 欧美日韩伊人| 亚洲欧洲另类| 99精品网站| 韩日一区二区| 另类亚洲自拍| 极品日韩av| 国产麻豆一区| 亚洲精品麻豆| 免费久久精品视频| 99视频精品免费观看| 亚洲综合另类| 亚洲精品1区| 91精品成人| 激情五月综合| 欧美一区二区三区高清视频| 午夜精品网站| 欧美在线亚洲| 999在线观看精品免费不卡网站| 99综合视频| 日韩国产在线不卡视频| 亚洲影院天堂中文av色| 亚洲欧美日韩精品一区二区 | 精品一区二区三区在线观看视频| 蜜桃视频一区二区| 国产成人精品一区二区三区免费 | 奇米狠狠一区二区三区| 婷婷综合六月| www.com.cn成人| 国产精品视频一区二区三区 | 福利一区二区三区视频在线观看| 国产尤物精品| 国产欧美成人| 日韩在线二区| 亚洲一区二区三区免费在线观看 | 日本午夜精品久久久| 亚洲久久一区| 国产精品115| 日韩久久电影| 久久av一区| 不卡中文字幕| 日本在线不卡视频一二三区| 夜夜精品视频| 欧美日韩精品一区二区视频| 国产精品久久久久久妇女| 国产精品毛片一区二区三区| 国产乱码精品一区二区三区亚洲人| 婷婷丁香综合| 久久久久久网| 欧美激情精品| 国产视频一区在线观看一区免费| 久久精品电影|