亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

集成Spring Redis緩存的實(shí)現(xiàn)

2024-07-14 08:43:18
字體:
供稿:網(wǎng)友

這里的緩存主要是用于 Service 層的,所以下面的配置,都是針對(duì) service 模塊的。

本文來自內(nèi)部分享,對(duì)特殊信息進(jìn)行了簡單處理。

本文都是在以緩存來講 Redis 的使用,實(shí)際上 Redis 不僅僅用于緩存,本身還是 NoSQL 數(shù)據(jù)庫,大家可以自己查找學(xué)習(xí) Redis 的常用場景。

一、添加依賴

<!--緩存--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.14.RELEASE</version></dependency><!--redis--><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.10.RELEASE</version></dependency><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.3</version></dependency><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependency>

二、配置

增加spring-redis.xml 配置文件,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:cache="http://www.springframework.org/schema/cache"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd">  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">    <property name="maxIdle" value="${redis.pool.maxIdle}"/>    <property name="maxTotal" value="${redis.pool.maxTotal}"/>    <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>    <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>    <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>  </bean>  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">    <property name="hostName" value="${redis.master.ip}"/>    <property name="port" value="${redis.master.port}"/>    <property name="poolConfig" ref="jedisPoolConfig"/>  </bean>  <bean id="redisKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  <bean id="redisValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">    <property name="connectionFactory" ref="jedisConnectionFactory"/>    <property name="keySerializer" ref="redisKeySerializer"/>    <property name="hashKeySerializer" ref="redisKeySerializer"/>    <property name="valueSerializer" ref="redisValueSerializer"/>    <property name="hashValueSerializer" ref="redisValueSerializer"/>  </bean>  <!--在 redis.properties 配置緩存詳細(xì)信息-->  <util:properties id="redisExpires" location="classpath*:META-INF/spring/redis.properties"/>  <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">    <constructor-arg index="0" ref="redisTemplate"/>    <!--默認(rèn)緩存 10 分鐘-->    <property name="defaultExpiration" value="600"/>    <property name="usePrefix" value="true"/>    <property name="expires" ref="redisExpires"/>  </bean>  <!--啟用 cache 注解-->  <cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/></beans>

在 src/main/resources/ 下面如果沒有META-INF/spring/ 目錄就創(chuàng)建一個(gè),然后增加 redis.properties 配置,示例如下:

# 緩存名=有效時(shí)間halfHour=1800oneHour=3600oneDay=86400webSession=1800user=1800

除了上面配置外,在系統(tǒng)的 application.properties 中還需要提供下面幾個(gè)配置:

# redis 連接配置redis.master.ip=10.10.10.100redis.master.port=6379# redis 連接池配置redis.pool.maxIdle=200redis.pool.maxTotal=1024redis.pool.maxWaitMillis=1000redis.pool.testOnBorrow=trueredis.pool.testOnReturn=true

三、通過注解方式使用緩存

示例中,redis.propreties 配置如下:

# 數(shù)據(jù)庫定義,緩存 30 天databaseDef=2592000# 數(shù)據(jù)庫元數(shù)據(jù),緩存 1 小時(shí)databaseMeta=3600

這個(gè)示例在數(shù)據(jù)庫服務(wù)上配置的,數(shù)據(jù)庫服務(wù)中,查詢次數(shù)遠(yuǎn)遠(yuǎn)大于新增、修改、刪除的次數(shù),非常適合使用緩存。

1. 緩存數(shù)據(jù) @Cacheable

@Override@Cacheable(value = "databaseDef", key = "'all'")public List<DatabaseDefinitionVo> selectAll() { return databaseDefinitionDao.selectAllVo();}

特別注意:所有這些注解中,key 的值是 Spel 表達(dá)式,必須按照 Spel 要求來寫。上面這個(gè)例子中,直接定義返回值的 key 是 all 字符串,需要加上單引號(hào)' 括起來,下面還有其他用法。

在例子中,下面的方法也使用了這個(gè)注解:

@Override@Cacheable(value = "databaseDef", key = "#id.toString()")public DatabaseDefinition selectByPrimaryKey(Long id) {  Assert.notNull(id, "數(shù)據(jù)庫 ID 不能為空!");  DatabaseDefinition definition = databaseDefinitionDao.selectByPrimaryKey(id);  Assert.notNull(definition, "數(shù)據(jù)庫定義不存在!");  return definition;}

在上面注解中,key 中的 #id 指的是參數(shù)中的 id,在 IDEA 中會(huì)有自動(dòng)提示。.toString() 是調(diào)用 id 的方法,在系統(tǒng)中規(guī)定了 key 必須是字符串類型,所以當(dāng)類型是 Long 的時(shí)候,需要轉(zhuǎn)換。

使用緩存的目的就是為了減少上面兩個(gè)方法調(diào)用時(shí)減少和數(shù)據(jù)庫的交互,減小數(shù)據(jù)庫的壓力,這是兩個(gè)主要的緩存數(shù)據(jù)的方法,下面的幾個(gè)操作都和上面這兩個(gè)方法有一定的關(guān)系。

重點(diǎn):這里以及下面幾個(gè)注解中,都指定了 value = "databaseDef",這里的意思是說,要使用前面配置中的 databaseDef 對(duì)應(yīng)的配置,也就是會(huì)緩存 30天。

2. 更新緩存 @CachePut

@Override@CachePut(value = "databaseDef", key = "#result.id.toString()")public DatabaseDefinition save(DatabaseDefinition definition, CurrentUser userModel)    throws ServiceException { //代碼 return definition;}

更新緩存的方法需要注意的是返回值,在上面 save 方法中,有可能是新增,有可能是更新,不管是那個(gè)操作,當(dāng)操作完成后,上面注解會(huì)根據(jù) key 的值生成 key,然后將方法的返回值作為 value 保存到緩存中。

這里 key 的寫法中 #result 指代返回值,.id 是返回值的屬性,.toString() 是調(diào)用 id 屬性的方法,在系統(tǒng)中規(guī)定了 key 必須是字符串類型,所以當(dāng)類型是 Long 的時(shí)候,需要轉(zhuǎn)換。

這個(gè)方法上加的緩存還有問題,當(dāng)新增或者更新后,通過 selectAll() 返回的值已經(jīng)發(fā)生了變化,但是這里沒有清除 all 的緩存值,會(huì)導(dǎo)致 selectAll() 出現(xiàn)臟數(shù)據(jù),下面會(huì)通過 @Caching 注解改造這里。

3. 清除緩存 @CacheEvict

@Override@CacheEvict(value = "databaseDef", key = "#id.toString()")public void deleteByPrimaryKey(Long id) throws ServiceException { DatabaseDefinition definition = selectByPrimaryKey(id); if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫!"); } databaseDefinitionDao.deleteByPrimaryKey(id);}

在上面新增或者修改的時(shí)候根據(jù) id 緩存或者更新了緩存數(shù)據(jù),這里當(dāng)刪除數(shù)據(jù)的時(shí)候,還需要清空對(duì)應(yīng)的緩存數(shù)據(jù)。

在上面注解中,key 中的 #id 指的是參數(shù)中的 id,在 IDEA 中會(huì)有自動(dòng)提示。

這個(gè)方法上加的緩存還有問題,當(dāng)刪除后,通過 selectAll() 返回的值已經(jīng)發(fā)生了變化,但是這里沒有清除 all 的緩存值,會(huì)導(dǎo)致 selectAll() 出現(xiàn)臟數(shù)據(jù),下面會(huì)通過 @Caching 注解改造這里。

4. 組合使用 @Caching

上面兩個(gè)注解中,都提到了臟數(shù)據(jù),通過 @Caching 注解可以解決這個(gè)問題。

先修改第二個(gè)注解,來解決 save 時(shí)的臟數(shù)據(jù):

@Override@Caching(put = @CachePut(value = "databaseDef", key = "#result.id.toString()"),     evict = @CacheEvict(value = "databaseDef", key = "'all'"))public DatabaseDefinition save(DatabaseDefinition definition, CurrentUser userModel)    throws ServiceException { //其他代碼 return definition;}

前面說明,新增或者修改的時(shí)候,all 緩存中的數(shù)據(jù)已經(jīng)不對(duì)了,因此這里在 put 的同時(shí),使用 evict 將 'all' 中的數(shù)據(jù)清除,這就保證了 selelctAll 下次調(diào)用時(shí),會(huì)重新從庫中讀取數(shù)據(jù)。

對(duì)上面的刪除方法,也進(jìn)行類似的修改:

@Override@Caching(evict = {  @CacheEvict(value = "databaseDef", key = "#id.toString()"),  @CacheEvict(value = "databaseDef", key = "'all'")})public void deleteByPrimaryKey(Long id) throws ServiceException { DatabaseDefinition definition = selectByPrimaryKey(id); if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫!"); } databaseDefinitionDao.deleteByPrimaryKey(id);}

注意這里的 evict 是個(gè)數(shù)組,里面配置了兩個(gè)清除緩存的配置。

5. 全局配置 @CacheConfig

在上面所有例子中,都指定了 value = "databaseDef",實(shí)際上可以通過在類上使用 @CacheConfig 注解配置當(dāng)前類中的 cacheNames 值,配置后,如果和類上的 value 一樣就不需要在每個(gè)注解單獨(dú)配置。只有不同時(shí)再去指定,方法上的 value 值優(yōu)先級(jí)更高。

@Service@CacheConfig(cacheNames = "databaseDef")public class DatabaseDefinitionServiceImpl implements      DatabaseDefinitionService, DatabaseSqlExecuteService, ApplicationListener {

有了上面配置后,其他緩存名字相同的地方可以簡化,例如刪除方法修改后如下:

@Override@Caching(evict = {  @CacheEvict(key = "#id.toString()"),  @CacheEvict(key = "'all'")})public void deleteByPrimaryKey(Long id) throws ServiceException { DatabaseDefinition definition = selectByPrimaryKey(id); if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫!"); } databaseDefinitionDao.deleteByPrimaryKey(id);}

其他例子

除了上面針對(duì) databaseDef 的緩存外,還有 databaseMeta 的配置:

@Override@Cacheable(value = "databaseMeta", key = "#databaseId.toString()")public List<TableVo> selectTablesByDatabaseId(Long databaseId)   throws Exception { //代碼}@Override@Cacheable(value = "databaseMeta", key = "#databaseId + '_' + #tableName")public TableVo selectTableByDatabaseIdAndTableName(Long databaseId, String tableName)   throws Exception { //代碼}

這兩個(gè)方法是獲取數(shù)據(jù)庫元數(shù)據(jù)的,只有修改數(shù)據(jù)庫表的時(shí)候才會(huì)變化,因此不存在清除緩存的情況,但是萬一修改表后,想要新的元數(shù)據(jù),該怎么辦?

因此增加了一個(gè)空的方法來清空數(shù)據(jù),方法如下:

@Override@CacheEvict(value = "databaseMeta", allEntries = true)public void cleanTablesCache() {}

這里指定了 databaseMeta,通過 allEntries = true 清空所有 key 的緩存。通過這個(gè)方法可以保證在有需要的時(shí)候清空所有元數(shù)據(jù)的緩存。

實(shí)際上如果想要更精確的清除,可以傳入要清除的 databaseId 和 tableName 來更精確的清除。

增加緩存后的效果

調(diào)用 selectTablesByDatabaseId 多次時(shí),輸出的日志如下:

INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.d.D.selectByPrimaryKey - ==>  Preparing: SELECT xxx (隱藏完整 SQL)
DEBUG c.n.d.d.D.selectByPrimaryKey - ==> Parameters: 1(Long)
DEBUG c.n.d.d.D.selectByPrimaryKey - <==      Total: 1
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:10.10.10.130/datareporting
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息

從日志可以看出來,只有第一次進(jìn)行了數(shù)據(jù)庫查詢,后續(xù)通過日志看不到數(shù)據(jù)庫操作。

調(diào)用清空緩存后,會(huì)再次查詢數(shù)據(jù)庫。

初次調(diào)用時(shí),WEB請(qǐng)求花了 700多ms,后面再次調(diào)用時(shí),平均不到 30 ms,這就是緩存最明顯的作用。

連接到 redis 服務(wù)后,查看所有 key,結(jié)果如下:

redis@redissvr:~$ redis-cli 
127.0.0.1:6379> keys *
1) "databaseMeta:1"
2) "databaseDef:all"
127.0.0.1:6379>

緩存中的數(shù)據(jù)都有 value 前綴,上面緩存了 all 和 id 為 1 的數(shù)據(jù)。

緩存注解是一種最簡單的緩存方式,但是需要配合 value 屬性的配置來使用,許多時(shí)候我們可能需要更精確的控制緩存,此時(shí)可以使用 RedisTemplate 來控制。

四、通過 RedisTemplate 使用緩存

有關(guān)這部分的詳細(xì)用法可以從網(wǎng)上搜索相關(guān)內(nèi)容進(jìn)行學(xué)習(xí),這里列舉一個(gè)簡單的例子。

針對(duì)前面的 selectAll 我們換一種方式進(jìn)行緩存。

首先注入下面的接口:

@Resource(name = "redisTemplate")private ValueOperations<String, List> valueOper;

修改 selectAll 方法如下:

@Override//@Cacheable(key = "'all'")public List<DatabaseDefinitionVo> selectAll() { List<DatabaseDefinitionVo> vos = valueOper.get("databaseDef:all"); if(vos != null){  return vos; } vos = databaseDefinitionDao.selectAllVo(); //緩存 1 小時(shí) valueOper.set("databaseDef:all", vos, 1, TimeUnit.HOURS); return vos;}

首先通過valueOper.get("databaseDef:all") 嘗試獲取緩存信息,如果存在就直接返回。

如果不存在,就查詢數(shù)據(jù)庫,然后將查詢結(jié)果通過 set 進(jìn)行緩存。

特別注意: 上面的 key,寫的是 "databaseDef:all",也就是前綴需要自己加上,如果直接寫成 all,在 Redis 中的 key 就是 all,不會(huì)自動(dòng)增加前綴。

如果沒有前綴,那么當(dāng)不同系統(tǒng)都使用 all 時(shí),數(shù)據(jù)就會(huì)混亂!

五、Redis 服務(wù)器配置注意事項(xiàng)

內(nèi)網(wǎng)使用的服務(wù)器,特殊配置如下:

# By default protected mode is enabled. You should disable it only if# you are sure you want clients from other hosts to connect to Redis# even if no authentication is configured, nor a specific set of interfaces# are explicitly listed using the "bind" directive.# protected-mode yesprotected-mode no

關(guān)閉了保護(hù)模式。

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES# JUST COMMENT THE FOLLOWING LINE.# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# bind 127.0.0.1

注釋了綁定的 IP,這樣可以讓所有電腦訪問 Redis。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品久久久亚洲| 亚洲乱码中文字幕久久孕妇黑人| 欧美高清一区| 国产精品久久久久永久免费观看| 电影亚洲精品噜噜在线观看| 国产一级免费大片| 亚洲女人视频| 欧美一级欧美三级| 免费看毛片的网址| 不卡日本视频| 色综合久久天天综合网| 日韩av在线免播放器| www.成人网| 99se视频在线观看| 91麻豆国产在线观看| 99中文视频在线| 国产精品99久久久精品无码| 精品国产一二三区| 91国产丝袜在线播放| 日韩伦理一区二区三区av在线| 一级片在线免费播放| 亚洲另类春色国产| 日韩亚洲不卡在线| 亚洲激情丁香| www.一区二区三区| 亚洲a级在线观看| 好吊色一区二区| 97人人澡人人爽人人模亚洲| 污污视频网站在线免费观看| 欧美日韩高清在线观看| 欧美精品韩国精品| 国产传媒免费在线观看| www.色综合| 91中文精品字幕在线视频| 美女一区二区久久| 香港成人在线视频| 欧美日韩精品综合在线| 精品亚洲二区| 欧美性受极品xxxx喷水| 欧美洲成人男女午夜视频| 成人午夜精品久久久久久久蜜臀| 国产网站一区二区三区| 在线不卡日本v二区707| 亚洲国产精品毛片| 少妇一晚三次一区二区三区| 国产精品国产对白熟妇| 性欧美欧美巨大69| 女人香蕉久久**毛片精品| 日本高清免费不卡视频| 就爱干草视频| 久久看片网站| 国产精欧美一区二区三区白种人| 欧美色就是色| 国产精品 欧美激情| 欧美特黄一区二区三区| 麻豆成人在线播放| 4444亚洲人成无码网在线观看| 91麻豆免费在线视频| 黄色一级视频免费| 黑人と日本人の交わりビデオ| 日韩极品一区| 神马久久久久久久久久久| 性欧美ⅴideo另类hd| 风间由美性色一区二区三区四区| 亚洲精品一区国产精品| 午夜久久资源| 欧美一区二区在线观看| 污视频在线免费观看网站| 亚洲成av人片在线观看无码| 色综合视频一区中文字幕| yy6080午夜| 国产一区二区三区美女| 国产精品无码专区av免费播放| free性欧洲69| 精品久久久一区二区| 欧美日韩国产高清电影| 亚洲国产成人va在线观看天堂| 免费av播放| 成人在线看片| 天天色综合4| 91国产在线免费观看| 西野翔中文久久精品国产| 亚洲怡红院av| 日韩av在线高清| 国产h片在线观看| 麻豆精品一区二区av白丝在线| a√免费观看在线网址www| 国产日韩三区| 欧美日本一区二区高清播放视频| 欧美一区二区三区四区久久| 丁香婷婷综合激情五月色| 亚洲高清久久久| 一区二区三区欧美视频| 欧美激情一区二区视频| 精品亚洲一区二区三区四区| 一本到不卡免费一区二区| 日韩一区二区三区三四区视频在线观看| 国产成人天天5g影院在线观看| 免费黄色片在线观看| ㊣最新国产の精品bt7086| 91好色先生tv| 国产综合欧美在线看| 国产三级中文字幕| 爽爽淫人综合网网站| xxxxxx国产| 色婷婷激情一区二区三区| 又大又黄又粗| 91麻豆精品国产91久久久久久久久| 一本一道久久综合狠狠老| 国产精品久久久久秋霞鲁丝| 国产69久久精品成人看| 亚洲高清视频免费| 久久久久久久久久久一区| 日韩欧美国产片| 可以免费看的黄色网址| 日韩精品成人av| 欧美日韩亚洲高清一区二区| 亚洲欧美日韩中文在线| 91日韩欧美| 欧美激情第一页在线观看| 亚洲精品一区二区久| 国产毛片久久久久久| 成人免费视频| 亚洲人高潮女人毛茸茸| 91社区国产高清| 亚洲 欧美 综合 另类 中字| 一级黄色a视频| 国产精品粉嫩av| 中文字幕av一区二区三区免费看| 97中文字幕在线观看| 国产精品一品二区三区的使用体验| 亚洲人成伊人成综合图片| 午夜在线观看一区| 欧美成人中文字幕在线| 欧洲亚洲在线视频| 精品视频一区二区观看| 国产av熟女一区二区三区| 91久久视频| 欧美高清在线视频观看不卡| 国产乱真实合集| 欧美日韩一区二区三区在线电影| 亚洲黄色免费在线观看| 久久久999免费视频| 后入内射欧美99二区视频| 成人爱爱电影网址| 国产精品人人妻人人爽人人牛| 国产美女视频一区二区三区| www中文在线| 欧美aaaaaaaa牛牛影院| 亚洲不卡1区| 国产一级一级国产| 精品人妻伦九区久久aaa片| av大片在线观看| 国产精品第一视频| 欧美乱妇一区二区三区不卡视频| 最新中文字幕一区二区三区| 国产精品激情av在线播放| 欧美日韩福利在线观看| 九色视频成人自拍| 亚洲资源在线看| 久久夜靖品2区| 69堂成人精品视频免费| 国产二区精品| 国产情侣第一页| 精品久久亚洲一级α| 精品奇米国产一区二区三区| 国产精品不卡| 91短视频在线| 米奇在线777| 日本不卡视频| 成人久久一区二区三区| 88久久精品| 26uuu亚洲国产精品| 国产成人午夜视频网址| 久久久久久国产精品久久| 日本在线视频免费| 日本不卡在线视频| 国产大片中文字幕在线观看| 色播五月激情综合网| 欧美亚洲丝袜传媒另类| 人成免费电影一二三区在线观看| 99精品1区2区| 2019中文字幕在线电影免费| 精品视频免费观看| 国产一区美女在线| 亚洲精品成人无码| 神马影院午夜我不卡| 四虎影视免费看电影| 欧美精品一级二级三级| 高清在线观看免费韩剧| 在线免费观看av的网站| 天天舔天天干天天操| 亚洲激情丁香| 色欲综合视频天天天| 91热这里只有精品| 日韩av片电影专区| 日韩av中文字幕一区二区三区| 免费福利在线视频| 91日韩在线播放| 五月婷中文字幕| 亚洲欧洲激情在线乱码蜜桃| 亚洲午夜精品久久久久久app| 国产一区在线看| 992在线观看| 国产在线视频一区二区三区| 中文字幕亚洲色图| 日韩欧美亚洲系列| 亚洲第一综合天堂另类专| 久久9999久久免费精品国产| 欧美理论影院| 日本免费资源| 免费看特级毛片| 无码小电影在线观看网站免费| 精品一区二区三区久久| 欧美日韩一区二区三区四区五区六区| 日韩小视频在线播放| 一区二区三区亚洲| 性直播在线观看| 久久国产福利| www在线视频| 国产成人免费视频app| 精品成人av一区| av有码在线观看| 欧美猛男男男激情videos| 欧美性大战久久久久xxx| 亚洲欧美精品suv| 国产成人午夜99999| 日韩三级小视频| 日本一区二区三区免费看| 麻豆电影在线观看| 91在线视频在线| 日韩毛片免费观看| 国产一区二区三区免费观看在线| 欧美午夜片在线看| 成视人a免费观看视频| 中文字幕在线观看视频免费| 日韩少妇内射免费播放| 久久99精品国产99久久6尤物| 白丝美女让我捅| 精品成人久久av| 日韩福利电影在线| 麻豆md0077饥渴少妇| 日韩精品一级毛片在线播放| 亚洲mv在线看| 成人精品小视频| 尤物视频免费观看| 精品嫩模一区二区三区| av在线综合网| 女人床在线观看| 二区三区四区视频| 激情五月色综合国产精品| 玖玖爱免费视频| 中国麻豆视频| 国产色综合一区二区三区| 四虎国产精品免费| 激情av中文字幕| 91精品短视频| 免费一级在线观看| 99re热这里只有精品视频| 欧美一区二区三区视频免费| 亚洲欧洲成人精品av97| 激情偷乱视频一区二区三区| 欧美一a一片一级一片| 91免费看视频| www欧美在线观看| 亚洲免费av网址| 丰满少妇xoxoxo视频| 精品国产不卡| 久久精品视频免费观看| 欧美一级淫片免费视频黄| 欧美成人三级在线视频| 日韩av高清在线看片| 狠狠色狠狠色综合日日tαg| 夜夜嗨网站十八久久| 国产精品久久久999| 在线免费三级电影网站| 亚洲精品久久久久久下一站| 日本韩国精品在线| 97精品视频在线| 播放灌醉水嫩大学生国内精品| 2019中文字幕在线电影免费| 日韩国产欧美一区二区三区| 91精品国产乱码久久| а√在线天堂官网| 大肉大捧一进一出好爽动态图| 久久久高清一区二区三区| 香港日本韩国三级网站| 国产乱淫av片免费| 欧美fxxxxxx另类| 六月婷婷激情网| 极品美妇后花庭翘臀娇吟小说| 久久久久久亚洲精品中文字幕| 女性隐私黄www网站视频| 欧美艳星brazzers| 福利片在线观看| 色视频在线播放| 久久久久国产一区二区| 亚洲高清不卡在线| 亚洲国产精品二十页| 免费av在线电影| 成年人网站国产| 日本一区二区三区久久久久久久久不| 超碰av女优在线| 亚洲大胆人体视频| 日韩欧美高清在线视频| 婷婷国产成人久久精品激情| 精品人妻一区二区免费| 男人的天堂网av| 国产区在线观看视频| 免费一级片网址| 国产欧美高清在线| 裸体一区二区三区| 亚洲精品国产电影| 91精品久久久久久久久久不卡| 欧美精品久久久久久久免费| 一区二区动漫| 肥臀熟女一区二区三区| 欧美一区二区三区电影在线观看| 亚洲第一av网站| 在线成人黄色| 91蜜桃免费观看视频| 久久精品国产一区二区三区日韩| 91九色国产ts另类人妖| jizzjizz亚洲中国少妇| 精品视频黄色| 91偷拍与自偷拍精品| 免费在线观看av网站| 国产 日韩 欧美一区|