3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot Redis 入门

發布時間:2025/3/21 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot Redis 入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文,我們基于 Spring Boot 2.X 版本。

1. 概述

在快速入門 Spring Boot 整合 Redis 之前,我們先來做個簡單的了解。在 Spring 的生態中,我們使用?Spring Data Redis?來實現對 Redis 的數據訪問。

可能這個時候,會有胖友會有疑惑,市面上已經有 Jedis、Redisson、Lettuce 等優秀的 Java Redis 工具庫,為什么還要有 Spring Data Redis 呢?學不動了,頭都要禿了!不要慌,我們先來看一張圖:

  • 對于下層,Spring Data Redis 提供了統一的操作模板(后文中,我們會看到是 RedisTemplate 類),封裝了 Jedis、Lettuce 的 API 操作,訪問 Redis 數據。所以,實際上,Spring Data Redis 內置真正訪問的實際是 Jedis、Lettuce 等 API 操作
  • 對于上層,開發者學習如何使用 Spring Data Redis 即可,而無需關心 Jedis、Lettuce 的 API 操作。甚至,未來如果我們想將 Redis 訪問從 Jedis 遷移成 Lettuce 來,無需做任何的變動。? 相信很多胖友,在選擇 Java Redis 工具庫,也是有過煩惱的。
  • 目前,Spring Data Redis 暫時只支持 Jedis、Lettuce 的內部封裝,而 Redisson 是由?redisson-spring-data?來提供。

OK ,嗶嗶結束,我們先來快速上手下 Spring Data Redis 的使用。

2. 快速入門

示例代碼對應倉庫:spring-data-redis-with-jedis?。

感興趣的胖友可以看看?https://mvnrepository.com/artifact/redis.clients/jedis?地址,會發現 2016 年到 2018 年的 Jedis 更新頻率。所幸,2018 年底又突然復活了。

同時,艿艿目前使用的?SkyWalking?中間件,暫時只支持 Jedis 的自動化的追蹤,那么更加考慮使用 Jedis 啦。

這里在分享一個?Jedis 和 Lettuce?的對比討論。

2.1 引入依賴

在?pom.xml?文件中,引入相關依賴。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent><dependencies><!-- 實現對 Spring Data Redis 的自動化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><!-- 去掉對 Lettuce 的依賴,因為 Spring Boot 優先使用 Lettuce 作為 Redis 客戶端 --><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!-- 引入 Jedis 的依賴,這樣 Spring Boot 實現對 Jedis 的自動化配置 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!-- 方便等會寫單元測試 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 等會示例會使用 fastjson 作為 JSON 序列化的工具 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.61</version></dependency><!-- Spring Data Redis 默認使用 Jackson 作為 JSON 序列化的工具 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies>

具體每個依賴的作用,胖友自己認真看下艿艿添加的所有注釋噢。

2.2 配置文件

在?application.yml?中,添加 Redis 配置,如下:

spring:# 對應 RedisProperties 類redis:host: 127.0.0.1port: 6379password: # Redis 服務器密碼,默認為空。生產中,一定要設置 Redis 密碼!database: 0 # Redis 數據庫號,默認為 0 。timeout: 0 # Redis 連接超時時間,單位:毫秒。# 對應 RedisProperties.Jedis 內部類jedis:pool:max-active: 8 # 連接池最大連接數,默認為 8 。使用負數表示沒有限制。max-idle: 8 # 默認連接數最小空閑的連接數,默認為 8 。使用負數表示沒有限制。min-idle: 0 # 默認連接池最小空閑的連接數,默認為 0 。允許設置 0 和 正數。max-wait: -1 # 連接池最大阻塞等待時間,單位:毫秒。默認為 -1 ,表示不限制。

具體每個參數的作用,胖友自己認真看下艿艿添加的所有注釋噢。

2.3 簡單測試

創建?Test01?測試類,我們來測試一下簡單的 SET 指令。代碼如下:

@RunWith(SpringRunner.class) @SpringBootTest public class Test01 {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void testStringSetKey() {stringRedisTemplate.opsForValue().set("yunai", "shuai");} }

通過 StringRedisTemplate 類,我們進行了一次 Redis SET 指令的執行。關于 StringRedisTemplate 是什么,我們先賣個關子,在?「2.4 RedisTemplate」?中來介紹。

我們先來執行下?#testStringSetKey()?方法這個測試方法。執行完成后,我們在控制臺查詢,看看是否真的執行成功了。

$ redis-cli get yunai "shuai"
  • 請大聲的告訴我,Redis 是怎么夸獎?"yunai"?的,哈哈哈哈。

2.4 RedisTemplate

org.springframework.data.redis.core.RedisTemplate<K, V>?類,從類名上,我們就明明白白知道,提供 Redis 操作模板 API 。核心屬性如下:

// RedisTemplate.java // 艿艿省略了一些不重要的屬性。// <1> 序列化相關屬性 @SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null; private RedisSerializer<String> stringSerializer = RedisSerializer.string();// <2> Lua 腳本執行器 private @Nullable ScriptExecutor<K> scriptExecutor;// <3> 常見數據結構操作類 // cache singleton objects (where possible) private @Nullable ValueOperations<K, V> valueOps; private @Nullable ListOperations<K, V> listOps; private @Nullable SetOperations<K, V> setOps; private @Nullable ZSetOperations<K, V> zSetOps; private @Nullable GeoOperations<K, V> geoOps; private @Nullable HyperLogLogOperations<K, V> hllOps;
  • <1>?處,看到了四個序列化相關的屬性,用于 KEY 和 VALUE 的序列化。
    • 例如說,我們在使用 POJO 對象存儲到 Redis 中,一般情況下,會使用 JSON 方式序列化成字符串,存儲到 Redis 中。詳細的,我們在?「3. 序列化」?小節中來說明。
    • 在上文中,我們看到了?org.springframework.data.redis.core.StringRedisTemplate?類,它繼承 RedisTemplate 類,使用?org.springframework.data.redis.serializer.StringRedisSerializer?字符串序列化方式。直接點開 StringRedisSerializer 源碼,看下它的構造方法,瞬間明明白白。
  • <2>?處,Lua 腳本執行器,提供?Redis scripting?API 操作。
  • <3>?處,Redis 常見數據結構操作類。
    • ValueOperations?類,提供?Redis String?API 操作。
    • ListOperations?類,提供?Redis List?API 操作。
    • SetOperations?類,提供?Redis Set?API 操作。
    • ZSetOperations?類,提供?Redis ZSet(Sorted Set)?API 操作。
    • GeoOperations?類,提供?Redis Geo?API 操作。
    • HyperLogLogOperations?類,提供?Redis HyperLogLog?API 操作。

那么 Pub/Sub、Transaction、Pipeline、Keys、Cluster、Connection 等相關的 API 操作呢?它在 RedisTemplate 自身提供,因為它們不屬于具體每一種數據結構,所以沒有封裝在對應的 Operations 類中。哈哈哈,胖友打開?RedisTemplate?類,去瞅瞅,妥妥的明白。

3. 序列化

艿艿:為了盡量把序列化說的清楚一些,所以本小節內容會略長。

因為有些地方,直接擼源碼,比嚇嗶嗶一段話更易懂,所以會有一些源碼,保持淡定。

3.1 RedisSerializer

org.springframework.data.redis.serializer.RedisSerializer?接口,Redis 序列化接口,用于 Redis KEY 和 VALUE 的序列化。簡化代碼如下:

// RedisSerializer.java public interface RedisSerializer<T> {@Nullablebyte[] serialize(@Nullable T t) throws SerializationException;@NullableT deserialize(@Nullable byte[] bytes) throws SerializationException;}
  • 定義了對象?<T>?和二進制數組的轉換。
  • 啊,可能有胖友會有疑惑了:我們在?redis-cli?終端,看到的不都是字符串么,怎么這里是序列化成二進制數組呢?實際上,Redis Client 傳遞給 Redis Server 是傳遞的 KEY 和 VALUE 都是二進制值數組。好奇的胖友,可以打開 Jedis?Connection#sendCommand(final Command cmd, final byte[]... args)?方法,傳入的參數就是二進制數組,而?cmd?命令也會被序列化成二進制數組。

RedisSerializer 的實現類,如下圖:

主要分成四類:

  • JDK 序列化方式
  • String 序列化方式
  • JSON 序列化方式
  • XML 序列化方式

3.1.1 JDK 序列化方式

org.springframework.data.redis.serializer.JdkSerializationRedisSerializer?,默認情況下,RedisTemplate 使用該數據列化方式。具體的,可以看看?RedisTemplate#afterPropertiesSet()?方法,在 RedisTemplate 未設置序列化的情況下,使用 JdkSerializationRedisSerializer 作為序列化實現。在 Spring Boot 自動化配置 RedisTemplate Bean 對象時,就未設置。

絕大多數情況下,可能 99.9999% ,我們不會使用 JdkSerializationRedisSerializer 進行序列化。為什么呢?我們來看一個示例,代碼如下:

// Test01.java @RunWith(SpringRunner.class) @SpringBootTest public class Test01 {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testStringSetKey02() {redisTemplate.opsForValue().set("yunai", "shuai");}}

我們先來執行下?#testStringSetKey02()?方法這個測試方法。注意,此處我們使用的是 RedisTemplate 而不是 StringRedisTemplate 。執行完成后,我們在控制臺查詢,看看是否真的執行成功了。

# 在 `redis-cli` 終端中127.0.0.1:6379> scan 0 1) "0" 2) 1) "\xac\xed\x00\x05t\x00\x05yunai"127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x05yunai" "\xac\xed\x00\x05t\x00\x05shuai"
  • 具體為什么是這樣一串奇怪的 16 進制,胖友可以看看?ObjectOutputStream#writeString(String str, boolean unshared)?的代碼,實際就是標志位 + 字符串長度 + 字符串內容。

對于 KEY 被序列化成這樣,我們線上通過 KEY 去查詢對應的 VALUE 勢必會非常不方便,所以 KEY 肯定是不能被這樣序列化的。

對于 VALUE 被序列化成這樣,除了閱讀可能困難一點,不支持跨語言外,實際上也沒啥問題。不過,實際線上場景,還是使用 JSON 序列化居多。

3.1.2 String 序列化方式

①?org.springframework.data.redis.serializer.StringRedisSerializer?,字符串和二進制數組的直接轉換。代碼如下:

// StringRedisSerializer.javaprivate final Charset charset;@Override public String deserialize(@Nullable byte[] bytes) {return (bytes == null ? null : new String(bytes, charset)); }@Override public byte[] serialize(@Nullable String string) {return (string == null ? null : string.getBytes(charset)); }
  • 是不是很直接簡單。

絕大多數情況下,我們 KEY 和 VALUE 都會使用這種序列化方案。而 VALUE 的序列化和反序列化,自己在邏輯調用 JSON 方法去序列化。為什么呢?繼續往下看。

②?org.springframework.data.redis.serializer.GenericToStringSerializer<T>?,使用 Spring?ConversionService?實現?<T>?對象和 String 的轉換,從而 String 和二進制數組的轉換。

例如說,序列化的過程,首先?<T>?對象通過 ConversionService 轉換成 String ,然后 String 再序列化成二進制數組。反序列化的過程,胖友自己結合源碼思考下 ? 。

當然,GenericToStringSerializer 貌似基本不會去使用,所以不用去了解也問題不大,哈哈哈。

3.1.3 JSON 序列化方式

①?org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer?,使用 Jackson 實現 JSON 的序列化方式,并且從 Generic 單詞可以看出,是支持所有類。怎么體現呢?參見構造方法的代碼:

// GenericJackson2JsonRedisSerializer.javapublic GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {this(new ObjectMapper());// simply setting {@code mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)} does not help here since we need// the type hint embedded for deserialization using the default typing feature.mapper.registerModule(new SimpleModule().addSerializer(new NullValueSerializer(classPropertyTypeName)));// <1> if (StringUtils.hasText(classPropertyTypeName)) {mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);// <2> } else {mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);} }
  • <1>?處,如果傳入了?classPropertyTypeName?屬性,就是使用使用傳入對象的?classPropertyTypeName?屬性對應的值,作為默認類型(Default Typing)。
  • <2>?處,如果未傳入?classPropertyTypeName?屬性,則使用傳入對象的類全名,作為默認類型(Default Typing)。

那么,胖友可能會問題,什么是**默認類型(Default Typing)**呢?我們來思考下,在將一個對象序列化成一個字符串,怎么保證字符串反序列化成對象的類型呢?Jackson 通過 Default Typing ,會在字符串多冗余一個類型,這樣反序列化就知道具體的類型了。來舉個例子,使用我們等會示例會用到的?UserCacheObject?類。

  • 標準序列化的結果,如下:

    {"id": 1,"name": "芋道源碼","gender": 1 }

    ?

  • 使用 Jackson Default Typing 機制序列化的結果,如下:

    {"@class": "cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject.UserCacheObject","id": 1,"name": "芋道源碼","gender": 1}
    • 看?@class?屬性,反序列化的對象的類型不就有了么?

下面我們來看一個 GenericJackson2JsonRedisSerializer 的示例。在看之前,胖友先跳到?「3.2 配置序列化方式」?小節,來看看如何配置 GenericJackson2JsonRedisSerializer 作為 VALUE 的序列化方式。然后,馬上調回到此處。

示例代碼如下:

// Test01.java@Autowired private RedisTemplate redisTemplate;@Test public void testStringSetKeyUserCache() {UserCacheObject object = new UserCacheObject().setId(1).setName("芋道源碼").setGender(1); // 男String key = String.format("user:%d", object.getId());redisTemplate.opsForValue().set(key, object); }@Test public void testStringGetKeyUserCache() {String key = String.format("user:%d", 1);Object value = redisTemplate.opsForValue().get(key);System.out.println(value); }

胖友分別執行?#testStringSetKeyUserCache()?和?#testStringGetKeyUserCache()?方法,然后對著 Redis 的結果看看,比較簡單,就不多嗶嗶了。

我們在回過頭來看看?@class?屬性,它看似完美解決了反序列化后的對象類型,但是帶來 JSON 字符串占用變大,所以實際項目中,我們也并不會采用 Jackson2JsonRedisSerializer 類。

②?org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer<T>?,使用 Jackson 實現 JSON 的序列化方式,并且顯示指定?<T>?類型。代碼如下:

// Jackson2JsonRedisSerializer.java public class Jackson2JsonRedisSerializer<T> implements RedisSerializer<T> {// ... 省略不重要的代碼public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;/*** 指定類型,和 <T> 要一致。*/private final JavaType javaType;private ObjectMapper objectMapper = new ObjectMapper();}

因為 Jackson2JsonRedisSerializer 序列化類里已經聲明了類型,所以序列化的 JSON 字符串,無需在存儲一個?@class?屬性,用于存儲類型。

但是,我們摳腳一想,如果使用 Jackson2JsonRedisSerializer 作為序列化實現類,那么如果我們類型比較多,豈不是每個類型都要定義一個 RedisTemplate Bean 了?!所以實際場景下,我們也并不會使用 Jackson2JsonRedisSerializer 類。?

注意,GenericFastJsonRedisSerializer 不是 Spring Data Redis 內置實現,而是由?FastJSON 自己實現。

3.1.4 XML 序列化方式

org.springframework.data.redis.serializer.OxmSerializer?,使用 Spring?OXM?實現將對象和 String 的轉換,從而 String 和二進制數組的轉換。

因為 XML 序列化方式,暫時沒有這么干過,我自己也沒有,所以就直接忽略它吧。?

3.2 配置序列化方式

創建 RedisConfiguration 配置類,代碼如下:

@Configuration public class RedisConfiguration {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {// 創建 RedisTemplate 對象RedisTemplate<String, Object> template = new RedisTemplate<>();// 設置 RedisConnection 工廠。? 它就是實現多種 Java Redis 客戶端接入的秘密工廠。感興趣的胖友,可以自己去擼下。template.setConnectionFactory(factory);// 使用 String 序列化方式,序列化 KEY 。template.setKeySerializer(RedisSerializer.string());// 使用 JSON 序列化方式(庫是 Jackson ),序列化 VALUE 。template.setValueSerializer(RedisSerializer.json());return template;}}
  • RedisSerializer#string()?靜態方法,返回的就是使用 UTF-8 編碼的 StringRedisSerializer 對象。代碼如下:

    // RedisSerializer.java static RedisSerializer<String> string() {return StringRedisSerializer.UTF_8; }// StringRedisSerializer.java public static final StringRedisSerializer ISO_8859_1 = new StringRedisSerializer(StandardCharsets.ISO_8859_1);
  • RedisSerializer#json()?靜態方法,返回 GenericJackson2JsonRedisSerializer 對象。代碼如下:

    // RedisSerializer.javastatic RedisSerializer<Object> json() {return new GenericJackson2JsonRedisSerializer(); }

3.3 自定義 RedisSerializer 實現類

我們直接以 GenericFastJsonRedisSerializer 舉例子,直接莽源碼。代碼如下:

// GenericFastJsonRedisSerializer.javapublic class GenericFastJsonRedisSerializer implements RedisSerializer<Object> {private final static ParserConfig defaultRedisConfig = new ParserConfig();static { defaultRedisConfig.setAutoTypeSupport(true);}public byte[] serialize(Object object) throws SerializationException {// 空,直接返回空數組if (object == null) {return new byte[0];}try {// 使用 JSON 進行序列化成二進制數組,同時通過 SerializerFeature.WriteClassName 參數,聲明寫入類全名。return JSON.toJSONBytes(object, SerializerFeature.WriteClassName);} catch (Exception ex) {throw new SerializationException("Could not serialize: " + ex.getMessage(), ex);}}public Object deserialize(byte[] bytes) throws SerializationException {// 如果為空,則返回空對象if (bytes == null || bytes.length == 0) {return null;}try {// 使用 JSON 解析成對象。return JSON.parseObject(new String(bytes, IOUtils.UTF8), Object.class, defaultRedisConfig);} catch (Exception ex) {throw new SerializationException("Could not deserialize: " + ex.getMessage(), ex);}} }

完成自定義 RedisSerializer 配置類后,我們就可以參照?「3.2 配置序列化方式」?小節,將 VALUE 序列化的修改成我們的,哈哈哈。

4. 項目實踐

本小節,我們來分享我們在生產中的一些實踐。關于這塊,希望大家可以一起討論,能夠讓我們的代碼更加優雅干凈。

4.1 Cache Object

在我們使用數據庫時,我們會創建?dataobject?包,存放 DO(Data Object)數據庫實體對象。

那么同理,我們緩存對象,怎么進行對應呢?對于復雜的緩存對象,我們創建了?cacheobject?包,和?dataobject?包同層。如:

service # 業務邏輯層 dao # 數據庫訪問層 dataobject # DO cacheobject # 緩存對象

并且所有的 Cache Object 對象使用 CacheObject 結尾,例如說 UserCacheObject、ProductCacheObject 。

4.2 數據訪問層

在我們訪問數據庫時,我們會創建?dao?包,存放每個 DO 對應的 Dao 類。那么對于每一個 CacheObject 類,我們也會創建一個其對應的 Dao 類。例如說,UserCacheObject 對應 UserCacheObjectDao 類。示例代碼如下:

@Repository public class UserCacheDao {private static final String KEY_PATTERN = "user:%d"; // user:用戶編號 <1>@Resource(name = "redisTemplate")@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")private ValueOperations<String, String> operations; // <2>private static String buildKey(Integer id) { // <3>return String.format(KEY_PATTERN, id);}public UserCacheObject get(Integer id) {String key = buildKey(id);String value = operations.get(key);return JSONUtil.parseObject(value, UserCacheObject.class);}public void set(Integer id, UserCacheObject object) {String key = buildKey(id);String value = JSONUtil.toJSONString(object);operations.set(key, value);}}
  • <1>?處,通過靜態變量,聲明 KEY 的前綴,并且使用冒號作為間隔
  • <3>?處,聲明?KEY_PATTERN?對應的 KEY 拼接方法,避免散落在每個方法中。
  • <2>?處,通過?@Resource?注入指定名字的 RedisTemplate 對應的 Operations 對象,這樣明確每個 KEY 的類型。
  • 剩余的,就是每個方法封裝對應的操作。

可能會有胖友問,為什么不支持將 RedisTemplate 直接在 Service 業務層調用呢?如果這樣,我們業務代碼里,就容易混雜著很多 Redis 訪問代碼的細節,導致很臟亂。我們試著把 RedisTemplate 想象成 Spring JDBCTemplate ,我們一定會聲明對應的 Dao 類,訪問數據庫。所以,同理咯。

那么還有一個問題,UserCacheDao 放在哪個包下?目前的想法是,將?dao?包下拆成?mysql、redis?包。這樣,MySQL 相關的 Dao 放在?mysql?包下,Redis 相關的 Dao 放在?redis?。

4.3 序列化

在?「3. 序列化」?小節中,我們仔細翻看了每個序列化方式,暫時沒有一個能夠完美的契合我們的需求,所以我們直接使用最簡單的?StringRedisSerializer?作為序列化實現類。而真正的序列化,我們在各個 Dao 類里,自己手動來調用。

例如說,在 UserCacheDao 示例中,已經看到了這么做了。這里還有一個細化點,雖然我們是自己手動序列化,可以自己簡單封裝一個?JSONUtil?類,未來如果我們想換 JSON 庫,就比較方便了。其實,這個和 Spring Data Redis 所做的封裝是一個思路。

5. 示例補充

像 String、List、Set、ZSet、Geo、HyperLogLog 等等數據結構的操作,胖友自己去用用對應的 Operations 操作類的 API 方法,就非常容易懂了,我們更多的,補充 Pipeline、Transaction、Pub/Sub、Script 等等功能的示例。

5.1 Pipeline

如果胖友沒有了解過 Redis 的 Pipeline 機制,可以看看?《Redis 文檔 —— Pipeline》?文章,批量操作,提升性能必備神器。

在 RedisTemplate 類中,提供了 2 組四個方法,用于執行 Redis Pipeline 操作。代碼如下:

// <1> 基于 Session 執行 Pipeline @Override public List<Object> executePipelined(SessionCallback<?> session) {return executePipelined(session, valueSerializer); } @Override public List<Object> executePipelined(SessionCallback<?> session, @Nullable RedisSerializer<?> resultSerializer) {// ... 省略代碼 }// <2> 直接執行 Pipeline @Override public List<Object> executePipelined(RedisCallback<?> action) {return executePipelined(action, valueSerializer); } @Override public List<Object> executePipelined(RedisCallback<?> action, @Nullable RedisSerializer<?> resultSerializer) {// ... 省略代碼 }
  • 兩組方法的差異,在于是否是 Session 中執行。那么 Session 是什么呢?賣個關子,在?「5.3 Session」?中來詳細解析。本小節,我們只講 Pipeline + RedisCallback 的組合的方法。
  • 每組方法里,差別在于是否傳入 RedisSerializer 參數。如果不傳,則使用 RedisTemplate 自己的序列化相關的屬性。

5.1.1 源碼解讀

在看具體的?#executePipelined(RedisCallback<?> action, ...)?方法的示例之前,我們先來看一波源碼,這樣我們才能更好的理解具體的使用方法。代碼如下:

// RedisTemplate.java @Override public List<Object> executePipelined(RedisCallback<?> action, @Nullable RedisSerializer<?> resultSerializer) {// <1> 執行 Redis 方法return execute((RedisCallback<List<Object>>) connection -> {// <2> 打開 pipeline connection.openPipeline();boolean pipelinedClosed = false; // 標記 pipeline 是否關閉try {// <3> 執行Object result = action.doInRedis(connection);// <4> 不要返回結果if (result != null) {throw new InvalidDataAccessApiUsageException("Callback cannot return a non-null value as it gets overwritten by the pipeline");}// <5> 提交 pipeline 執行List<Object> closePipeline = connection.closePipeline();pipelinedClosed = true;// <6> 反序列化結果,并返回return deserializeMixedResults(closePipeline, resultSerializer, hashKeySerializer, hashValueSerializer);} finally {if (!pipelinedClosed) {connection.closePipeline();}}}); }
  • <1>?處,調用?#execute(RedisCallback<T> action)?方法,執行 Redis 方法。注意,此處傳入的?action?參數,不是我們傳入的 RedisCallback 參數。我們的會在該?action?中被執行。
  • <2>?處,調用?RedisConnection#openPipeline()?方法,自動打開 Pipeline 模式。這樣,我們就不需要手動去打開了。
  • <3>?處,調用我們傳入的實現的?RedisCallback#doInRedis(RedisConnection connection)?方法,執行在 Pipeline 中,想要執行的 Redis 操作。
  • <4>?處,不要返回結果。因為 RedisCallback 是統一定義的接口,所以可以返回一個結果。但是在 Pipeline 中,未提交執行時,顯然是沒有結果,返回也沒有意思。簡單來說,就是我們在實現?RedisCallback#doInRedis(RedisConnection connection)?方法時,返回?null?即可。
  • <5>?處,調用?RedisConnection#closePipeline()?方法,自動提交 Pipeline 執行,并返回執行結果。
  • <6>?處,反序列化結果,并返回 Pipeline 結果。

至此,Spring Data Redis 對 Pipeline 的封裝,我們已經做了一個簡單的了解,實際就是經典的“模板方法”設計模式化的應用。下面,在讓我們來看看?org.springframework.data.redis.core.RedisCallback<T>?接口,Redis 回調接口。代碼如下:

// RedisCallback.java public interface RedisCallback<T> {/*** Gets called by {@link RedisTemplate} with an active Redis connection. Does not need to care about activating or* closing the connection or handling exceptions.** @param connection active Redis connection* @return a result object or {@code null} if none* @throws DataAccessException*/@NullableT doInRedis(RedisConnection connection) throws DataAccessException; }
  • 雖然接口名是以 Callback 結尾,但是通過?#doInRedis(RedisConnection connection)?方法可以很容易知道,實際可以理解是 Redis Action ,想要執行的 Redis 操作。

  • 有一點要注意,傳入的?connection?參數是 RedisConnection 對象,它提供的?'low level'?更底層的 Redis API 操作。例如說:

    // RedisStringCommands.java // RedisConnection 實現 RedisStringCommands 接口byte[] get(byte[] key);Boolean set(byte[] key, byte[] value);
    • 傳入和返回的是二進制數組,實際就是 RedisTemplate 已經序列化的入參和會被反序列化的出參。

5.1.2 具體示例

示例代碼對應測試類:PipelineTest?。

創建?PipelineTest?單元測試類,編寫代碼如下:

// PipelineTest.java@RunWith(SpringRunner.class) @SpringBootTest public class PipelineTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test01() {List<Object> results = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {// set 寫入for (int i = 0; i < 3; i++) {connection.set(String.format("yunai:%d", i).getBytes(), "shuai".getBytes());}// getfor (int i = 0; i < 3; i++) {connection.get(String.format("yunai:%d", i).getBytes());}// 返回 null 即可return null;}});// 打印結果System.out.println(results);} }

執行?#test01()?方法,結果如下:

[true, true, true, shuai, shuai, shuai]
  • 因為我們使用 StringRedisTemplate 自己的序列化相關屬性,所以 Redis GET 命令返回的二進制,被反序列化成了字符串。

5.2 Transaction

基情提示:實際項目實戰中,Redis Transaction 事務基本不用,至少問了一些胖友,包括自己,都沒有再用。所以呢,本小節可以選擇性看看。或者,就不看,哈哈哈哈。

在看 Redis Transaction 事務之前,我們先回想下 Spring 是如何管理數據庫 Transaction?的。在應用程序中處理一個請求時,如果我們的方法開啟Trasaction 功能,Spring 會把數據庫的 Connection 連接和當前線程進行綁定,從而實現 Connection 打開一個 Transaction 后,所有當前線程的數據庫操作都在該 Connection 上執行,達到所有操作在這個 Transaction 中,最終提交或回滾。

在 Spring Data Redis 中,實現 Redis Transaction 也是這個思路。通過 SessionCallback 操作 Redis 時,會從當前線程獲得 Redis Connection ,如果獲取不到,則會去“創建”一個 Redis Connection 并綁定到當前線程中。這樣,我們在該 Redis Connection 開啟 Redis Transaction 后,在該線程的所有操作,都可以在這個 Transaction 中,最后交由 Spring 事務管理器統一提供或回滾 Transaction 。

如果想要使用 Redis Transaction 功能,需要創建 RedisTemplate Bean 時,設置其?enableTransactionSupport?屬性為?true?,默認為?false?不開啟。示例如下:

@Configuration public class RedisConfiguration {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {// 創建 RedisTemplate 對象RedisTemplate<String, Object> template = new RedisTemplate<>();// 【重要】設置開啟事務支持template.setEnableTransactionSupport(true);// 設置 RedisConnection 工廠。? 它就是實現多種 Java Redis 客戶端接入的秘密工廠。感興趣的胖友,可以自己去擼下。template.setConnectionFactory(factory);// 使用 String 序列化方式,序列化 KEY 。template.setKeySerializer(RedisSerializer.string());// 使用 JSON 序列化方式(庫是 Jackson ),序列化 VALUE 。template.setValueSerializer(RedisSerializer.json());return template;}}

5.2.1 源碼解析

概念和原理層面的東西,一旦復雜,就會特別抽象,那么還是老規矩,讓我們一起擼下源碼,讓原理具象化。很多時候,這就是為什么我們要去擼源碼的意義。

我們先來看看,配置下?enableTransactionSupport?屬性,Redis 在執行命令,是如何獲得 Connection 連接的。代碼如下:

// RedisTemplate.javapublic <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it");Assert.notNull(action, "Callback object must not be null");RedisConnectionFactory factory = getRequiredConnectionFactory();RedisConnection conn = null;try {// <1.1>if (enableTransactionSupport) {// only bind resources in case of potential transaction synchronizationconn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport);} else {// <1.2>conn = RedisConnectionUtils.getConnection(factory);}// ... 省略中間,執行 Redis 命令的代碼。} finally {// <2>RedisConnectionUtils.releaseConnection(conn, factory);} }
  • 考慮到盡量讓內容簡單一些,我們不會對每一行代碼做特別的深究,主要是保證胖友對 Spring Data Redis 對 Transaction 的封裝,有個總體了解。
  • <1.2>?處,當我們開啟?enableTransactionSupport?事務時,調用?RedisConnectionUtils#getConnection(factory)?方法,獲得 Redis Connection 。如果獲取不到,則進行創建。
  • <1.1>?處,當我們開啟?enableTransactionSupport?事務時,調用?RedisConnectionUtils#bindConnection(RedisConnectionFactory factory, boolean enableTranactionSupport)?方法,在?RedisConnectionUtils#getConnection(factory)?的基礎上,如果是創建的 Redis Connection ,會綁定到當前線程中。因為 Transaction 是需要在 Connection 打開,然后后續的 Redis 的操作,都需要在其上。并且,還有一個非常重要的操作,打開 Redis Transaction ,會在該方法中,通過調用?RedisConnectionUtils#potentiallyRegisterTransactionSynchronisation(RedisConnectionHolder connHolder, final RedisConnectionFactory factory)?。
  • <2>?處,調用?RedisConnectionUtils#releaseConnection(RedisConnection conn, RedisConnectionFactory factory)?方法,釋放 Redis Connection 。當然,這是有一個前提,整個 Transaction 已經完成。如果未完成,實際 Redis Connection 不會釋放。

那么,此時會有胖友有疑問,Redis Transaction 的提交和回滾在哪呢?答案在 RedisConnectionUtils 的內部類 RedisTransactionSynchronizer 中。代碼如下:

// RedisConnectionUtils.javaprivate static class RedisTransactionSynchronizer extends TransactionSynchronizationAdapter {private final RedisConnectionHolder connHolder;private final RedisConnection connection;private final RedisConnectionFactory factory;@Overridepublic void afterCompletion(int status) {try {switch (status) {// 提交 case TransactionSynchronization.STATUS_COMMITTED:connection.exec();break;// 回滾case TransactionSynchronization.STATUS_ROLLED_BACK:case TransactionSynchronization.STATUS_UNKNOWN:default:connection.discard();}} finally {connHolder.setTransactionSyncronisationActive(false);connection.close();TransactionSynchronizationManager.unbindResource(factory);}} }
  • 根據事務結果的狀態,進行 Redis Transaction 提交或回滾。? 如果想進一步的深入,胖友就需要去了解 Spring Transaction 的源碼。

5.2.2 具體示例

示例代碼對應測試類:TransactionTest?。

創建 TransactionTest 單元測試類,編寫代碼如下:

// TransactionTest.java@RunWith(SpringRunner.class) @SpringBootTest public class TransactionTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Test // @Transactionalpublic void test01() {// 這里是偷懶,沒在 RedisConfiguration 配置類中,設置 stringRedisTemplate 開啟事務。stringRedisTemplate.setEnableTransactionSupport(true);// 執行想要的操作stringRedisTemplate.opsForValue().set("yunai:1", "shuai");stringRedisTemplate.opsForValue().set("yudaoyuanma:1", "dai");} }

目前這僅僅是一個示例。因為 Redis Transaction?實際創建事務的前提,是當前已經存在 Spring Transaction 。具體可以看看傳送門處的判斷的代碼。? 略感神奇,不曉得為什么是這樣的設定。

5.2.3 補充資料

如果覺得還是無法理解的胖友,可以在看看如下幾篇文章:

  • 《Spring Data Redis(Redis Transactions)》
  • 《Redis 之坑:spring-data-redis 中的 Redis 事務》
  • 《Spring Data Redis 事務專題》

5.2.4 閑話兩句

實際場景下,如果胖友有 Redis 事務的訴求,建議把事務的、和非事務的 RedisTemplate 拆成兩個連接池,相互獨立。主要原因有兩個:

  • 1)Spring Data Redis 的事務設計,是將其融入到 Spring 整個 Transaction 當中。一般來說,Spring Transaction 中,肯定會存在數據庫的 Transaction 。考慮到數據庫操作相比 Redis 來說,肯定是慢得多,那么就會導致 Redis 的 Connection 一直被當前 Transaction 占用著。
  • 2)How can i eliminate getting junk value through redis get command?

5.3 Session

首先,我們需要澄清下,Session 不是 Redis 的功能,而是 Spring Data Redis 封裝的一個功能。一次 Session ,代表通過同一個 Redis Connection 執行一系列的 Redis 操作。

在?「5.2.1 源碼解析」?中,我們可以發現,如果我們在一個 Redis Transaction 中的時候,所有 Redis 操作都使用同一個 Redis Connection ,因為我們會將獲得到的 Connection 綁定到當前線程中。

但是,如果我們不在一個 Redis Transaction 中的時候,我們每一次使用 Redis Operations 執行 Redis 操作的時候,每一次都會獲取一次 Redis Connection 的獲取。實際項目中,我們必然會使用 Redis Connection 連接池,那么在獲取的時候,會存在一定的競爭,會有資源上的消耗。那么,如果我們希望已知我們要執行一個系列的 Redis 操作,能不能使用同一個 Redis Connection ,避免重復獲取它呢?答案是有,那就是 Session 。

當我們要執行在同一個 Session 里的操作時,我們通過實現?org.springframework.data.redis.core.SessionCallback<T>?接口,其代碼如下:

// SessionCallback.javapublic interface SessionCallback<T> {@Nullable<K, V> T execute(RedisOperations<K, V> operations) throws DataAccessException; }
  • 相比 RedisCallback 來說,總體是比較相似的。但是比較友好的是,它的入參?operations?是?org.springframework.data.redis.core.RedisOperations?接口類型,而 RedisTemplate 的各種操作,實際就是在 RedisOperations 接口中定義,由 RedisTemplate 來實現。所以使用上也會更加便利。
  • 實際上,我們在實現 RedisCallback 接口,也能實現在同一個 Connection 執行一系列的 Redis 操作,因為 RedisCallback 的入參本身就是一個 Redis Connection 。

5.3.1 源碼解析

在生產中,Transaction 和 Pipeline 會經常一起使用,從而提升性能。所以在?RedisTemplate#executePipelined(SessionCallback<?> session, ...)?方法中,提供了這種的功能。而在這個方法的實現上,本質和?RedisTemplate#executePipelined(RedisCallback<?> action, ...)?方法是基本一致的,差別在于這一行?,替換成了調用?#executeSession(SessionCallback<?> session)?方法。所以,我們來直接來看被調用的這個方法的實現。代碼如下:

// RedisTemplate.java@Override public <T> T execute(SessionCallback<T> session) {Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it");Assert.notNull(session, "Callback object must not be null");RedisConnectionFactory factory = getRequiredConnectionFactory();// bind connection// <1> 獲得并綁定 Connection 。RedisConnectionUtils.bindConnection(factory, enableTransactionSupport);try {// <2> 執行定義的一系列 Redis 操作return session.execute(this);} finally {// <3> 釋放并解綁 Connection 。RedisConnectionUtils.unbindConnection(factory);} }
  • <1>?處,調用?RedisConnectionUtils#bindConnection(RedisConnectionFactory factory, boolean enableTranactionSupport)?方法,實際和我們開啟?enableTranactionSupport?事務時候,獲取 Connection 和處理的方式,是一模一樣的。也就是說:
    • 如果當前線程已經有一個綁定的 Connection 則直接使用(例如說,當前正在 Redis Transaction 事務中);
    • 如果當前線程未綁定一個 Connection ,則進行創建并綁定到當前線程。甚至,如果此時是配置開啟?enableTranactionSupport?事務的,那么此處就會觸發 Redis Transaction 的開啟。
  • <2>?處,調用?SessionCallback#execute(RedisOperations<K, V> operations)?方法,執行我們定義的一系列的 Redis 操作。看看此處傳入的參數是?this?,是不是仿佛更加明白點什么了?
  • <3>?處,調用?RedisConnectionUtils#unbindConnection(RedisConnectionFactory factory)?方法,釋放并解綁 Connection 。當前,前提是當前不存在激活的 Redis Transaction ,不然不就提早釋放了嘛。

恩,現在胖友在回過頭,好好在想一想 Pipeline、Transaction、Session 之間的關系,以及組合排列。之后,我們在使用上,會更加得心應手。

5.3.2 具體示例

示例代碼對應測試類:SessionTest?。

創建?SessionTest?單元測試類,編寫代碼如下:

// SessionTest.java@RunWith(SpringRunner.class) @SpringBootTest public class SessionTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test01() {String result = stringRedisTemplate.execute(new SessionCallback<String>() {@Overridepublic String execute(RedisOperations operations) throws DataAccessException {for (int i = 0; i < 100; i++) {operations.opsForValue().set(String.format("yunai:%d", i), "shuai02");}return (String) operations.opsForValue().get(String.format("yunai:%d", 0));}});System.out.println("result:" + result);}}

執行?#test01()?方法,結果如下:

result:shuai02
  • 臥槽,一直被 Redis 夸獎,已經超級不好意思了。

5.4 Pub/Sub

Redis 提供了 Pub/Sub 功能,實現簡單的訂閱功能,不了解的胖友,可以看看?「Redis 文檔 —— Pub/Sub」?。

5.4.1 源碼解析

暫時不提供,感興趣的胖友,可以自己看看最核心的?org.springframework.data.redis.listener.RedisMessageListenerContainer?類,Redis 消息監聽器容器,基于 Pub/Sub 的?SUBSCRIBE、PSUBSCRIBE?命令實現,我們只需要添加相應的?org.springframework.data.redis.connection.MessageListener?即可。不算復雜,1000 多行,只要調試下核心的功能即可。

5.4.2 具體示例

示例代碼對應測試類:PubSubTest?。

Spring Data Redis 實現 Pub/Sub 的示例,主要分成兩部分:

  • 配置 RedisMessageListenerContainer Bean 對象,并添加我們自己實現的 MessageListener 對象,用于監聽處理相應的消息。
  • 使用 RedisTemplate 發布消息。

下面,我們通過四個步驟,來實現一個簡單的示例。

第一步,了解 Topic

org.springframework.data.redis.listener.Topic?接口,表示 Redis 消息的 Topic 。它有兩個子類實現:

  • ChannelTopic :對應?SUBSCRIBE?訂閱命令。
  • PatternTopic :對應?PSUBSCRIBE?訂閱命令。

第二步,實現 MessageListener 類

創建?TestChannelTopicMessageListener?類,編寫代碼如下:

public class TestPatternTopicMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {System.out.println("收到 PatternTopic 消息:");System.out.println("線程編號:" + Thread.currentThread().getName());System.out.println("message:" + message);System.out.println("pattern:" + new String(pattern));}}
  • message?參數,可獲得到具體的消息內容,不過是二進制數組,需要我們自己序列化。具體可以看下?org.springframework.data.redis.connection.DefaultMessage?類。
  • pattern?參數,發布的 Topic 的內容。

有一點要注意,默認的 RedisMessageListenerContainer 情況下,MessageListener 是并發消費,在線程池中執行(具體見傳送門代碼)。所以如果想相同 MessageListener?串行消費,可以在方法上加?synchronized?修飾,來實現同步。

第三步,創建 RedisMessageListenerContainer Bean

在 RedisConfiguration 中,配置 RedisMessageListenerContainer Bean 。代碼如下:

// RedisConfiguration.java@Bean public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory factory) {// 創建 RedisMessageListenerContainer 對象RedisMessageListenerContainer container = new RedisMessageListenerContainer();// 設置 RedisConnection 工廠。? 它就是實現多種 Java Redis 客戶端接入的秘密工廠。感興趣的胖友,可以自己去擼下。container.setConnectionFactory(factory);// 添加監聽器container.addMessageListener(new TestChannelTopicMessageListener(), new ChannelTopic("TEST")); // container.addMessageListener(new TestChannelTopicMessageListener(), new ChannelTopic("AOTEMAN")); // container.addMessageListener(new TestPatternTopicMessageListener(), new PatternTopic("TEST"));return container; }

要注意,雖然 RedisConnectionFactory 可以多次調用?#addMessageListener(MessageListener listener, Topic topic)?方法,但是一定要都是相同的 Topic 類型。例如說,添加了 ChannelTopic 類型,就不能添加 PatternTopic 類型。為什么呢?因為 RedisMessageListenerContainer 是基于一次?SUBSCRIBE?或?PSUBSCRIBE?命令,所以不支持不同類型的 Topic 。當然,如果是相同類型的 Topic ,多個 MessageListener 是支持的。

那么,可能會有胖友會問,如果我添加了?"Test"?給 MessageListenerA?,"AOTEMAN"?給 MessageListenerB?,兩個 Topic 是怎么分發(Dispatch)的呢?在 RedisMessageListenerContainer 中,有個?DispatchMessageListener?分發器,負責將不同的 Topic 分發到配置的 MessageListener 中。看到此處,有木有想到 Spring MVC 的 DispatcherServlet 分發不同的請求到對應的?@RequestMapping?方法。

第四步,使用 RedisTemplate 發布消息

創建?PubSubTest?測試類,編寫代碼如下:

@RunWith(SpringRunner.class) @SpringBootTest public class PubSubTest {public static final String TOPIC = "TEST";@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test01() throws InterruptedException {for (int i = 0; i < 10; i++) {stringRedisTemplate.convertAndSend(TOPIC, "yunai:" + i);Thread.sleep(1000L);}}}
  • 通過?RedisTemplate#convertAndSend(String channel, Object message)?方法,PUBLISH 消息。

執行?#test01()?方法,運行結果如下:

收到 ChannelTopic 消息: 線程編號:listenerContainer-2 message:yunai:0 pattern:TEST 收到 ChannelTopic 消息: 線程編號:listenerContainer-3 message:yunai:1 pattern:TEST 收到 ChannelTopic 消息: 線程編號:listenerContainer-4 message:yunai:2 pattern:TEST
  • 整整齊齊,發送和訂閱都成功了。注意,線程編號

5.4.3 閑話兩句

Redis 5.0 版本后,正式發布 Stream 功能,相信是有可能可以替代掉 Redis Pub/Sub 功能,提供可靠的消息訂閱功能。

上述的場景,艿艿自己在使用 PUB/SUB 功能的時候,確實被這么坑過。當時我們的管理后臺的權限,是緩存在 Java 進程當中,通過 Redis Pub/Sub 實現緩存的刷新。結果,當時某個 Java 節點網絡出問題,恰好那個時候,有一條刷新權限緩存的消息 PUBLISH 出來,結果沒刷新到。結果呢,運營在訪問某個功能的時候,一會有權限(因為其他 Java 節點緩存刷新了),一會沒有權限。

最近,艿艿又去找了幾個朋友請教了下,問問他們在生產環境下,是否使用 Redis Pub/Sub 功能,他們說使用 Kafka、或者 RocketMQ 的廣播消費功能,更加可靠有保障。

對了,我們有個管理系統里面有 Websocket 需要實時推送管理員消息,因為不知道管理員當前連接的是哪個 Websocket 服務節點,所以我們是通過 Redis Pub/Sub 功能,廣播給所有 Websocket 節點,然后每個 Websocket 節點判斷當前管理員是否連接的是它,如果是,則進行 Websocket 推送。因為之前網絡偶爾出故障,會存在消息丟失,所以近期我們替換成了 RocketMQ 的廣播消費,替代 Redis Pub/Sub 功能。

當然,不能說 Redis Pub/Sub 毫無使用的場景,以下艿艿來列舉幾個:

  • 1、在使用 Redis Sentinel 做高可用時,Jedis 通過 Redis Pub/Sub 功能,實現對 Redis 主節點的故障切換,刷新 Jedis 客戶端的主節點的緩存。如果出現 Redis Connection 訂閱的異常斷開,會重新主動去 Redis Sentinel 的最新主節點信息,從而解決 Redis Pub/Sub 可能因為網絡問題,丟失消息。
  • 2、Redis Sentinel 節點之間的部分信息同步,通過 Redis Pub/Sub 訂閱發布。
  • 3、在我們實現 Redis 分布式鎖時,如果獲取不到鎖,可以通過 Redis 的 Pub/Sub 訂閱鎖釋放消息,從而實現其它獲得不到鎖的線程,快速搶占鎖。當然,Redis Client 釋放鎖時,需要 PUBLISH 一條釋放鎖的消息。在 Redisson 實現分布式鎖的源碼中,我們可以看到。
  • 4、Dubbo 使用 Redis 作為注冊中心時,使用 Redis Pub/Sub 實現注冊信息的同步。

也就是說,如果想要有保障的使用 Redis Pub/Sub 功能,需要處理下發起訂閱的 Redis Connection 的異常,例如說網絡異常。然后,重新主動去查詢最新的數據的狀態。?

5.5 Script

Redis 提供 Lua 腳本,滿足我們希望組合排列使用 Redis 的命令,保證串行執行的過程中,不存在并發的問題。同時,通過將多個命令組合在同一個 Lua 腳本中,一次請求,直接處理,也是一個提升性能的手段。不了解的胖友,可以看看?「Redis 文檔 —— Lua 腳本」?。

示例代碼對應測試類:ScriptTest?。

第一步,編寫 Lua 腳本

創建?resources/compareAndSet.lua?腳本,實現 CAS 功能。代碼如下:

if redis.call('GET', KEYS[1]) ~= ARGV[1] thenreturn 0 end redis.call('SET', KEYS[1], ARGV[2]) return 1
  • 第 1 到 3 行:判斷?KEYS[1]?對應的 VALUE 是否為?ARGV[1]?值。如果不是(Lua 中不等于使用?~=),則直接返回 0 表示失敗。
  • 第 4 到 5 行:設置?KEYS[1]?對應的 VALUE 為新值?ARGV[2]?,并返回 1 表示成功。

第二步,調用 Lua 腳本

創建?ScriptTest?測試類,編寫代碼如下:

@RunWith(SpringRunner.class) @SpringBootTest public class ScriptTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test01() throws IOException {// <1.1> 讀取 /resources/lua/compareAndSet.lua 腳本 。注意,需要引入下 commons-io 依賴。String scriptContents = IOUtils.toString(getClass().getResourceAsStream("/lua/compareAndSet.lua"), "UTF-8");// <1.2> 創建 RedisScript 對象RedisScript<Long> script = new DefaultRedisScript<>(scriptContents, Long.class);// <2> 執行 LUA 腳本Long result = stringRedisTemplate.execute(script, Collections.singletonList("yunai:1"), "shuai02", "shuai");System.out.println(result);} }
  • <1.1>?行,讀取?/resources/lua/compareAndSet.lua?腳本。注意,需要引入下?commons-io?依賴。
  • <1.2>?行,創建 DefaultRedisScript 對象。第一個參數是腳本內容(?scriptSource?),第二個是腳本執行返回值(?resultType?)。
  • <2>?處,調用?RedisTemplate#execute(RedisScript<T> script, List<K> keys, Object... args)?方法,發送 Redis 執行 LUA 腳本。

最后,我們打印下執行結果。胖友可以自己執行下試試。?

6. 嘗試 Redisson

在?redisson-examples?中,Redisson 官方提供了大量的示例。

6.1 快速入門

示例代碼對應倉庫:spring-data-redis-with-redisson?。

6.1.1 引入依賴

在?pom.xml?中,引入相關依賴。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent><dependencies><!-- 實現對 Redisson 的自動化配置 --> <!-- X --><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.11.3</version></dependency><!-- 方便等會寫單元測試 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 等會示例會使用 fastjson 作為 JSON 序列化的工具 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.61</version></dependency><!-- Spring Data Redis 默認使用 Jackson 作為 JSON 序列化的工具 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency></dependencies>

和?「2.1 引入依賴」?的差異點是,我們需要引入?redisson-spring-boot-starter?依賴,實現 Redisson 的自動化配置。

6.1.2 配置文件

在?application.yml?中,添加 Redis 配置,如下:

spring:# 對應 RedisProperties 類redis:host: 127.0.0.1port: 6379 # password: # Redis 服務器密碼,默認為空。生產中,一定要設置 Redis 密碼!database: 0 # Redis 數據庫號,默認為 0 。timeout: 0 # Redis 連接超時時間,單位:毫秒。# 對應 RedissonProperties 類redisson:config: classpath:redisson.yml # 具體的每個配置項,見 org.redisson.config.Config 類。

和?「2.2 配置文件」?的差異點是:

1)去掉 Jedis 相關的配置項

2)增加?redisson.config?配置

在我們使用 Spring Boot 整合 Redisson 時候,通過該配置項,引入一個外部的 Redisson 相關的配置文件。例如說,示例中,我們引入了?classpath:redisson.yaml?配置文件。它可以使用 JSON 或 YAML 格式,進行配置。

FROM?《Spring Boot 2.x 整合 lettuce redis 和 redisson》?文章。

clusterServersConfig:# 連接空閑超時 如果當前連接池里的連接數量超過了最小空閑連接數,而同時有連接空閑時間超過了該數值,那么這些連接將會自動被關閉,并從連接池里去掉。時間單位是毫秒。idleConnectionTimeout: 10000pingTimeout: 1000# 連接超時connectTimeout: 10000# 命令等待超時timeout: 3000# 命令失敗重試次數retryAttempts: 3# 命令重試發送時間間隔retryInterval: 1500# 重新連接時間間隔reconnectionTimeout: 3000# failedAttemptsfailedAttempts: 3# 密碼password: null# 單個連接最大訂閱數量subscriptionsPerConnection: 5# 客戶端名稱clientName: null#負載均衡算法類的選擇 默認輪詢調度算法RoundRobinLoadBalancerloadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}slaveSubscriptionConnectionMinimumIdleSize: 1slaveSubscriptionConnectionPoolSize: 50# 從節點最小空閑連接數slaveConnectionMinimumIdleSize: 32# 從節點連接池大小slaveConnectionPoolSize: 64# 主節點最小空閑連接數masterConnectionMinimumIdleSize: 32# 主節點連接池大小masterConnectionPoolSize: 64# 只在從服務節點里讀取readMode: "SLAVE"# 主節點信息nodeAddresses:- "redis://192.168.56.128:7000"- "redis://192.168.56.128:7001"- "redis://192.168.56.128:7002"#集群掃描間隔時間 單位毫秒scanInterval: 1000 threads: 0 nettyThreads: 0 codec: !<org.redisson.codec.JsonJacksonCodec> {}

注意
注意
注意

如果?redisson.config?對應的配置文件,沒有配置任何內容,需要在?application.yml?里注釋掉?redisson.config?。像這樣:

spring:# 對應 RedisProperties 類redis:host: 127.0.0.1port: 6379 # password: # Redis 服務器密碼,默認為空。生產中,一定要設置 Redis 密碼!database: 0 # Redis 數據庫號,默認為 0 。timeout: 0 # Redis 連接超時時間,單位:毫秒。# 對應 RedissonProperties 類 # redisson: # config: classpath:redisson.yml # 具體的每個配置項,見 org.redisson.config.Config 類。

6.1.3 簡單測試

創建?Test01?測試類,我們來測試一下簡單的 SET 指令。代碼如下:

@RunWith(SpringRunner.class) @SpringBootTest public class Test01 {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void testStringSetKey() {stringRedisTemplate.opsForValue().set("yunai", "shuai");} }

我們先來執行下?#testStringSetKey()?方法這個測試方法。執行完成后,我們在控制臺查詢,看看是否真的執行成功了。

$ redis-cli get yunai "shuai"
  • 請大聲的告訴我,Redis 是怎么夸獎?"yunai"?的,哈哈哈哈。

6.1.4 閑聊兩句

因為有 Spring Data Redis 的存在,我們其實已經能感受到,即使我們將 Jedis 替換成了 Redisson ,依然調用的是相同的 Spring Data Redis 提供的 API ,而無需感知到 Redisson 或是 Jedis 的存在。如果哪一天,Spring Boot 2.X 版本默認推薦的 Lettuce 真的成熟了,那么我們也可以無感知的進行替換。

6.2 Redis 分布式鎖

示例代碼對應測試類:LockTest?。

一說到分布式鎖,大家一般會想到的就是基于 Zookeeper 或是 Redis 實現分布式鎖。相對來說,在考慮性能為優先因素,不需要特別絕對可靠性的場景下,我們會優先考慮使用 Redis 實現的分布式鎖。

在 Redisson 中,提供了 8 種分布式鎖的實現,具體胖友可以看看?《Redisson 文檔 —— 分布式鎖和同步器》?。真特碼的強大!大多數開發者可能連 Redis 怎么實現分布式鎖都沒完全搞清楚,Redisson 直接給了 8 種鎖,氣人,簡直了。

本小節,我們來編寫一個簡單使用 Redisson 提供的可重入鎖 RLock 的示例。

創建?LockTest?測試類,編寫代碼如下:

@RunWith(SpringRunner.class) @SpringBootTest public class LockTest {private static final String LOCK_KEY = "anylock";@Autowired // <1>private RedissonClient redissonClient;@Testpublic void test() throws InterruptedException {// <2.1> 啟動一個線程 A ,去占有鎖new Thread(new Runnable() {@Overridepublic void run() {// 加鎖以后 10 秒鐘自動解鎖// 無需調用 unlock 方法手動解鎖final RLock lock = redissonClient.getLock(LOCK_KEY);lock.lock(10, TimeUnit.SECONDS);}}).start();// <2.2> 簡單 sleep 1 秒,保證線程 A 成功持有鎖Thread.sleep(1000L);// <3> 嘗試加鎖,最多等待 100 秒,上鎖以后 10 秒自動解鎖System.out.println(String.format("準備開始獲得鎖時間:%s", new SimpleDateFormat("yyyy-MM-DD HH:mm:ss").format(new Date())));final RLock lock = redissonClient.getLock(LOCK_KEY);boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {System.out.println(String.format("實際獲得鎖時間:%s", new SimpleDateFormat("yyyy-MM-DD HH:mm:ss").format(new Date())));} else {System.out.println("加鎖失敗");}}}
  • 整個測試用例,意圖是:1)啟動一個線程 A ,先去持有鎖 10 秒然后釋放;2)主線程,也去嘗試去持有鎖,因為線程 A 目前正在占用著該鎖,所以需要等待線程 A 釋放到該鎖,才能持有成功。
  • <1>?處,注入 RedissonClient 對象。因為我們需要使用 Redisson 獨有的功能,所以需要使用到它。
  • <2.1>?處,啟動線程 A ,然后調用?RLock#lock(long leaseTime, TimeUnit unit)?方法,加鎖以后 10 秒鐘自動解鎖,無需調用 unlock 方法手動解鎖。
  • <2.2>?處,簡單 sleep 1 秒,保證線程 A 成功持有鎖。
  • <3>?處,主線程,調用?RLock#tryLock(long waitTime, long leaseTime, TimeUnit unit)?方法,嘗試加鎖,最多等待 100 秒,上鎖以后 10 秒自動解鎖。

執行?#test()?測試用例,結果如下:

準備開始獲得鎖時間:2019-10-274 00:44:08 實際獲得鎖時間:2019-10-274 00:44:17
  • 9 秒后(因為我們 sleep 了 1 秒),主線程成功獲得到 Redis 分布式鎖,符合預期。

666. 彩蛋

寫了老長一篇,都不曉得有木有會看。斷斷續續寫了小一周,不曉得有木有胖友會看完,甚至看到彩蛋環節,哈哈哈哈。

在高并發場景下,系統會大量依賴緩存和消息隊列,實現所需要的高性能。而緩存,絕大部分的選擇,基本都是 Redis ,這點毋庸置疑。所以,我們是非常有必要深入去學習下 Redis ,友情推薦下付磊大佬的?《Redis 開發與運維》?。

因為寫的還是略有些聰明,所以有錯誤或者表達不清晰的地方,歡迎胖友指出。國慶快樂,繼續學習!

總結

以上是生活随笔為你收集整理的Spring Boot Redis 入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产艳妇av在线观看果冻传媒 | 亚洲精品美女久久久久久久 | 亚洲色欲久久久综合网东京热 | 福利一区二区三区视频在线观看 | 国产免费久久久久久无码 | 在线观看国产午夜福利片 | 国产成人无码午夜视频在线观看 | 性色欲情网站iwww九文堂 | 成人无码视频在线观看网站 | 九九在线中文字幕无码 | 人人妻人人澡人人爽精品欧美 | 狠狠色噜噜狠狠狠狠7777米奇 | 日日橹狠狠爱欧美视频 | 中文字幕无码日韩专区 | 国产两女互慰高潮视频在线观看 | 久久精品国产精品国产精品污 | 少妇邻居内射在线 | 欧美zoozzooz性欧美 | 亚洲成熟女人毛毛耸耸多 | 久久综合激激的五月天 | 亚洲天堂2017无码中文 | 乱人伦人妻中文字幕无码 | 亚洲国产av精品一区二区蜜芽 | 少妇邻居内射在线 | 日本www一道久久久免费榴莲 | 久青草影院在线观看国产 | 亚洲一区二区三区播放 | 无码福利日韩神码福利片 | 久久人人爽人人爽人人片ⅴ | 无码av岛国片在线播放 | 国产真实乱对白精彩久久 | 国产精品对白交换视频 | 中文字幕av无码一区二区三区电影 | 99久久无码一区人妻 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲国产综合无码一区 | 波多野结衣av一区二区全免费观看 | 欧美丰满少妇xxxx性 | 国产成人精品一区二区在线小狼 | 最近的中文字幕在线看视频 | 欧美一区二区三区 | 国产sm调教视频在线观看 | 亚洲精品国产第一综合99久久 | 亚洲精品中文字幕 | 欧美日韩一区二区免费视频 | 99久久久无码国产aaa精品 | 亚洲人成网站色7799 | 亚洲a无码综合a国产av中文 | 一本大道久久东京热无码av | 国产av久久久久精东av | 性做久久久久久久免费看 | 精品久久久久香蕉网 | 久久精品国产一区二区三区肥胖 | 亚洲乱亚洲乱妇50p | 午夜福利试看120秒体验区 | 一本加勒比波多野结衣 | 2020久久香蕉国产线看观看 | 国内精品九九久久久精品 | 大地资源中文第3页 | 欧美精品无码一区二区三区 | 99久久99久久免费精品蜜桃 | yw尤物av无码国产在线观看 | 国内揄拍国内精品人妻 | 又色又爽又黄的美女裸体网站 | 国产精品美女久久久 | 日本爽爽爽爽爽爽在线观看免 | aⅴ亚洲 日韩 色 图网站 播放 | 成人av无码一区二区三区 | 中文亚洲成a人片在线观看 | 狠狠cao日日穞夜夜穞av | 永久黄网站色视频免费直播 | 一个人看的视频www在线 | 欧美午夜特黄aaaaaa片 | 理论片87福利理论电影 | 又湿又紧又大又爽a视频国产 | 夜夜夜高潮夜夜爽夜夜爰爰 | 人妻与老人中文字幕 | 无遮挡啪啪摇乳动态图 | 亚洲日韩一区二区 | 欧美丰满熟妇xxxx性ppx人交 | 丰满少妇熟乱xxxxx视频 | 九九综合va免费看 | 久久综合久久自在自线精品自 | 欧美激情综合亚洲一二区 | 亚洲精品中文字幕久久久久 | 偷窥日本少妇撒尿chinese | 18禁止看的免费污网站 | 性欧美大战久久久久久久 | 久久精品国产一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 欧美老人巨大xxxx做受 | 激情综合激情五月俺也去 | 少妇愉情理伦片bd | 欧美日韩一区二区三区自拍 | 久久午夜无码鲁丝片午夜精品 | 免费无码午夜福利片69 | 国产成人无码av在线影院 | 丰满人妻翻云覆雨呻吟视频 | 色一情一乱一伦一区二区三欧美 | 兔费看少妇性l交大片免费 | 少妇一晚三次一区二区三区 | 欧美国产日产一区二区 | 欧美大屁股xxxxhd黑色 | 中文字幕无码av波多野吉衣 | 免费无码的av片在线观看 | 久久zyz资源站无码中文动漫 | 亚洲成a人片在线观看无码 | 激情亚洲一区国产精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产偷国产偷精品高清尤物 | 亚洲精品www久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久久亚洲欧洲日产国码αv | 亚洲小说图区综合在线 | 国产亚洲美女精品久久久2020 | 亚洲欧洲中文日韩av乱码 | 日韩欧美中文字幕在线三区 | 乱人伦人妻中文字幕无码久久网 | 日韩在线不卡免费视频一区 | 欧美zoozzooz性欧美 | 国产精品永久免费视频 | 亚洲成av人在线观看网址 | 偷窥日本少妇撒尿chinese | 麻豆国产丝袜白领秘书在线观看 | 国产小呦泬泬99精品 | 大肉大捧一进一出好爽视频 | 日日天干夜夜狠狠爱 | 久久99精品久久久久婷婷 | 人妻少妇精品无码专区二区 | 国产综合色产在线精品 | 国产艳妇av在线观看果冻传媒 | 99er热精品视频 | 高清无码午夜福利视频 | 狠狠色色综合网站 | 丰满人妻一区二区三区免费视频 | 欧美xxxx黑人又粗又长 | 曰本女人与公拘交酡免费视频 | 亚洲高清偷拍一区二区三区 | 色狠狠av一区二区三区 | 精品人人妻人人澡人人爽人人 | 中文字幕久久久久人妻 | 亚洲熟妇色xxxxx亚洲 | 国产色xx群视频射精 | 人妻熟女一区 | 高潮毛片无遮挡高清免费 | 女人被爽到呻吟gif动态图视看 | 国产激情无码一区二区 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲一区av无码专区在线观看 | 无码午夜成人1000部免费视频 | 又湿又紧又大又爽a视频国产 | 免费看男女做好爽好硬视频 | 男女性色大片免费网站 | 精品久久8x国产免费观看 | 性欧美大战久久久久久久 | 激情亚洲一区国产精品 | 天堂а√在线地址中文在线 | 久久97精品久久久久久久不卡 | 丰满诱人的人妻3 | 99久久精品午夜一区二区 | 网友自拍区视频精品 | 久久人人爽人人爽人人片ⅴ | 色一情一乱一伦一视频免费看 | 狠狠亚洲超碰狼人久久 | 国产精品久久久久无码av色戒 | 十八禁视频网站在线观看 | 乱中年女人伦av三区 | 国产超碰人人爽人人做人人添 | 亚洲精品一区二区三区四区五区 | 曰本女人与公拘交酡免费视频 | 久久国产自偷自偷免费一区调 | 综合激情五月综合激情五月激情1 | 日韩精品久久久肉伦网站 | 在线观看免费人成视频 | 亚洲人成网站色7799 | 极品尤物被啪到呻吟喷水 | 丰满少妇高潮惨叫视频 | 日韩欧美群交p片內射中文 | 波多野结衣一区二区三区av免费 | 精品国偷自产在线 | 性欧美牲交xxxxx视频 | 人人妻人人澡人人爽欧美精品 | 在线精品亚洲一区二区 | 亚洲精品一区二区三区在线观看 | 日本熟妇乱子伦xxxx | 国产亚洲tv在线观看 | 亚洲中文字幕乱码av波多ji | 无码av最新清无码专区吞精 | 日本免费一区二区三区最新 | 蜜桃无码一区二区三区 | 国产激情精品一区二区三区 | 夜精品a片一区二区三区无码白浆 | 婷婷五月综合缴情在线视频 | 久久精品一区二区三区四区 | 久久人人97超碰a片精品 | 小sao货水好多真紧h无码视频 | 久久婷婷五月综合色国产香蕉 | 荫蒂添的好舒服视频囗交 | 久在线观看福利视频 | 亚洲精品一区三区三区在线观看 | 亚洲中文无码av永久不收费 | 99精品视频在线观看免费 | 久久午夜无码鲁丝片午夜精品 | 国内少妇偷人精品视频免费 | 国产9 9在线 | 中文 | 黑人大群体交免费视频 | 无码人妻出轨黑人中文字幕 | 亚洲色无码一区二区三区 | 欧洲熟妇色 欧美 | 国产成人午夜福利在线播放 | 国产情侣作爱视频免费观看 | 伊人久久大香线蕉亚洲 | 亚洲色大成网站www | 俺去俺来也在线www色官网 | 波多野结衣一区二区三区av免费 | 国产精品无码mv在线观看 | 成 人影片 免费观看 | 亚洲精品国偷拍自产在线麻豆 | 一本久久伊人热热精品中文字幕 | 99久久精品无码一区二区毛片 | 亚洲成a人一区二区三区 | 国产成人亚洲综合无码 | 国产午夜福利亚洲第一 | 天天av天天av天天透 | 丝袜 中出 制服 人妻 美腿 | 激情亚洲一区国产精品 | 四十如虎的丰满熟妇啪啪 | 国产成人一区二区三区别 | 欧美 亚洲 国产 另类 | 男人的天堂av网站 | 日日碰狠狠躁久久躁蜜桃 | 国产精品人人爽人人做我的可爱 | 亚洲精品国产精品乱码不卡 | 亚洲精品一区二区三区在线观看 | 国产人妻精品午夜福利免费 | 97精品人妻一区二区三区香蕉 | 网友自拍区视频精品 | 人妻少妇被猛烈进入中文字幕 | 欧美精品无码一区二区三区 | 人妻有码中文字幕在线 | 一本久道高清无码视频 | 曰韩无码二三区中文字幕 | 国产成人无码区免费内射一片色欲 | 亚洲欧美日韩成人高清在线一区 | 中文字幕av日韩精品一区二区 | 精品日本一区二区三区在线观看 | 国产97在线 | 亚洲 | 熟妇人妻中文av无码 | 欧美人妻一区二区三区 | 300部国产真实乱 | 97久久国产亚洲精品超碰热 | 亚洲色欲久久久综合网东京热 | 国产亚av手机在线观看 | 亚洲精品成a人在线观看 | 亚洲一区二区三区四区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日本熟妇人妻xxxxx人hd | 久久精品人妻少妇一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 少妇人妻偷人精品无码视频 | 无码国内精品人妻少妇 | 天堂а√在线中文在线 | 国产精品久久久久久无码 | aa片在线观看视频在线播放 | 性欧美牲交在线视频 | 精品无码国产自产拍在线观看蜜 | 女人被男人躁得好爽免费视频 | 久久久婷婷五月亚洲97号色 | 亚洲国产精品美女久久久久 | 亚洲最大成人网站 | 无码午夜成人1000部免费视频 | 国产精品久久精品三级 | 领导边摸边吃奶边做爽在线观看 | 小鲜肉自慰网站xnxx | 欧美变态另类xxxx | 成年女人永久免费看片 | 在线а√天堂中文官网 | 国产精品亚洲综合色区韩国 | 国产精品18久久久久久麻辣 | 人人妻人人澡人人爽精品欧美 | 人妻少妇精品无码专区二区 | 四虎永久在线精品免费网址 | 亚洲精品www久久久 | 精品午夜福利在线观看 | 国产av无码专区亚洲a∨毛片 | 青青青爽视频在线观看 | 久久久婷婷五月亚洲97号色 | 国产性生交xxxxx无码 | 综合人妻久久一区二区精品 | 欧美精品无码一区二区三区 | 中文字幕无码av激情不卡 | 亚洲国产精品久久久久久 | 欧美乱妇无乱码大黄a片 | 国产精品香蕉在线观看 | 无码av中文字幕免费放 | 久久99久久99精品中文字幕 | 青春草在线视频免费观看 | 国产激情精品一区二区三区 | 欧洲欧美人成视频在线 | 中文字幕日韩精品一区二区三区 | 久久久精品人妻久久影视 | 久久久婷婷五月亚洲97号色 | 熟妇人妻无码xxx视频 | 久久久久久九九精品久 | 久久综合九色综合欧美狠狠 | 欧美zoozzooz性欧美 | 又大又硬又黄的免费视频 | 色情久久久av熟女人妻网站 | 精品少妇爆乳无码av无码专区 | 欧美黑人乱大交 | 丰满少妇熟乱xxxxx视频 | 又色又爽又黄的美女裸体网站 | 中文字幕人成乱码熟女app | 亚洲狠狠色丁香婷婷综合 | 久久午夜夜伦鲁鲁片无码免费 | 无码人妻出轨黑人中文字幕 | 久久无码专区国产精品s | 粉嫩少妇内射浓精videos | 亚洲日韩一区二区三区 | 无码成人精品区在线观看 | 特黄特色大片免费播放器图片 | 成人av无码一区二区三区 | 国产成人无码av在线影院 | 天天拍夜夜添久久精品大 | 国产乱人伦av在线无码 | 成人精品一区二区三区中文字幕 | 精品无人区无码乱码毛片国产 | 成人aaa片一区国产精品 | 中文无码成人免费视频在线观看 | 久久精品99久久香蕉国产色戒 | 午夜丰满少妇性开放视频 | 国产精品久久久久久久9999 | 久久久久国色av免费观看性色 | 天堂在线观看www | 日本精品高清一区二区 | 76少妇精品导航 | 成人片黄网站色大片免费观看 | 亚洲国产精品美女久久久久 | 国产麻豆精品一区二区三区v视界 | 18禁黄网站男男禁片免费观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 日韩精品无码一本二本三本色 | 亚洲va中文字幕无码久久不卡 | 国产成人无码av一区二区 | 色综合久久久久综合一本到桃花网 | 对白脏话肉麻粗话av | 国内丰满熟女出轨videos | 少妇被黑人到高潮喷出白浆 | 色 综合 欧美 亚洲 国产 | 人妻互换免费中文字幕 | 国产suv精品一区二区五 | 亚洲日韩中文字幕在线播放 | 日本欧美一区二区三区乱码 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国産精品久久久久久久 | 日本高清一区免费中文视频 | 婷婷五月综合缴情在线视频 | 99精品国产综合久久久久五月天 | 久久综合给久久狠狠97色 | 成人女人看片免费视频放人 | 欧美日韩亚洲国产精品 | 亚洲综合精品香蕉久久网 | 99久久亚洲精品无码毛片 | 免费看男女做好爽好硬视频 | 欧美一区二区三区视频在线观看 | 国产精品久久久久久久影院 | 亚洲爆乳无码专区 | 精品国产一区二区三区av 性色 | 丰满少妇高潮惨叫视频 | 中文字幕中文有码在线 | 内射老妇bbwx0c0ck | 国产一区二区不卡老阿姨 | 亚洲小说图区综合在线 | 久久久国产一区二区三区 | 久久精品女人天堂av免费观看 | 国产精品丝袜黑色高跟鞋 | 日本熟妇乱子伦xxxx | 精品久久久久久亚洲精品 | 亚洲色大成网站www国产 | 无码精品国产va在线观看dvd | 午夜无码人妻av大片色欲 | 欧美日韩一区二区免费视频 | 国产成人一区二区三区在线观看 | 好男人www社区 | 波多野结衣av在线观看 | 国产农村乱对白刺激视频 | 久久99精品国产麻豆蜜芽 | 欧美丰满熟妇xxxx性ppx人交 | 色婷婷香蕉在线一区二区 | 55夜色66夜色国产精品视频 | 久久精品中文闷骚内射 | 亚洲成a人片在线观看无码 | 国产黄在线观看免费观看不卡 | 欧美怡红院免费全部视频 | 精品一二三区久久aaa片 | 亚洲综合另类小说色区 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品成人av在线 | 131美女爱做视频 | 亚洲人成网站在线播放942 | 亚洲成熟女人毛毛耸耸多 | 精品欧洲av无码一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 色综合久久中文娱乐网 | 婷婷色婷婷开心五月四房播播 | 免费观看又污又黄的网站 | 成人影院yy111111在线观看 | 国产肉丝袜在线观看 | 亚洲综合精品香蕉久久网 | 鲁一鲁av2019在线 | 久久精品人人做人人综合 | 欧美丰满熟妇xxxx | 欧美亚洲日韩国产人成在线播放 | 亚洲 a v无 码免 费 成 人 a v | 亚洲男女内射在线播放 | 伊人久久大香线焦av综合影院 | 久久精品中文字幕大胸 | 国产在线无码精品电影网 | 暴力强奷在线播放无码 | 人妻少妇精品无码专区动漫 | 国产乡下妇女做爰 | 蜜桃臀无码内射一区二区三区 | 综合激情五月综合激情五月激情1 | 超碰97人人射妻 | 精品国产福利一区二区 | 成人欧美一区二区三区 | 中文字幕 亚洲精品 第1页 | 亚洲乱码国产乱码精品精 | 97无码免费人妻超级碰碰夜夜 | 日韩少妇内射免费播放 | 日日躁夜夜躁狠狠躁 | 天海翼激烈高潮到腰振不止 | 中文字幕色婷婷在线视频 | 国内精品九九久久久精品 | 大胆欧美熟妇xx | 最新国产麻豆aⅴ精品无码 | 精品久久8x国产免费观看 | 一本久道久久综合狠狠爱 | 高清无码午夜福利视频 | 国产激情精品一区二区三区 | 无遮挡啪啪摇乳动态图 | 亚洲a无码综合a国产av中文 | 久久精品国产亚洲精品 | 国产在线精品一区二区高清不卡 | 3d动漫精品啪啪一区二区中 | 国产精品永久免费视频 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕日产无线码一区 | 一本加勒比波多野结衣 | 理论片87福利理论电影 | 亚洲成av人片天堂网无码】 | 中文字幕人妻丝袜二区 | 国产成人午夜福利在线播放 | 日韩精品无码免费一区二区三区 | 亚洲小说图区综合在线 | 久久久久国色av免费观看性色 | 亚洲 日韩 欧美 成人 在线观看 | 日韩精品a片一区二区三区妖精 | 正在播放东北夫妻内射 | 免费无码av一区二区 | 精品久久久久香蕉网 | 国产又爽又猛又粗的视频a片 | 国产精品手机免费 | 国产人妻精品一区二区三区 | 国产精品久久久久9999小说 | 国内少妇偷人精品视频免费 | 天天躁日日躁狠狠躁免费麻豆 | 国产乱子伦视频在线播放 | 久久精品一区二区三区四区 | 国产精品久久久久9999小说 | 久久99精品久久久久久动态图 | 亚洲经典千人经典日产 | 国产精品久久久午夜夜伦鲁鲁 | 熟女少妇人妻中文字幕 | 中文字幕色婷婷在线视频 | 无套内谢的新婚少妇国语播放 | 成人性做爰aaa片免费看 | 欧美成人免费全部网站 | 成人性做爰aaa片免费看 | 无遮无挡爽爽免费视频 | 午夜免费福利小电影 | 色欲人妻aaaaaaa无码 | 国産精品久久久久久久 | 久久 国产 尿 小便 嘘嘘 | 国产三级久久久精品麻豆三级 | 日欧一片内射va在线影院 | 99riav国产精品视频 | 男人的天堂2018无码 | 精品久久8x国产免费观看 | 偷窥村妇洗澡毛毛多 | 色婷婷香蕉在线一区二区 | 无码中文字幕色专区 | 亚洲日本在线电影 | 久久精品国产一区二区三区 | 国产99久久精品一区二区 | 国产成人无码av片在线观看不卡 | 中国大陆精品视频xxxx | 欧美国产日韩亚洲中文 | 日韩av激情在线观看 | 亚洲性无码av中文字幕 | 国产成人综合美国十次 | 荫蒂被男人添的好舒服爽免费视频 | 好爽又高潮了毛片免费下载 | 精品国产青草久久久久福利 | 亚洲中文字幕乱码av波多ji | 国产精品va在线播放 | 在线观看欧美一区二区三区 | 精品乱子伦一区二区三区 | 色窝窝无码一区二区三区色欲 | 国精品人妻无码一区二区三区蜜柚 | 国产亚洲美女精品久久久2020 | 人人妻人人藻人人爽欧美一区 | 久久熟妇人妻午夜寂寞影院 | 亚洲国产精品无码久久久久高潮 | 国产suv精品一区二区五 | 免费无码av一区二区 | 中国女人内谢69xxxx | 97久久精品无码一区二区 | 久久久久av无码免费网 | 亚洲一区二区三区播放 | 国产精品二区一区二区aⅴ污介绍 | 天天av天天av天天透 | 少妇人妻偷人精品无码视频 | 精品无码成人片一区二区98 | 亚洲日韩av片在线观看 | 亚洲爆乳精品无码一区二区三区 | 精品无码国产一区二区三区av | 日本大乳高潮视频在线观看 | 国产免费久久精品国产传媒 | 国产99久久精品一区二区 | 久久综合给合久久狠狠狠97色 | 在线播放亚洲第一字幕 | 亚洲爆乳无码专区 | 久久视频在线观看精品 | 亚洲精品综合一区二区三区在线 | 天下第一社区视频www日本 | 东北女人啪啪对白 | 99久久精品无码一区二区毛片 | 欧美日韩一区二区三区自拍 | 88国产精品欧美一区二区三区 | 国产真实伦对白全集 | 牲欲强的熟妇农村老妇女视频 | 精品国产乱码久久久久乱码 | 日本精品人妻无码免费大全 | 成熟女人特级毛片www免费 | 国精品人妻无码一区二区三区蜜柚 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲另类伦春色综合小说 | 国产精品久久久久久亚洲影视内衣 | 中文字幕亚洲情99在线 | 内射后入在线观看一区 | 美女黄网站人色视频免费国产 | 国产九九九九九九九a片 | 午夜福利电影 | 国产午夜手机精彩视频 | 美女黄网站人色视频免费国产 | 亚洲成av人在线观看网址 | 丝袜 中出 制服 人妻 美腿 | 免费看男女做好爽好硬视频 | 欧美日韩一区二区三区自拍 | 国产成人综合在线女婷五月99播放 | 成人亚洲精品久久久久软件 | 日本一区二区三区免费高清 | 丰满少妇熟乱xxxxx视频 | 欧美日本精品一区二区三区 | 婷婷丁香六月激情综合啪 | 无遮挡啪啪摇乳动态图 | 国产成人精品必看 | 国产香蕉尹人视频在线 | 成人免费视频视频在线观看 免费 | 国产偷国产偷精品高清尤物 | 久久无码人妻影院 | 亚洲成色www久久网站 | 日本一区二区三区免费播放 | av无码久久久久不卡免费网站 | 精品国产aⅴ无码一区二区 | aa片在线观看视频在线播放 | av在线亚洲欧洲日产一区二区 | 中文字幕乱码中文乱码51精品 | 人妻与老人中文字幕 | 成熟妇人a片免费看网站 | 色妞www精品免费视频 | 激情内射日本一区二区三区 | 日韩精品无码免费一区二区三区 | 国产三级精品三级男人的天堂 | 日本一卡2卡3卡四卡精品网站 | 日日碰狠狠躁久久躁蜜桃 | 国产亚洲精品久久久闺蜜 | 国产绳艺sm调教室论坛 | 男人和女人高潮免费网站 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产乱人伦av在线无码 | 美女扒开屁股让男人桶 | 欧美精品在线观看 | 四十如虎的丰满熟妇啪啪 | 亚洲一区二区三区播放 | 久久国产劲爆∧v内射 | 丰满妇女强制高潮18xxxx | 暴力强奷在线播放无码 | 国产三级精品三级男人的天堂 | 成人一在线视频日韩国产 | 国产亚洲精品久久久久久久久动漫 | 无码国模国产在线观看 | 亚洲欧美日韩成人高清在线一区 | 久久久av男人的天堂 | 又粗又大又硬毛片免费看 | 国内精品一区二区三区不卡 | 麻豆md0077饥渴少妇 | 久久99精品国产.久久久久 | 无码纯肉视频在线观看 | 熟女俱乐部五十路六十路av | 久久久精品国产sm最大网站 | 国内精品人妻无码久久久影院蜜桃 | 国产区女主播在线观看 | 男女作爱免费网站 | 丰满妇女强制高潮18xxxx | 99麻豆久久久国产精品免费 | 亚洲国产精华液网站w | 思思久久99热只有频精品66 | www国产亚洲精品久久网站 | 在线 国产 欧美 亚洲 天堂 | 欧美人与牲动交xxxx | 国产激情无码一区二区 | 亚洲色欲久久久综合网东京热 | 国产情侣作爱视频免费观看 | 国产手机在线αⅴ片无码观看 | 国产在线精品一区二区三区直播 | 亚洲另类伦春色综合小说 | 久久精品国产日本波多野结衣 | 亚洲国产欧美日韩精品一区二区三区 | 天堂亚洲免费视频 | 色婷婷av一区二区三区之红樱桃 | 亚洲精品午夜国产va久久成人 | 在线播放免费人成毛片乱码 | 国产尤物精品视频 | 超碰97人人做人人爱少妇 | 日韩精品a片一区二区三区妖精 | 人妻aⅴ无码一区二区三区 | 夫妻免费无码v看片 | 精品国产乱码久久久久乱码 | 欧美黑人乱大交 | 亚洲精品www久久久 | 成人精品一区二区三区中文字幕 | 国产精品久久久久9999小说 | 福利一区二区三区视频在线观看 | 国产精品久久久久久久影院 | 蜜桃视频韩日免费播放 | 亚洲爆乳大丰满无码专区 | aⅴ亚洲 日韩 色 图网站 播放 | 丁香啪啪综合成人亚洲 | 六十路熟妇乱子伦 | 国产精品无码一区二区三区不卡 | а√资源新版在线天堂 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 熟女体下毛毛黑森林 | 国产精品美女久久久网av | 国产精品久久久久7777 | 欧美黑人乱大交 | 国产69精品久久久久app下载 | 国产美女极度色诱视频www | 亚洲欧美色中文字幕在线 | 色欲av亚洲一区无码少妇 | 亚洲熟妇色xxxxx亚洲 | 草草网站影院白丝内射 | 国产真实夫妇视频 | 少女韩国电视剧在线观看完整 | 乱人伦人妻中文字幕无码 | 老熟妇仑乱视频一区二区 | 大乳丰满人妻中文字幕日本 | 伊人久久大香线蕉午夜 | 久久久久亚洲精品男人的天堂 | 狠狠色丁香久久婷婷综合五月 | 国产熟妇另类久久久久 | 日韩少妇白浆无码系列 | 亚洲 另类 在线 欧美 制服 | 思思久久99热只有频精品66 | 国内丰满熟女出轨videos | 成熟女人特级毛片www免费 | 精品国产成人一区二区三区 | 久久这里只有精品视频9 | 久久99精品国产.久久久久 | 久久久精品国产sm最大网站 | 免费人成在线观看网站 | 成人综合网亚洲伊人 | 亚洲娇小与黑人巨大交 | 少妇邻居内射在线 | 亚洲欧洲无卡二区视頻 | 国产激情无码一区二区app | 国精品人妻无码一区二区三区蜜柚 | 中文字幕人妻无码一夲道 | 色五月丁香五月综合五月 | 在线播放免费人成毛片乱码 | 无码纯肉视频在线观看 | 国产精品人妻一区二区三区四 | 18黄暴禁片在线观看 | 狠狠亚洲超碰狼人久久 | 性欧美牲交在线视频 | 日本一卡2卡3卡四卡精品网站 | 熟妇人妻无乱码中文字幕 | 久久精品无码一区二区三区 | 午夜福利电影 | 大肉大捧一进一出好爽视频 | 亚洲国产午夜精品理论片 | 中国女人内谢69xxxx | 色狠狠av一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 黑人粗大猛烈进出高潮视频 | 无套内射视频囯产 | 欧美国产日产一区二区 | 国产suv精品一区二区五 | 性欧美牲交xxxxx视频 | 久久国产36精品色熟妇 | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕久久久久人妻 | 久久精品一区二区三区四区 | 性色欲网站人妻丰满中文久久不卡 | 国内少妇偷人精品视频 | 日韩精品无码一本二本三本色 | 无码乱肉视频免费大全合集 | 国产成人无码一二三区视频 | 蜜臀aⅴ国产精品久久久国产老师 | 99麻豆久久久国产精品免费 | 久久国产精品萌白酱免费 | 欧美性黑人极品hd | 久久精品一区二区三区四区 | √8天堂资源地址中文在线 | 日韩av无码中文无码电影 | 午夜福利一区二区三区在线观看 | 亚洲中文字幕乱码av波多ji | av小次郎收藏 | 好男人www社区 | 毛片内射-百度 | 日韩亚洲欧美中文高清在线 | 中文字幕人妻丝袜二区 | 国内精品人妻无码久久久影院 | 国产情侣作爱视频免费观看 | 色婷婷香蕉在线一区二区 | 啦啦啦www在线观看免费视频 | 欧洲vodafone精品性 | 日韩无套无码精品 | 未满小14洗澡无码视频网站 | 色综合久久中文娱乐网 | 国产色xx群视频射精 | 亚洲国产精品一区二区第一页 | 亚洲成色www久久网站 | 老司机亚洲精品影院 | 亚洲中文字幕乱码av波多ji | 国产精品久久国产三级国 | 特大黑人娇小亚洲女 | 成人免费无码大片a毛片 | 国产精品久久久久久久影院 | 女人被男人爽到呻吟的视频 | 强辱丰满人妻hd中文字幕 | 久久99精品久久久久久 | 99国产欧美久久久精品 | 色综合久久久久综合一本到桃花网 | 欧美三级不卡在线观看 | 欧美国产日韩亚洲中文 | 亚洲国产精华液网站w | 国产在线无码精品电影网 | 帮老师解开蕾丝奶罩吸乳网站 | 呦交小u女精品视频 | 永久免费观看国产裸体美女 | 无码人妻少妇伦在线电影 | 无码人妻丰满熟妇区五十路百度 | 无套内射视频囯产 | 青青久在线视频免费观看 | 好屌草这里只有精品 | 国产极品美女高潮无套在线观看 | 丰满少妇熟乱xxxxx视频 | 少妇激情av一区二区 | 国产69精品久久久久app下载 | 日韩人妻系列无码专区 | 麻豆国产人妻欲求不满谁演的 | 亚洲欧洲无卡二区视頻 | 精品久久久久久人妻无码中文字幕 | 亚洲精品美女久久久久久久 | 国产xxx69麻豆国语对白 | 97无码免费人妻超级碰碰夜夜 | 国产精品18久久久久久麻辣 | 2020最新国产自产精品 | 色狠狠av一区二区三区 | 欧美日韩视频无码一区二区三 | 最新国产乱人伦偷精品免费网站 | 欧美精品一区二区精品久久 | 一本久道久久综合狠狠爱 | 成人免费视频视频在线观看 免费 | 成人免费视频一区二区 | 色婷婷香蕉在线一区二区 | 精品成人av一区二区三区 | 少妇一晚三次一区二区三区 | 免费国产黄网站在线观看 | 亚洲欧洲日本综合aⅴ在线 | 国产97色在线 | 免 | 精品日本一区二区三区在线观看 | 少妇被粗大的猛进出69影院 | 国产亚洲欧美日韩亚洲中文色 | 东京无码熟妇人妻av在线网址 | 伊人久久大香线蕉av一区二区 | 青青草原综合久久大伊人精品 | 亚洲国产综合无码一区 | 亚洲欧美国产精品久久 | 亚洲人成网站色7799 | av香港经典三级级 在线 | 妺妺窝人体色www在线小说 | 蜜桃无码一区二区三区 | 黑人巨大精品欧美黑寡妇 | 中文字幕无码视频专区 | 偷窥日本少妇撒尿chinese | 丰满人妻翻云覆雨呻吟视频 | 亚洲人成网站免费播放 | 女人被爽到呻吟gif动态图视看 | 窝窝午夜理论片影院 | 日韩精品无码一区二区中文字幕 | 欧美第一黄网免费网站 | 2020最新国产自产精品 | 漂亮人妻洗澡被公强 日日躁 | 欧洲欧美人成视频在线 | 国产亚洲精品久久久久久久 | 少妇人妻大乳在线视频 | 国产精品毛片一区二区 | 牲欲强的熟妇农村老妇女 | 中文字幕人妻丝袜二区 | 人妻少妇精品无码专区动漫 | 久久天天躁狠狠躁夜夜免费观看 | 成 人 免费观看网站 | 国产免费观看黄av片 | 国产亚洲tv在线观看 | 无码帝国www无码专区色综合 | 久久97精品久久久久久久不卡 | 亚洲乱码国产乱码精品精 | 成人三级无码视频在线观看 | 日本精品人妻无码77777 天堂一区人妻无码 | 在线看片无码永久免费视频 | 免费无码一区二区三区蜜桃大 | 丰满少妇高潮惨叫视频 | 亚洲中文字幕在线无码一区二区 | 男人的天堂av网站 | 无码帝国www无码专区色综合 | 无码人妻精品一区二区三区不卡 | 草草网站影院白丝内射 | 亚洲爆乳无码专区 | 欧美 丝袜 自拍 制服 另类 | 东北女人啪啪对白 | 国产精品久久久久无码av色戒 | 亚洲精品国产精品乱码视色 | 鲁鲁鲁爽爽爽在线视频观看 | 疯狂三人交性欧美 | 又大又硬又爽免费视频 | 内射后入在线观看一区 | 国产办公室秘书无码精品99 | 国产麻豆精品一区二区三区v视界 | 一本一道久久综合久久 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲国产精品毛片av不卡在线 | 国产激情综合五月久久 | 国产精品国产三级国产专播 | 久久精品女人的天堂av | 爆乳一区二区三区无码 | 国产无套内射久久久国产 | 1000部啪啪未满十八勿入下载 | 无码人妻精品一区二区三区下载 | 国产在线无码精品电影网 | 精品无码av一区二区三区 | 国产97色在线 | 免 | 国产精品亚洲lv粉色 | 亚洲色www成人永久网址 | 台湾无码一区二区 | 精品aⅴ一区二区三区 | 少妇的肉体aa片免费 | 免费观看黄网站 | 中文字幕日产无线码一区 | 漂亮人妻洗澡被公强 日日躁 | 美女张开腿让人桶 | 中文字幕无码免费久久9一区9 | 亚洲人成网站免费播放 | 乱码午夜-极国产极内射 | 欧美性黑人极品hd | 99视频精品全部免费免费观看 | 欧美日韩人成综合在线播放 | а天堂中文在线官网 | 亚洲精品一区二区三区在线观看 | 国产精品久久久久久久9999 | 领导边摸边吃奶边做爽在线观看 | 亚洲啪av永久无码精品放毛片 | 麻豆成人精品国产免费 | 在线欧美精品一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 日本一区二区三区免费高清 | 人人妻人人澡人人爽欧美精品 | 精品乱子伦一区二区三区 | 亚洲日韩中文字幕在线播放 | 国产av久久久久精东av | 在线播放免费人成毛片乱码 | 日韩欧美群交p片內射中文 | 国产深夜福利视频在线 | 无码毛片视频一区二区本码 | 大乳丰满人妻中文字幕日本 | 成人免费无码大片a毛片 | 久久精品中文字幕大胸 | 女人被男人爽到呻吟的视频 | 麻豆蜜桃av蜜臀av色欲av | 天干天干啦夜天干天2017 | 亚洲精品一区国产 | 水蜜桃亚洲一二三四在线 | 亚洲综合精品香蕉久久网 | 精品乱子伦一区二区三区 | 精品偷自拍另类在线观看 | 欧美野外疯狂做受xxxx高潮 | 娇妻被黑人粗大高潮白浆 | 狠狠色噜噜狠狠狠7777奇米 | 午夜精品一区二区三区在线观看 | 97久久国产亚洲精品超碰热 | 国产精品久久福利网站 | 99久久婷婷国产综合精品青草免费 | 性欧美疯狂xxxxbbbb | 亚洲自偷自拍另类第1页 | 精品国产麻豆免费人成网站 | 久久午夜无码鲁丝片午夜精品 | 国产色视频一区二区三区 | 国产另类ts人妖一区二区 | 精品国产一区二区三区四区 | 久久天天躁夜夜躁狠狠 | 一本久久伊人热热精品中文字幕 | 夜精品a片一区二区三区无码白浆 | 精品人妻中文字幕有码在线 | 伊人久久大香线焦av综合影院 | 又大又硬又爽免费视频 | 国产精品人妻一区二区三区四 | 日本在线高清不卡免费播放 | 日日麻批免费40分钟无码 | 超碰97人人做人人爱少妇 | 中文字幕av无码一区二区三区电影 | 乱码午夜-极国产极内射 | 成人aaa片一区国产精品 | 亚洲欧美中文字幕5发布 | 亚洲 欧美 激情 小说 另类 | 无码精品人妻一区二区三区av | 亚洲一区二区三区含羞草 | 成在人线av无码免观看麻豆 | 国产国语老龄妇女a片 | 国精产品一区二区三区 | 成人aaa片一区国产精品 | 色综合久久久久综合一本到桃花网 | 天堂亚洲2017在线观看 | 久久五月精品中文字幕 | 亚洲啪av永久无码精品放毛片 | 欧美黑人巨大xxxxx | 少妇高潮一区二区三区99 | 国内精品久久毛片一区二区 | 人妻少妇精品久久 | 精品乱码久久久久久久 | 国产精品美女久久久 | 欧美 丝袜 自拍 制服 另类 | 亚洲精品国产第一综合99久久 | 国产精品久久国产精品99 | 国产精品无套呻吟在线 | 久久精品国产一区二区三区肥胖 | 妺妺窝人体色www在线小说 | 久久午夜无码鲁丝片午夜精品 | 最近中文2019字幕第二页 | 2019午夜福利不卡片在线 | 久久精品国产亚洲精品 | 成人无码视频免费播放 | 国内精品久久毛片一区二区 | 色老头在线一区二区三区 | 亚洲欧洲中文日韩av乱码 | 2019午夜福利不卡片在线 | 国产精品成人av在线观看 | 国产精品无码一区二区桃花视频 | 亚洲最大成人网站 | 国产极品视觉盛宴 | 国产特级毛片aaaaaa高潮流水 | 国产亚洲精品久久久久久久久动漫 | 免费看少妇作爱视频 | 亚洲人成无码网www | 国产香蕉尹人综合在线观看 | 少妇性荡欲午夜性开放视频剧场 | 中国女人内谢69xxxxxa片 | 大屁股大乳丰满人妻 | 丰满诱人的人妻3 | 人妻少妇被猛烈进入中文字幕 | 丁香啪啪综合成人亚洲 | 日日摸夜夜摸狠狠摸婷婷 | 超碰97人人射妻 | 久久国产精品_国产精品 | 中文字幕无码日韩欧毛 | 成人无码影片精品久久久 | 国产真实伦对白全集 | 国产精品丝袜黑色高跟鞋 | 亚洲 激情 小说 另类 欧美 | 撕开奶罩揉吮奶头视频 | 东京热一精品无码av | 免费观看激色视频网站 | 欧美日本免费一区二区三区 | 熟妇人妻激情偷爽文 | 亚洲人亚洲人成电影网站色 | 国产97人人超碰caoprom | 国产成人人人97超碰超爽8 | 国产亚洲欧美在线专区 | 中国女人内谢69xxxxxa片 | 日本精品高清一区二区 | 一二三四社区在线中文视频 | 丰满少妇弄高潮了www | 亚洲狠狠色丁香婷婷综合 | 久久这里只有精品视频9 | 一个人免费观看的www视频 | 国产成人综合在线女婷五月99播放 | 国产在线精品一区二区三区直播 | 在线亚洲高清揄拍自拍一品区 | 亚洲无人区午夜福利码高清完整版 | 国产精品久久久久久亚洲影视内衣 | 久久精品中文字幕大胸 | 中文字幕av日韩精品一区二区 | 天堂а√在线中文在线 | 学生妹亚洲一区二区 | 人妻aⅴ无码一区二区三区 | 成人片黄网站色大片免费观看 | 国产深夜福利视频在线 | 蜜桃视频插满18在线观看 | 国产网红无码精品视频 | 亚洲第一网站男人都懂 | 久久久婷婷五月亚洲97号色 | 97夜夜澡人人爽人人喊中国片 | 国产亚洲欧美在线专区 | 亚洲一区二区三区在线观看网站 | 免费网站看v片在线18禁无码 | 国内精品一区二区三区不卡 | 理论片87福利理论电影 | 青春草在线视频免费观看 | 蜜桃视频插满18在线观看 | 精品无码国产一区二区三区av | 天堂а√在线中文在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 在线播放免费人成毛片乱码 | 欧美国产日产一区二区 | 欧美阿v高清资源不卡在线播放 | 日韩精品乱码av一区二区 | ass日本丰满熟妇pics | 久久熟妇人妻午夜寂寞影院 | 久久99精品久久久久久动态图 | 精品国产国产综合精品 | 波多野结衣av一区二区全免费观看 | 日本精品人妻无码免费大全 | 亚洲国产精品无码久久久久高潮 | 女高中生第一次破苞av | 国产在线一区二区三区四区五区 | 精品少妇爆乳无码av无码专区 | 久激情内射婷内射蜜桃人妖 | 成人一在线视频日韩国产 | 乱人伦人妻中文字幕无码久久网 | 欧美人与禽zoz0性伦交 | 久久国语露脸国产精品电影 | 欧美亚洲日韩国产人成在线播放 | 国产精品99久久精品爆乳 | 四虎国产精品一区二区 | 131美女爱做视频 | 夜夜躁日日躁狠狠久久av | 人妻有码中文字幕在线 | 精品无人区无码乱码毛片国产 | 日本乱人伦片中文三区 | 亚洲精品久久久久avwww潮水 | 久久人妻内射无码一区三区 | 人人超人人超碰超国产 | 国产农村乱对白刺激视频 | 亚洲精品一区二区三区婷婷月 | 亚洲成av人片天堂网无码】 | 欧美激情内射喷水高潮 | 日韩欧美群交p片內射中文 | 中文字幕乱妇无码av在线 | 国产av剧情md精品麻豆 | 欧美野外疯狂做受xxxx高潮 | 精品无人国产偷自产在线 | 亚洲欧美日韩国产精品一区二区 | 国产国语老龄妇女a片 | 亚洲精品欧美二区三区中文字幕 | 成人免费视频视频在线观看 免费 | 思思久久99热只有频精品66 | 无码国产激情在线观看 | 国产乱人偷精品人妻a片 | 亚洲日韩av一区二区三区中文 | 日本精品少妇一区二区三区 | 内射巨臀欧美在线视频 | 亚洲第一网站男人都懂 | 色欲综合久久中文字幕网 | 国产亚洲精品久久久久久 | 欧洲vodafone精品性 | 欧美丰满少妇xxxx性 | 久久精品中文闷骚内射 | 久久久国产精品无码免费专区 | 日日天日日夜日日摸 | 久久99精品国产.久久久久 | 玩弄人妻少妇500系列视频 | 捆绑白丝粉色jk震动捧喷白浆 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久亚洲精品中文字幕无男同 | 色综合久久久久综合一本到桃花网 | 男女爱爱好爽视频免费看 | 国内综合精品午夜久久资源 | 亚洲 激情 小说 另类 欧美 | 中文字幕乱码人妻无码久久 | 男女爱爱好爽视频免费看 | 亚洲成a人一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产手机在线αⅴ片无码观看 | 欧美三级不卡在线观看 | 免费播放一区二区三区 | 欧美 日韩 人妻 高清 中文 | 亚洲а∨天堂久久精品2021 | 亚洲s码欧洲m码国产av | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美人与牲动交xxxx | 亚洲熟妇自偷自拍另类 | 奇米影视888欧美在线观看 | 狂野欧美激情性xxxx | 在线观看欧美一区二区三区 | 午夜福利电影 | 色诱久久久久综合网ywww | 激情国产av做激情国产爱 | 99久久精品午夜一区二区 | 无遮无挡爽爽免费视频 | 天下第一社区视频www日本 | 波多野结衣一区二区三区av免费 | 精品国产av色一区二区深夜久久 | 欧美丰满熟妇xxxx性ppx人交 | 久久人人爽人人爽人人片ⅴ | 男女爱爱好爽视频免费看 | 曰韩少妇内射免费播放 | 2020久久香蕉国产线看观看 | 久久国产精品偷任你爽任你 | 日本乱人伦片中文三区 | 妺妺窝人体色www在线小说 | 色婷婷综合激情综在线播放 | 国产真人无遮挡作爱免费视频 | 福利一区二区三区视频在线观看 | 高潮毛片无遮挡高清免费 | 高清国产亚洲精品自在久久 | 亚洲理论电影在线观看 | 国内丰满熟女出轨videos | 亚洲а∨天堂久久精品2021 | 无码国产乱人伦偷精品视频 | 久久久国产精品无码免费专区 | 午夜福利不卡在线视频 | 亚洲综合另类小说色区 | 久久久久免费看成人影片 | 亚洲色欲久久久综合网东京热 | 丰满人妻一区二区三区免费视频 | 色偷偷人人澡人人爽人人模 | 一个人免费观看的www视频 | 精品久久综合1区2区3区激情 | 四虎国产精品一区二区 | 久久久久成人精品免费播放动漫 | 久久国产精品萌白酱免费 | 亚洲码国产精品高潮在线 | 蜜桃臀无码内射一区二区三区 | 亚洲一区二区三区在线观看网站 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲理论电影在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 黑人巨大精品欧美一区二区 | 国产亚洲美女精品久久久2020 | 最近中文2019字幕第二页 | av香港经典三级级 在线 | 六十路熟妇乱子伦 | 中文精品无码中文字幕无码专区 | 国产精品18久久久久久麻辣 | 欧美 亚洲 国产 另类 | 偷窥村妇洗澡毛毛多 | 亚洲精品成人av在线 | 成人影院yy111111在线观看 | 色欲av亚洲一区无码少妇 | 中文无码精品a∨在线观看不卡 | 欧美黑人性暴力猛交喷水 | 日日干夜夜干 | 天天燥日日燥 | 无码国内精品人妻少妇 | 美女极度色诱视频国产 | 欧美放荡的少妇 | 香蕉久久久久久av成人 | 99久久婷婷国产综合精品青草免费 | www国产亚洲精品久久久日本 | 中文字幕精品av一区二区五区 | 成年美女黄网站色大免费全看 | 在线看片无码永久免费视频 | 成熟女人特级毛片www免费 | 丰满肥臀大屁股熟妇激情视频 | 免费看少妇作爱视频 | 扒开双腿吃奶呻吟做受视频 | 亚洲欧美精品伊人久久 | 成人性做爰aaa片免费看不忠 | 男女下面进入的视频免费午夜 | 久久午夜夜伦鲁鲁片无码免费 | 天天拍夜夜添久久精品大 | 亚洲日韩一区二区 | 国内综合精品午夜久久资源 | 免费国产成人高清在线观看网站 | 亚洲第一网站男人都懂 | 日韩人妻系列无码专区 | av无码电影一区二区三区 | 国产成人久久精品流白浆 | 午夜成人1000部免费视频 | 精品无码国产一区二区三区av | 帮老师解开蕾丝奶罩吸乳网站 | 久久久国产精品无码免费专区 | 国产无遮挡吃胸膜奶免费看 | 在线观看国产一区二区三区 | 亚洲成a人片在线观看无码3d | 国产区女主播在线观看 | 色综合久久网 | 亚洲熟女一区二区三区 | 成人毛片一区二区 | 亚洲欧美中文字幕5发布 | 中文字幕无码日韩欧毛 | 成 人影片 免费观看 | 国产精品久久久久久亚洲毛片 | 97资源共享在线视频 | 久久精品中文闷骚内射 | 亚洲中文字幕成人无码 | 欧美兽交xxxx×视频 | 人妻体内射精一区二区三四 | 久久国内精品自在自线 | 中国女人内谢69xxxxxa片 | 中文字幕无码免费久久9一区9 | 久久午夜无码鲁丝片午夜精品 | 久久精品国产大片免费观看 | 国内精品一区二区三区不卡 | 中文无码伦av中文字幕 | 欧美35页视频在线观看 | 亚洲成a人一区二区三区 | 日本熟妇浓毛 | 搡女人真爽免费视频大全 | 亚洲の无码国产の无码影院 | 久久国产36精品色熟妇 | 国产成人综合美国十次 | 成人精品天堂一区二区三区 | 噜噜噜亚洲色成人网站 | 成人欧美一区二区三区黑人 | 激情人妻另类人妻伦 | 欧美国产日韩亚洲中文 | 国产成人无码区免费内射一片色欲 | 丰满少妇人妻久久久久久 | 亚洲欧洲中文日韩av乱码 | 小泽玛莉亚一区二区视频在线 | 国産精品久久久久久久 | 西西人体www44rt大胆高清 | 久久久亚洲欧洲日产国码αv | 久久精品视频在线看15 | 亚洲国产成人av在线观看 | 色窝窝无码一区二区三区色欲 | 在线播放无码字幕亚洲 | 夜夜躁日日躁狠狠久久av | 精品偷自拍另类在线观看 | 亚洲成av人综合在线观看 | 99精品国产综合久久久久五月天 | 欧美丰满熟妇xxxx性ppx人交 | 三级4级全黄60分钟 | 中文字幕亚洲情99在线 | 亚洲人成无码网www | 小泽玛莉亚一区二区视频在线 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 激情内射亚州一区二区三区爱妻 | 欧美大屁股xxxxhd黑色 | 国产无av码在线观看 | 久久午夜无码鲁丝片秋霞 | 欧美老人巨大xxxx做受 | 久久精品中文字幕一区 | 亚洲а∨天堂久久精品2021 | 久久伊人色av天堂九九小黄鸭 | 中文字幕人妻无码一区二区三区 | 亚洲一区二区三区无码久久 | 欧美国产日韩久久mv | 亚洲国产成人av在线观看 | 图片区 小说区 区 亚洲五月 | 18精品久久久无码午夜福利 | 免费看少妇作爱视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 性啪啪chinese东北女人 | 国产精品香蕉在线观看 | 无码午夜成人1000部免费视频 | 小泽玛莉亚一区二区视频在线 | 国产亲子乱弄免费视频 | 伊在人天堂亚洲香蕉精品区 | 久久精品无码一区二区三区 | 久久99国产综合精品 | 久久久婷婷五月亚洲97号色 | 国产做国产爱免费视频 | 日韩精品成人一区二区三区 | 秋霞特色aa大片 | 99久久99久久免费精品蜜桃 | 亚洲一区二区观看播放 | 国产三级久久久精品麻豆三级 | 国产极品视觉盛宴 | 日韩欧美成人免费观看 | 中文精品久久久久人妻不卡 | 大地资源网第二页免费观看 | 午夜精品一区二区三区在线观看 | 未满小14洗澡无码视频网站 | 久久精品一区二区三区四区 | 亚洲熟悉妇女xxx妇女av | 一本久久伊人热热精品中文字幕 | 日韩欧美成人免费观看 | 2020最新国产自产精品 | 久久久www成人免费毛片 | 国产亲子乱弄免费视频 | 精品欧洲av无码一区二区三区 | 娇妻被黑人粗大高潮白浆 | 国产精品久久久av久久久 | 日本又色又爽又黄的a片18禁 | 久久精品国产大片免费观看 | 日本一卡二卡不卡视频查询 | 中国女人内谢69xxxxxa片 | 亚洲国产精品久久久久久 | 97夜夜澡人人双人人人喊 | 国产人妻精品一区二区三区 | 丰满妇女强制高潮18xxxx | 呦交小u女精品视频 | 中文亚洲成a人片在线观看 | 久久久久av无码免费网 | 精品无码成人片一区二区98 | 强奷人妻日本中文字幕 | 欧美人与禽猛交狂配 | 亚洲爆乳无码专区 | 国产免费无码一区二区视频 | 红桃av一区二区三区在线无码av | 少妇高潮一区二区三区99 | 人人妻人人澡人人爽人人精品 | 国产精品人人爽人人做我的可爱 | 图片区 小说区 区 亚洲五月 | 国内精品人妻无码久久久影院蜜桃 | 福利一区二区三区视频在线观看 | 青青青手机频在线观看 | 国产口爆吞精在线视频 | 99久久人妻精品免费二区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲中文字幕av在天堂 | 国产亚洲视频中文字幕97精品 | 蜜桃视频韩日免费播放 | 国内精品久久久久久中文字幕 | 色欲综合久久中文字幕网 | 国产精品丝袜黑色高跟鞋 | 日韩无套无码精品 | 天天综合网天天综合色 | 久久久国产精品无码免费专区 | 大乳丰满人妻中文字幕日本 | 国产精品自产拍在线观看 | 亚洲成av人片在线观看无码不卡 | 99麻豆久久久国产精品免费 | 性欧美牲交xxxxx视频 | 亚洲成在人网站无码天堂 | 国色天香社区在线视频 | 99久久人妻精品免费二区 | 久久综合九色综合97网 | 亚洲第一网站男人都懂 | 97久久超碰中文字幕 | 樱花草在线社区www | 国产精品成人av在线观看 | 国产在线精品一区二区三区直播 | 思思久久99热只有频精品66 | 欧美国产日韩亚洲中文 | 98国产精品综合一区二区三区 | 亚洲无人区一区二区三区 | 激情内射亚州一区二区三区爱妻 | 欧美精品免费观看二区 | 草草网站影院白丝内射 | 久久国产精品二国产精品 | 一本大道久久东京热无码av | 亚洲国产精品久久久天堂 | 欧美35页视频在线观看 | 99精品视频在线观看免费 | 午夜性刺激在线视频免费 | 高潮毛片无遮挡高清免费 | 四虎国产精品一区二区 | 精品人妻人人做人人爽夜夜爽 | 蜜臀av在线播放 久久综合激激的五月天 | 夜精品a片一区二区三区无码白浆 | 女高中生第一次破苞av | 98国产精品综合一区二区三区 | 一本大道久久东京热无码av | 欧美丰满老熟妇xxxxx性 | 亚洲成a人片在线观看无码 | 久久精品国产99久久6动漫 | 色一情一乱一伦一区二区三欧美 | 亚洲人成无码网www | 青青青爽视频在线观看 | 亚洲自偷自拍另类第1页 | 乱码午夜-极国产极内射 | 亚洲阿v天堂在线 | 亚洲а∨天堂久久精品2021 | 精品一区二区三区波多野结衣 | 国产激情无码一区二区 | 欧美日韩在线亚洲综合国产人 | 玩弄人妻少妇500系列视频 | 国模大胆一区二区三区 | 一本大道久久东京热无码av | 久久97精品久久久久久久不卡 | 蜜臀av无码人妻精品 | 蜜桃臀无码内射一区二区三区 | 国产亚洲视频中文字幕97精品 | 午夜免费福利小电影 | 最新国产麻豆aⅴ精品无码 | 麻豆av传媒蜜桃天美传媒 | 少妇愉情理伦片bd | 久久久久亚洲精品中文字幕 | 天天躁夜夜躁狠狠是什么心态 | 精品日本一区二区三区在线观看 | 精品国产一区二区三区av 性色 | 无码国模国产在线观看 | 色婷婷香蕉在线一区二区 | 强奷人妻日本中文字幕 | 野外少妇愉情中文字幕 | 国产成人精品优优av | 中文字幕亚洲情99在线 | 久久久久久国产精品无码下载 | 在教室伦流澡到高潮hnp视频 | 午夜精品一区二区三区在线观看 | 亚洲狠狠色丁香婷婷综合 | 又大又硬又黄的免费视频 | 亚洲中文字幕成人无码 | 久久精品女人天堂av免费观看 | 99久久久国产精品无码免费 | 国精品人妻无码一区二区三区蜜柚 | 老子影院午夜精品无码 | 国产xxx69麻豆国语对白 | 国产av久久久久精东av | 亚洲无人区午夜福利码高清完整版 | 免费无码午夜福利片69 | 四虎影视成人永久免费观看视频 | 亚洲熟悉妇女xxx妇女av | 欧美 日韩 人妻 高清 中文 | 超碰97人人做人人爱少妇 | 久久久久亚洲精品中文字幕 | 国产亚洲精品久久久久久国模美 | 精品国偷自产在线视频 | 欧美黑人性暴力猛交喷水 | 人人妻人人藻人人爽欧美一区 | 97资源共享在线视频 | 1000部啪啪未满十八勿入下载 | 久久精品国产99精品亚洲 | 国产无av码在线观看 | 香蕉久久久久久av成人 | 一本久道久久综合婷婷五月 | 永久黄网站色视频免费直播 | 成人精品视频一区二区 | 亚洲日韩一区二区 | 成人片黄网站色大片免费观看 | 久久久久免费精品国产 | 少妇被黑人到高潮喷出白浆 | 国产精品美女久久久网av | 日韩精品无码一区二区中文字幕 | 国产精品欧美成人 | 久久久久久亚洲精品a片成人 | 中文字幕 人妻熟女 | 国色天香社区在线视频 | 大肉大捧一进一出视频出来呀 | 99久久婷婷国产综合精品青草免费 | 亚洲一区二区三区无码久久 | 无码国模国产在线观看 | 无码精品人妻一区二区三区av | 无码播放一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久国产精品精品国产色婷婷 | 国产精品高潮呻吟av久久4虎 | 国产莉萝无码av在线播放 | 亚洲伊人久久精品影院 | 亚洲经典千人经典日产 | 欧洲欧美人成视频在线 | 日本熟妇乱子伦xxxx | 领导边摸边吃奶边做爽在线观看 | 亚洲日韩av一区二区三区中文 | 国产无av码在线观看 | 国产乱码精品一品二品 | 人妻夜夜爽天天爽三区 | 午夜精品一区二区三区在线观看 | 高潮毛片无遮挡高清免费视频 | 午夜精品久久久久久久 | 国内少妇偷人精品视频 | 麻豆蜜桃av蜜臀av色欲av | 1000部夫妻午夜免费 | 双乳奶水饱满少妇呻吟 | 国产超级va在线观看视频 | 中文字幕av无码一区二区三区电影 | 中文字幕+乱码+中文字幕一区 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲精品成a人在线观看 | 欧美老熟妇乱xxxxx | 一本一道久久综合久久 | 亚洲精品美女久久久久久久 | 亚洲精品久久久久avwww潮水 | 亚洲精品中文字幕久久久久 | 亚洲色成人中文字幕网站 | 国产亚洲精品久久久久久久久动漫 | 色一情一乱一伦一区二区三欧美 | 久久久久久久人妻无码中文字幕爆 | 亚洲熟熟妇xxxx | 久久人人爽人人爽人人片av高清 | 中文字幕av日韩精品一区二区 | 久久精品国产99精品亚洲 | 亚洲伊人久久精品影院 | 欧美激情一区二区三区成人 | 人妻夜夜爽天天爽三区 | 国产在线无码精品电影网 | 国产莉萝无码av在线播放 | 东京热一精品无码av | 久久综合香蕉国产蜜臀av | 欧美人与牲动交xxxx | 人妻少妇精品无码专区动漫 | av无码电影一区二区三区 | 久久精品无码一区二区三区 | 人人妻人人藻人人爽欧美一区 | 欧美日韩在线亚洲综合国产人 | 色婷婷综合中文久久一本 | 97精品人妻一区二区三区香蕉 | 草草网站影院白丝内射 | 无码av最新清无码专区吞精 | 精品午夜福利在线观看 | 国产成人一区二区三区别 | 久久亚洲精品成人无码 | 未满小14洗澡无码视频网站 | 日日碰狠狠丁香久燥 | 久久久久99精品成人片 | 鲁大师影院在线观看 | 色妞www精品免费视频 | 国产激情艳情在线看视频 | 国产精品第一国产精品 | 帮老师解开蕾丝奶罩吸乳网站 | 夜夜影院未满十八勿进 | 亚洲综合无码久久精品综合 | 欧美xxxx黑人又粗又长 | 九月婷婷人人澡人人添人人爽 | 久久久精品人妻久久影视 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产高潮视频在线观看 | 亚洲综合无码久久精品综合 | 中文字幕乱码中文乱码51精品 | 国产一精品一av一免费 | 一本色道久久综合亚洲精品不卡 | 丰满人妻被黑人猛烈进入 | 网友自拍区视频精品 | 国产av无码专区亚洲a∨毛片 | 国产午夜手机精彩视频 | 国内精品久久毛片一区二区 | 国产三级精品三级男人的天堂 | 一二三四在线观看免费视频 | 国产明星裸体无码xxxx视频 | 久久久www成人免费毛片 | 日产精品高潮呻吟av久久 | 免费播放一区二区三区 | 亚洲精品综合五月久久小说 | 中文字幕无线码 | 国产午夜手机精彩视频 | v一区无码内射国产 | 国模大胆一区二区三区 | 伊人久久大香线蕉av一区二区 | 丁香啪啪综合成人亚洲 | 国产精品嫩草久久久久 | 国产人妻大战黑人第1集 | 成人av无码一区二区三区 | 欧美精品国产综合久久 | 日韩成人一区二区三区在线观看 | 午夜福利试看120秒体验区 | 免费乱码人妻系列无码专区 | 亚洲男女内射在线播放 | 人妻天天爽夜夜爽一区二区 | 国产精品内射视频免费 | 欧美精品无码一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 国产suv精品一区二区五 | 亚洲国产综合无码一区 | 久久亚洲日韩精品一区二区三区 | 成熟女人特级毛片www免费 | 狂野欧美激情性xxxx | 东京热一精品无码av | 国产电影无码午夜在线播放 | 少妇被黑人到高潮喷出白浆 | 色综合天天综合狠狠爱 | 丰满妇女强制高潮18xxxx | 性欧美videos高清精品 | 亚洲欧美日韩成人高清在线一区 | 欧美亚洲国产一区二区三区 | 麻豆人妻少妇精品无码专区 | 久久综合九色综合欧美狠狠 | 初尝人妻少妇中文字幕 | 国产精品久久国产三级国 | 性开放的女人aaa片 | 久久亚洲a片com人成 | 亚洲人成网站色7799 | 亚洲中文字幕va福利 | 亚洲精品久久久久avwww潮水 | 免费国产成人高清在线观看网站 | 丰满人妻精品国产99aⅴ | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产在线一区二区三区四区五区 | 天天燥日日燥 | 国产精品va在线观看无码 | 亚洲熟熟妇xxxx | 成人性做爰aaa片免费看不忠 | 三级4级全黄60分钟 | 国产精品对白交换视频 | 2019午夜福利不卡片在线 | 国产精品va在线观看无码 | 99er热精品视频 | 久久人人爽人人爽人人片ⅴ | 日产国产精品亚洲系列 | 国产精品久久久久7777 | 成人免费视频视频在线观看 免费 | 亚洲色www成人永久网址 | 成年女人永久免费看片 | 中文亚洲成a人片在线观看 | 在线观看欧美一区二区三区 | 青青久在线视频免费观看 | 亚洲欧美国产精品久久 | 中文精品久久久久人妻不卡 | 成人免费视频在线观看 | 午夜丰满少妇性开放视频 | 国产乱码精品一品二品 | 5858s亚洲色大成网站www | 中文字幕av无码一区二区三区电影 | 国产偷国产偷精品高清尤物 | 成人亚洲精品久久久久 | 亚洲s色大片在线观看 | 欧美性猛交内射兽交老熟妇 | 对白脏话肉麻粗话av | 亚洲精品中文字幕乱码 | 亲嘴扒胸摸屁股激烈网站 | 伊在人天堂亚洲香蕉精品区 | 中文字幕+乱码+中文字幕一区 | 清纯唯美经典一区二区 | 亚洲精品国偷拍自产在线麻豆 | av无码不卡在线观看免费 | 亚洲精品一区三区三区在线观看 | 在线播放免费人成毛片乱码 | 久久久久成人精品免费播放动漫 | 久久99精品久久久久久动态图 | 天堂在线观看www | 亚洲精品国产精品乱码视色 | 中文字幕av日韩精品一区二区 | 欧美日韩一区二区免费视频 | 久久精品国产99精品亚洲 | 1000部啪啪未满十八勿入下载 | 久久97精品久久久久久久不卡 | 97人妻精品一区二区三区 | 国产精品美女久久久久av爽李琼 | 日本一本二本三区免费 | 亚洲精品成人av在线 | 成人性做爰aaa片免费看 | 美女毛片一区二区三区四区 | 亚洲 激情 小说 另类 欧美 | 国内精品一区二区三区不卡 | 亚洲国产高清在线观看视频 | 精品国偷自产在线 | 熟妇人妻无乱码中文字幕 | v一区无码内射国产 | 3d动漫精品啪啪一区二区中 | 黄网在线观看免费网站 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲精品综合一区二区三区在线 | 99久久精品日本一区二区免费 | 亚洲精品国产精品乱码视色 | 精品无人国产偷自产在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 老司机亚洲精品影院无码 | 色综合久久88色综合天天 | 国产欧美精品一区二区三区 | 最新国产麻豆aⅴ精品无码 | 日本大乳高潮视频在线观看 | av小次郎收藏 | 美女黄网站人色视频免费国产 | 成 人影片 免费观看 | 又大又硬又爽免费视频 | 无码人妻精品一区二区三区不卡 | 中文字幕无码乱人伦 | 久久亚洲中文字幕无码 | 国产亚洲tv在线观看 | 乱码av麻豆丝袜熟女系列 | 在线精品国产一区二区三区 | 日韩人妻无码中文字幕视频 |