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

首頁(yè) > 開(kāi)發(fā) > Java > 正文

SpringBoot AOP控制Redis自動(dòng)緩存和更新的示例

2024-07-14 08:43:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

導(dǎo)入redis的jar包

<!-- redis -->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-data-redis</artifactId>      <version>2.0.4.RELEASE</version>    </dependency>

編寫(xiě)自定義緩存注解

/** * @Description: redis緩存注解 編寫(xiě)在需要緩存的類上 **/@Documented@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface RedisCache {}

編寫(xiě)切面類

package com.ys.edu.aop;import com.ys.edu.utils.ResultUtils;import org.apache.log4j.Logger;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import org.springframework.stereotype.Service;import org.aspectj.lang.reflect.MethodSignature;import javax.annotation.Resource;import java.util.Arrays;import java.util.Set;import java.util.concurrent.TimeUnit;/** * @ClassName RedisAOP * @description: redis 切面緩存 **/@Aspect@Servicepublic class RedisAOP {  private static final Logger logger = Logger.getLogger(RedisAOP.class);  private static final Integer TIME_OUT = 30 ; //redis 存活時(shí)長(zhǎng) 分鐘  @Resource  private RedisTemplate redisTemplate;  /**   * @Title: queryCachePointcut   * @Description: 定義切點(diǎn)為緩存注解   * @return void   **/  @Pointcut("@within(com.ys.edu.annotation.RedisCache)")  public void queryCachePointcut(){  }  @Around("queryCachePointcut()")  public Object Interceptor(ProceedingJoinPoint joinPoint) throws Throwable{    long beginTime = System.currentTimeMillis();    MethodSignature signature = (MethodSignature) joinPoint.getSignature();    //類路徑名    String classPathName = joinPoint.getTarget().getClass().getName();    //類名    String className = classPathName.substring(classPathName.lastIndexOf(".")+1,classPathName.length());    //獲取方法名    String methodName = signature.getMethod().getName();    String[] strings = signature.getParameterNames();    String key = className+"_"+methodName+"_"+Arrays.toString(strings);    if((methodName.indexOf("select") != -1 && methodName.substring(0,6).equalsIgnoreCase("select")) || (methodName.indexOf("query") != -1 && methodName.substring(0,5).equalsIgnoreCase("query")) || (methodName.indexOf("get") != -1 && methodName.substring(0,3).equalsIgnoreCase("get"))){      Object data = getObject(beginTime,joinPoint,key);      if(data != null){        return ResultUtils.success(data);      }      return joinPoint.proceed();    }else if((methodName.indexOf("add") != -1 && methodName.substring(0,3).equalsIgnoreCase("add")) || (methodName.indexOf("insert") != -1 && methodName.substring(0,6).equalsIgnoreCase("insert")) || (methodName.indexOf("update") != -1 && methodName.substring(0,6).equalsIgnoreCase("update"))){      Set<String> keys = redisTemplate.keys(className+"*");      redisTemplate.delete(keys);      logger.warn("執(zhí)行方法 : [ "+methodName+" ] : 清除 key 包含 [ "+className+" ] 的緩存數(shù)據(jù)");      logger.warn("AOP 緩存切面處理 >>>> end 耗時(shí):" + (System.currentTimeMillis() - beginTime));    }    // 調(diào)用原始方法    return joinPoint.proceed();  }  /**   * @Title: getObject   * @Description: 使用key獲取數(shù)據(jù) 不存在則查詢添加   * @param beginTime : 切面開(kāi)始時(shí)間   * @param joinPoint : 切面對(duì)象   * @param key : 獲取redis數(shù)據(jù)的key值   * @return java.lang.Object   **/  private Object getObject(long beginTime,ProceedingJoinPoint joinPoint,String key) throws Throwable {    ValueOperations<String, Object> operations = redisTemplate.opsForValue();    boolean hasKey = redisTemplate.hasKey(key);    Object object = null;    if(hasKey){      // 緩存中獲取到數(shù)據(jù),直接返回。      object = operations.get(key);      logger.warn("從緩存中獲取到 key 為 ["+key+" ] : 的數(shù)據(jù) >>>> " + object.toString());      logger.warn("AOP 緩存切面處理 >>>> end 耗時(shí):" + (System.currentTimeMillis() - beginTime));      return object;    }    if(object == null) {      // 緩存中沒(méi)有數(shù)據(jù),調(diào)用原始方法查詢數(shù)據(jù)庫(kù)      object = joinPoint.proceed();      operations.set(key, object, TIME_OUT, TimeUnit.MINUTES); // 設(shè)置超時(shí)時(shí)間30分鐘      logger.warn("向 Redis 添加 key 為 ["+key+" ] , 存活時(shí)長(zhǎng)為 "+TIME_OUT+" min 的數(shù)據(jù) >>>> " + object.toString());      logger.warn("AOP 緩存切面處理 >>>> end 耗時(shí):" + (System.currentTimeMillis() - beginTime));    }    return object;  }  @Autowired(required = false)  public void setRedisTemplate(RedisTemplate redisTemplate) {    RedisSerializer stringSerializer = new StringRedisSerializer();//序列化為String    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化為Json    redisTemplate.setKeySerializer(stringSerializer);    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);    redisTemplate.setHashKeySerializer(stringSerializer);    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);    this.redisTemplate = redisTemplate;  }}

在想要使用redis緩存的controller類上添加 @RedisCache 注解.

切面方法則會(huì)切以select/get/query 開(kāi)頭的查詢方法,獲取方法名和參數(shù)拼接為key,存到redis.

在執(zhí)行add/insert/update 開(kāi)頭的方法時(shí),則清空該類下的所有緩存.

方法返回值格式統(tǒng)一實(shí)體類:

package com.ys.edu.bean;import java.io.Serializable;/** * @ClassName ResultBody * @description: RestFul API 方法返回值格式統(tǒng)一實(shí)體類 **/public class ResultBody<T> implements Serializable {  private static final long serialVersionUID = 694858559908048578L;  private Integer code;  private String msg;  private Integer count = 0;  private T data;  public ResultBody(){}  public ResultBody(Integer code, String msg,Integer count,T data) {    this.code = code;    this.msg = msg;    this.count = count;    this.data = data;  }  public ResultBody(Integer code, String msg,T data) {    this.code = code;    this.msg = msg;    this.data = data;  }  /**   * @Title: success   * @Description: 成功 (無(wú)參) 默認(rèn) code : " 0 " msg : "請(qǐng)求成功" , count : 0 , data: null   * @date 2018/11/29 10:28   **/  public ResultBody success(){    return success((T) null);  }  /**   * @Title: success   * @Description:  成功  默認(rèn) code : " 0 " msg : "請(qǐng)求成功"   * @param count : 數(shù)據(jù)條數(shù)   * @param data : 數(shù)據(jù)   * @date 2018/11/29 11:46   **/  public ResultBody success(Integer count,T data){    return new ResultBody(0,"請(qǐng)求成功!",count,data);  }  /**   * @Title: success   * @Description: 成功  默認(rèn) code : " 0 "   * @param msg : 提示信息   * @param count : 數(shù)據(jù)條數(shù)   * @param data :  數(shù)據(jù)   **/  public ResultBody success(String msg,Integer count,T data){    return new ResultBody(0,msg,count,data);  }  /**   * @Title: success   * @Description: 成功  默認(rèn) code : " 0 " , msg : "請(qǐng)求成功"   * @param data : 數(shù)據(jù)   **/  public ResultBody success(T data){    return new ResultBody(0,"請(qǐng)求成功!",data);  }  /**   * @Title: success   * @Description: 成功  默認(rèn) code : " 0 "   * @param msg : 提示信息   * @param data : 數(shù)據(jù)   * @date 2018/11/29 11:47   **/  public ResultBody success(String msg,T data){    return new ResultBody(0,msg,data);  }  /**   * @Title: success   * @Description: 成功  默認(rèn) code : " 0 "   * @param code : 枚舉類代碼   * @param data : 數(shù)據(jù)   **/  public ResultBody success(Code code,T data){    return new ResultBody(code.getCode(),code.getMsg(),data);  }  /**   * @Title: success   * @Description: 成功  默認(rèn) code : " 0 "   * @param code : 枚舉類代碼   **/  public ResultBody success(Code code){    return new ResultBody(code.getCode(),code.getMsg(),null);  }  /**   * @Title: error   * @Description: 錯(cuò)誤  默認(rèn) data : null   * @param code : 錯(cuò)誤代碼   * @param msg : 錯(cuò)誤信息   **/  public ResultBody error(Integer code,String msg){    return new ResultBody(code,msg,null);  }  /**   * @Title: error   * @Description: 錯(cuò)誤  默認(rèn) data : null   * @param code : 枚舉類錯(cuò)誤代碼   **/  public ResultBody error(Code code){    return new ResultBody(code.getCode(),code.getMsg(),null);  }  public Integer getCode() {    return code;  }  public void setCode(Integer code) {    this.code = code;  }  public String getMsg() {    return msg;  }  public void setMsg(String msg) {    this.msg = msg;  }  public Integer getCount() {    return count;  }  public void setCount(Integer count) {    this.count = count;  }  public T getData() {    return data;  }  public void setData(T data) {    this.data = data;  }}

自定義提示枚舉類:

package com.ys.edu.bean;/** * @ClassName Code * @description: 自定義提示枚舉類 **/public enum Code {  /**   * @Description: 請(qǐng)求狀態(tài)碼   **/  SUCCESS(0,"請(qǐng)求成功"),  ERROR(-1,"請(qǐng)求錯(cuò)誤");  private Integer code;  private String msg;  public Integer getCode() {    return code;  }  public void setCode(Integer code) {    this.code = code;  }  public String getMsg() {    return msg;  }  public void setMsg(String msg) {    this.msg = msg;  }  Code(Integer code, String msg){    this.code = code;    this.msg = msg;  }}

返回結(jié)果工具類:

package com.ys.edu.utils;import com.ys.edu.bean.Code;import com.ys.edu.bean.ResultBody;import com.ys.edu.entity.Page;import java.util.HashMap;import java.util.Map;/** * @ClassName ResultUtils * @description: 返回結(jié)果工具類 **/public class ResultUtils {  /**   * @Title: success   * @Description: 無(wú)參成功返回  默認(rèn)值 code : "0" , msg : "請(qǐng)求成功" , count : 0 , data : null   **/  public static ResultBody success(){    return success((Object)null);  }  public static ResultBody success(Object object){    return success(0,object);  }  /**   * @Title: success   * @Description: 有參成功返回  默認(rèn)值 code : "0" , msg : "請(qǐng)求成功"   * @param count : 數(shù)據(jù)條數(shù)   * @param object : 數(shù)據(jù)   **/  public static ResultBody success(Integer count,Object object){    return new ResultBody().success(count,object);  }  /**   * @Title: success   * @Description: 有參成功返回  默認(rèn)值 code : "0"   * @param msg : 提示信息   * @param count : 數(shù)據(jù)條數(shù)   * @param object : 數(shù)據(jù)   **/  public static ResultBody success(String msg,Integer count,Object object){    return new ResultBody().success(msg,count,object);  }  /**   * @Title: error   * @Description: 有參成功返回   默認(rèn)值 code : "0"   * @param code :   * @param object : 數(shù)據(jù)   **/  public static ResultBody success(Code code,Object object){    return new ResultBody().success(code,object);  }  /**   * @Title: error   * @Description: 有參成功返回   默認(rèn)值 code : "0" data : null   * @param code : 枚舉類代碼   **/  public static ResultBody success(Code code){    return new ResultBody().success(code);  }  /**   * @Title: error   * @Description: 錯(cuò)誤返回格式   默認(rèn)值 data : null   * @param code : 錯(cuò)誤代碼   **/  public static ResultBody error(Integer code,String msg){    return new ResultBody().error(code,msg);  }  /**   * @Title: error   * @Description: 錯(cuò)誤返回格式   默認(rèn)值 data : null   * @param code : 枚舉類錯(cuò)誤代碼   **/  public static ResultBody error(Code code){    return new ResultBody().error(code);  }  /**   * @Title: successByLimit   * @Description: 分頁(yè)返回?cái)?shù)據(jù)格式   * @param page : 查詢的頁(yè)數(shù)   * @param limit : 查詢的條數(shù)   * @param totalNum : 數(shù)據(jù)總條數(shù)   * @param curCount : 當(dāng)前頁(yè)條數(shù)   * @param object : 查詢結(jié)果數(shù)據(jù)   **/  public static ResultBody successByLimit(Integer page,Integer limit,Integer totalNum,Integer curCount,Object object){    Map<String,Object> map = new HashMap<>();    Page pageInfo = new Page();    pageInfo.setPage(page);    pageInfo.setLimit(limit);    pageInfo.setTotalNum(totalNum);    pageInfo.setTotalPages((totalNum + limit - 1)/limit);    map.put("page",pageInfo);    map.put("data",object);    return success(curCount,map);  }}

總結(jié)

以上就是這篇文章的全部?jī)?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ā)表
波多野结衣欧美| 色老综合老女人久久久| 欧美牲交a欧美牲交aⅴ免费下载| 亚洲欧美日韩一区在线| 日韩av二区在线播放| 成人网站免费观看| 欧美aa一级| 成人在线观看免费网站| 久久成人在线| 国产精品日韩久久久| 亚洲精品蜜桃久久久久久| 亚洲成av人片一区二区梦乃| 日本在线观看高清完整版| 美女网站久久| caoporen人人| 欧美美女视频| 男女做爰猛烈刺激| 亚洲精品欧美综合四区| 伊人一区二区三区久久精品| 一区二区三区四区在线观看视频| 日韩免费电影网站| 超碰人人人人人人人| 亚洲欧美在线不卡| 亚洲综合视频一区| 久久米奇亚洲| 亚洲大片免费观看| 亚洲欧美另类中文字幕| yw193.com尤物在线| 免费在线观看av片| 久久艹中文字幕| 亚洲黄色性网站| 永久免费在线观看视频| 久久国际精品| 欧美1级片网站| 欧美电影精品一区二区| 波多野结衣一区二区在线| 中文字幕一二区| 在线视频亚洲自拍| 中文字幕+乱码+中文乱码www| 一区二区在线免费视频| 奇米一区二区三区| 26uuu国产在线精品一区二区| 亚洲天堂男人天堂| 青青草国产精品| 这里只有精品9| 久草在线视频精品| 在线观看麻豆视频| 全国精品久久少妇| 亚洲欧洲无码一区二区三区| 亚洲欧美日韩中文字幕在线观看| 国产成人亚洲精品狼色在线| 欧美性极品videosbest| 欧美另类tv| 国产激情一区二区三区在线观看| 中文字幕日韩欧美在线视频| 不卡高清视频专区| 国产资源一区| 99reav2| 国产欧美一区二区三区视频| 国产视频精品自拍| 三日本三级少妇三级99| 国产无人区码熟妇毛片多| 青春草在线视频| 牛牛精品成人免费视频| 91文字幕巨乱亚洲香蕉| 制服 丝袜 综合 日韩 欧美| 国产精品一区二区三区免费| 91麻豆产精品久久久久久夏晴子| 波多野结衣av一区二区全免费观看| 香蕉视频黄色在线观看| 国产欧美一区二区精品性色| 性一交一乱一色一视频麻豆| 男人天堂资源在线| 日韩av在线网| 日韩亚洲欧美中文在线| 中文乱码字幕av网站| 亚洲aaaaaa| 日韩av在线不卡| 亚洲视频在线观看不卡| 国产精品视频xxx| 岛国片免费观看| 国产精成人品2018| 97精品人妻一区二区三区| 最新国产在线观看| 粗暴蹂躏中文一区二区三区| 好吊色视频988gao在线观看| av伊人久久| 一区二区三区高清不卡| 一区二区三区久久久久| 一区二区自拍偷拍| 日日噜噜夜夜狠狠视频| 色综合视频一区二区三区日韩| 精品国产精品三级精品av网址| 日本中文字幕久久| 国产在线一区二区综合免费视频| 国产一级黄色片免费| 在线观看色视频| 精品国产第一页| 色aⅴ色av色av偷拍| 好吊色一区二区| 成人在线免费公开观看视频| 高清免费成人av| 成人性生交大片免费看中文网站| 欧美性大战久久久久久久| 国产精品乱战久久久| 首页亚洲欧美制服丝腿| 神马久久影视大全| 亚洲香蕉成视频在线观看| 国产午夜精品久久久久免费视| 亚洲男人天堂影院| 日本在线观看免费| av在线不卡播放| 日韩视频免费播放| 五月天婷婷激情网| 黄网站app在线观看大全免费视频| youjizz.com在线观看| 秋霞av鲁丝片一区二区| 女人床在线观看| 午夜视频在线网站| 亚洲国产精品一区二区www在线| 在线观看日韩专区| 性欧美极品另类| 日本高清视频网站| 成人羞羞视频播放网站| 天天操天天爽天天射| 色婷婷久久一区二区| 国产伦精品一区二区三区高清版禁| 精品国产第一国产综合精品| av网页在线观看| 日韩免费毛片视频| 亚洲伦理精品| 国产视频久久久久久久| 国产超碰精品| 精品无码久久久久成人漫画| 老熟妇一区二区三区啪啪| 丰满湿润大白屁股bbw按摩| 国产成人午夜视频| 欧美视频在线观看一区二区三区| 欧美伦理视频在线观看| 国产高潮在线| 韩国av免费在线观看| 国产精品第108页| 国产精品jvid在线观看蜜臀| 久久精品国产成人av| 欧美日韩视频在线一区二区观看视频| 亚洲乱色熟女一区二区三区| 91视频国产资源| 亚洲高清在线不卡| 午夜在线视频免费观看| 在线亚洲日本| 69堂成人精品免费视频| 欧美一区二区三区观看| www.亚洲一二| www.爱久久| 日韩av网站在线观看| 亚洲天堂一区二区| 精品高清美女精品国产区| www.玖玖玖| 超碰超碰超碰超碰| 国产精品午夜国产小视频| 日韩电影免费| 1234区中文字幕在线观看| 国产在线成人精品午夜| 国产xxxx视频| 夜夜夜久久久| 国产精品第108页| 婷婷久久国产对白刺激五月99| 欧美三级三级三级爽爽爽| av一级在线观看| jizz欧美| 亚洲成**性毛茸茸| 国产午夜精品美女毛片视频| 亚洲国产成人精品女人久久久| 亚洲国产成人一区二区三区| 国产主播喷水一区二区| 一广人看www在线观看免费视频| 亚洲欧美日本日韩| 欧美综合亚洲图片综合区| 91美女视频在线| 亚洲成人在线观看视频| 久热久精久品这里在线观看| 免费在线一区二区| 日日骚欧美日韩| 黄色一级免费视频| 国产精品对白交换视频| 韩国午夜理伦三级不卡影院| 日韩高清中文字幕| 日本sm极度另类视频| 91日韩精品一区| 91禁男男在线观看| 日韩精品中午字幕| 亚洲人成网站在线| 男人天堂资源网| 国产真实夫妇交换视频| 久一区二区三区| 91久久精品国产91性色tv| 污污视频网站在线免费观看| 91在线小视频| 欧美午夜视频网站| 九九九在线观看视频| 欧美精品一区二区三区国产精品| 亚洲一区二区三区视频| 国产喷水吹潮视频www| 老司机精品在线| 伊人波多野结衣| 久久精品一区二区三区av| 欧美诱惑福利视频| 男女超爽视频免费播放| 国产一区在线看| 久久久久免费av| 日韩有码欧美| 奇米四色…亚洲| 免费看av的网址| 日韩精品一区三区| 欧美日韩综合在线免费观看| 在线视频亚洲专区| 国产精品久久久久久成人| gratisvideos另类灌满| 九色porn蝌蚪| 亚洲欧洲精品一区二区| heyzo高清在线| 在线观看免费不卡av| 91久久精品国产91性色69| 国严精品久久久久久亚洲影视| 成人免费观看男女羞羞视频| 日韩精品水蜜桃| 国产精品第十页| 欧美区视频在线观看| 国产精品com| 男人天堂久久久| 国产在线91| 日本美女爱爱视频| 欧美激情极品| 亚洲精品国产一区黑色丝袜| 免费看久久久| 成年网站免费在线观看| 欧美另类在线观看| 亚洲视频一区二区| 久久精品美女视频| 一个人看的免费视频色| 日韩av黄色在线观看| 欧美大胆的人体xxxx| 午夜国产不卡在线观看视频| 成人国产精品入口免费视频| 国产成人黄色av| 国产精品激情偷乱一区二区∴| 依依成人精品视频| 天堂av8在线| 最新国产成人av网站网址麻豆| 国产剧情日韩欧美| 亚洲人成电影网站色…| 五月婷婷丁香花| 日韩av电影一区| 精品美女在线观看| 麻豆tv入口在线看| 丰满少妇又爽又紧又丰满电影| 人人澡人一摸人人添| 五月天丁香激情| 9i看片成人免费高清| 性色a∨人人爽网站| 在线一级成人| 欧美视频在线观看一区二区三区| 久久婷婷国产91天堂综合精品| 日韩精品中文字幕在线观看| 青青草成人在线观看| 欧美wwww| 国产视频精品一区二区三区| 日本亚洲欧洲色| 久久久久国产精品麻豆ai换脸| 久久91麻豆精品一区| 免费观看久久久4p| 99热这里只有精| 中文一区一区三区免费| 中文字幕免费在线播放| 久久成人精品| 欧美日韩综合视频网址| 国产精品第一页在线| 天天做天天摸天天爽国产一区| 国产高清视频免费在线观看| 国产精品1luya在线播放| 91在线九色porny| 亚洲日本japanese丝袜| 国产精品日韩精品在线播放| 7m第一福利500精品视频| h视频在线免费| 国产精品久久无码一三区| 欧美韩日一区二区三区| av手机在线播放| 亚洲精品永久免费| 在线不卡免费欧美| 日韩啪啪电影网| 精品91免费| chinese偷拍一区二区三区| 粉嫩av一区二区三区免费野| 欧美一区二区三区成人片在线| 风流少妇一区二区| 日本视频网站在线观看| 国产伦精品一区二区三区视频孕妇| 4480yy私人影院高清不卡| 免费在线观看av片| 久久精品视频免费观看| 麻豆一区二区99久久久久| 精品国内一区二区三区免费视频| 欧美一级在线视频| 天天综合久久| 99re在线精品| 视频免费一区二区| 精品日产免费二区日产免费二区| 美国一区二区| 亚洲精品国产视频| 全球av集中精品导航福利| 97电影在线看视频| 欧美日韩一区二区三区在线观看免| 成人午夜电影网站| 岛国最新视频免费在线观看| 欧美激情福利视频在线观看免费| 91视频网入口| 亚洲AV成人无码精电影在线| 三区在线观看| 又黄又爽毛片免费观看| 美女网站色精品尤物极品姐弟| 国产区精品视频| 在线亚洲人成| 国产农村妇女精品一区| 久久黄色av网站| 欧美中文一区二区| 国产精品伦一区二区三区视频| 国产乡下妇女做爰毛片|