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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis开发与运维

發(fā)布時(shí)間:2023/12/10 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis开发与运维 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本書全面講解了Redis基本功能及其使用,并結(jié)合線上開發(fā)與運(yùn)維中的實(shí)際案例,深入分析并總結(jié)了實(shí)際工作中遇到的“陷進(jìn)”,以及背后的原因,包含大規(guī)模集群開發(fā)與管理的場景、應(yīng)用案例與開發(fā)技巧,為高效開發(fā)運(yùn)維提供了大量實(shí)際經(jīng)驗(yàn)和建議。

本書不要求讀者有任何Redis使用經(jīng)驗(yàn),對(duì)入門與進(jìn)階DevOps的開發(fā)者提供有價(jià)值的幫助。

主要內(nèi)容包括:

  • Redis的安裝配置
  • API
  • 各種高效功能
  • 客戶端
  • 持久化
  • 復(fù)制
  • 高可用
  • 內(nèi)存
  • 哨兵
  • 集群
  • 緩存設(shè)計(jì)等
  • Redis高可用集群解決方案
  • Redis設(shè)計(jì)和使用中的問題
  • 最后提供了一個(gè)開源工具:Redis監(jiān)控運(yùn)維云平臺(tái)CacheCloud

前言

? Redis作為基于 鍵值對(duì)NoSQLNot Only Sql)數(shù)據(jù)庫,

具有 高性能、豐富的數(shù)據(jù)結(jié)構(gòu)、持久化、高可用分布式等特性,

同時(shí)Redis本身非常穩(wěn)定,已經(jīng)得到業(yè)界的廣泛認(rèn)可和使用。

掌握Redis已經(jīng)逐步稱為開發(fā)和運(yùn)維人員的必備技能之一。

? 本書關(guān)注了Redis開發(fā)運(yùn)維的方方面面,尤其對(duì)于開發(fā)運(yùn)維中如何提高效率、減少可能遇到的問題進(jìn)行詳細(xì)分析,但本書不單單介紹怎么解決這些問題,而是通過對(duì)Redis重要原理的解析,幫助開發(fā)運(yùn)維人員學(xué)會(huì)找到問題的方法,以及理解背后的原理,從而讓開發(fā)運(yùn)維人員不僅知其然,而且知其所以然。

本書涵蓋內(nèi)容

? 第1章

? 初始Redis,帶讀者進(jìn)入Redis的世界,了解它的前世今生、眾多特性、應(yīng)用場景、安裝配置、簡單使用,最后對(duì)Redis發(fā)展過程中的重要版本進(jìn)行說明,可以讓讀者對(duì)Redis有一個(gè)全面的認(rèn)識(shí)。

? 第2章

? API的理解和使用,全面介紹了Redis的 5種數(shù)據(jù)結(jié)構(gòu) 字符串string)、哈希hash)、列表list)、集合set)、有序集合zset)的 數(shù)據(jù)模型、常用命令、典型應(yīng)用場景,并且每個(gè)小結(jié)都會(huì)給出在Redis開發(fā)過程中可能要注意的坑和技巧。同時(shí)本章還會(huì)對(duì)Redis的 單線程處理機(jī)制、**鍵值管理 ** 做一個(gè)全面介紹,通過對(duì)這些原理的理解,讀者可以在合適的應(yīng)用場景選擇合適的數(shù)據(jù)結(jié)構(gòu)和命令進(jìn)行開發(fā),有效提高程序效率,降低可能產(chǎn)生的問題和隱患。

? 第3章

? 小功能大用處,除了 5種數(shù)據(jù)結(jié)構(gòu) 外,Redis還提供了諸如 慢查詢Redis ShellPipelineLua腳本、Bitmaps、HyperLogLog、發(fā)布訂閱、GEO 等附加功能,在這些功能的幫助下,Redis的應(yīng)用場景更加豐富。

? 第4章

? 客戶端,本章重點(diǎn)關(guān)注Redis客戶端的開發(fā),介紹了Redis的 客戶端通信協(xié)議、詳細(xì)講解了Java客戶端 Jedis 的使用技巧,同時(shí)通過從原理角度剖析在開發(fā)運(yùn)維中,客戶端的監(jiān)控和管理技巧,最后給出客戶端開發(fā)中常見問題以及案例講解。

? 第5章

? 持久化,Redis的 持久化 功能有效避免因進(jìn)程退出造成的數(shù)據(jù)丟失問題,本章首先介紹 RDBAOF 兩種 持久化配置和運(yùn)行流程,其次對(duì)常見的持久化問題進(jìn)行定位和優(yōu)化,最后結(jié)合Redis常見的單機(jī)多實(shí)例部署場景進(jìn)行優(yōu)化。

? 第6章

? 復(fù)制,在分布式系統(tǒng)中為了解決單點(diǎn)問題,通常會(huì)把數(shù)據(jù)復(fù)制多個(gè)副本部署到其他機(jī)器,用于故障恢復(fù)和負(fù)載均衡等需求,Redis也是如此。它為我們提供了 復(fù)制replication)功能,實(shí)現(xiàn)了多個(gè)相同數(shù)據(jù)的Redis副本。 復(fù)制功能是 高可用Redis的基礎(chǔ),后面章節(jié)的 哨兵集群 都是在 復(fù)制的基礎(chǔ)上 實(shí)現(xiàn)高可用。

? 第7章

? Redis的噩夢:阻塞,Redis是典型的單線程架構(gòu)所有的讀寫操作 都在一條 主線程 中完成的。當(dāng)Redis用于 高并發(fā) 場景時(shí)這條線程就變成了它的生命線。如果出現(xiàn)阻塞哪怕是很短時(shí)間對(duì)于我們的應(yīng)用來說都是噩夢。導(dǎo)致阻塞問題的場景大致分為 內(nèi)在原因外在原因,本章將進(jìn)行詳細(xì)分析。

? 第8章

? 理解內(nèi)存,Redis所有的數(shù)據(jù)在于內(nèi)存中,如何高效利用Redis內(nèi)存變得非常重要。高效利用Redis內(nèi)存 首先需要理解 Redis內(nèi)存消耗在哪里如何管理內(nèi)存,最后再深入到 如何優(yōu)化內(nèi)存。掌握這些知識(shí)后相信讀者能夠?qū)崿F(xiàn) 用更少的內(nèi)存存儲(chǔ)更多的數(shù)據(jù) 從而 降低成本 。

? 第9章

? 哨兵,Redis從 2.8 版本開始正式提供了 Redis Sentinel,它有效解決了 主從模式故障轉(zhuǎn)移 的若干問題,為Redis提供了 高可用 功能。本章將一步步解析 Redis Sentinel 的相關(guān)概念、安裝部署、配置命令使用、原理解析,最后分析了 Redis Sentinel 運(yùn)維中的一些問題。

? 第10章

? 集群,是本書的重頭戲, Redis ClusterRedis 3 提供的 Redis 分布式解決方案,有效解決了 Redis分布式 方面的需求,理解應(yīng)用好 Redis Cluster 將極大地解放我們對(duì) 分布式Redis 的需求,同時(shí)它也是學(xué)習(xí) 分布式存儲(chǔ) 的絕佳案例。本章將對(duì) Redis Cluster數(shù)據(jù)分布搭建集群節(jié)點(diǎn)通信、請(qǐng)求路由、集群伸縮、故障轉(zhuǎn)移 等方面進(jìn)行分析說明。

? 第11章

? 緩存設(shè)計(jì)緩存 能夠有效 加速應(yīng)用的讀寫速度,以及 降低后端負(fù)載,對(duì)于開發(fā)人員進(jìn)行日常應(yīng)用的開發(fā)至關(guān)重要,但是將 緩存 加入應(yīng)用架構(gòu)后也會(huì)帶來一些問題,本章將介紹 緩存使用設(shè)計(jì) 中遇到的問題,具體包括:緩存的收益和成本緩存更新策略緩存粒度控制、穿透問題優(yōu)化無底洞問題優(yōu)化、雪崩問題優(yōu)化熱點(diǎn)key優(yōu)化。

? 第12章

? 開發(fā)運(yùn)維的“陷進(jìn)”,介紹Redis開發(fā)運(yùn)維中的一些棘手問題,具體包括:Linux配置優(yōu)化、flush誤操作數(shù)據(jù)恢復(fù)、如何讓Redis變得安全、bigkey 問題、熱點(diǎn)key 問題。

? 第13章

? Redis監(jiān)控運(yùn)維云平臺(tái) CacheCloud,介紹筆者所在團(tuán)隊(duì) 開源Redis運(yùn)維工具 CacheCloud,它有效解決了Redis監(jiān)控和運(yùn)維中的一些問題,本章將按照 快速部署機(jī)器部署接入應(yīng)用用戶功能運(yùn)維功能 多個(gè)維度全面的介紹 CacheCloud,相信在它的幫助下,讀者可以更好的監(jiān)控和運(yùn)維好Redis。

? 第14章

? Redis配置統(tǒng)計(jì)字典,會(huì)對(duì)Redis的 系統(tǒng)狀態(tài)信息 以及 全部配置 做一個(gè)全面的梳理,希望本章能夠成為 Redis配置統(tǒng)計(jì)字典,協(xié)助大家分析和解決日常開發(fā)和運(yùn)維中遇到的問題。

第1章 初始Redis

1.1 盛贊Redis

1.2 Redis特性

1.3 Redis使用場景

? 1.3.1 Redis可以做什么

? 1.3.2 Redis不可以做什么

1.4 用好Redis的建議

1.5 正確安裝并啟動(dòng)Redis

? 1.5.1 安裝Redis

? 1.5.2 配置、啟動(dòng)、操作、關(guān)閉Redis

1.6 Redis重大版本

1.7 本章重點(diǎn)回顧

第1章 初始Redis

? 本章將帶領(lǐng)讀者進(jìn)入Redis的世界,了解它的前世今生、眾多特性、典型應(yīng)用場景、安裝配置、如何好用 等,最后會(huì)對(duì)Redis發(fā)展過程中的 重要版本 進(jìn)行說明,本章主要內(nèi)容如下:

  • 盛贊Redis
  • Redis特性
  • Redis使用場景
  • 用好Redis的建議
  • 正確安裝啟動(dòng)Redis
  • Redis重大版本

1.1 盛贊Redis

Redis官網(wǎng):http://redis.io

Redis 是一種基于 鍵值對(duì)key-value)的 NoSQL 數(shù)據(jù)庫

與很多 鍵值對(duì)數(shù)據(jù)庫 不同的是,

Redis 中的 可以是由 string字符串)、hash哈希)、list列表)、set(集合)、zset有序集合)、Bitmaps位圖)、HyperLogLog、GEO地理信息定位) 等 多種數(shù)據(jù)結(jié)構(gòu)和算法 組成,因此 Redis 可以 滿足很多的 應(yīng)用場景

而且因?yàn)?Redis 會(huì)將 所有數(shù)據(jù)存放在 內(nèi)存 中,所以它的 讀寫性能 非常 驚人。

不僅如此,Redis 還可以將 內(nèi)存的數(shù)據(jù) 利用 快照日志 的形式 保存到 硬盤 上,這樣在發(fā)生類似 斷電 或者 機(jī)器故障 的時(shí)候,內(nèi)存中的數(shù)據(jù) 不會(huì) “丟失”。

除了上述功能以外,Redis 還提供了 鍵過期、發(fā)布訂閱、事務(wù)、流水線、Lua腳本 等附加功能。

總之,如果在合適的場景使用好 Redis,它就會(huì)像一把瑞士軍刀一樣所向披靡。

2008年,Redis 的作者 Salvatore Sanfilippo 在開發(fā)一個(gè)叫 LLOOGG 的網(wǎng)站時(shí),需要實(shí)現(xiàn)一個(gè) 高性能隊(duì)列功能,最開始是使用 MySQL 來實(shí)現(xiàn)的,但后來發(fā)現(xiàn)無論怎么優(yōu)化 SQL語句 都不能使 網(wǎng)站的性能 提高上去,再加上自己囊中羞澀,于是他決定自己做一個(gè)專屬于 LLOOGG 的數(shù)據(jù)庫,這個(gè)就是 Redis的前身。

后來,Salvatore SanfilippoRedis 1.0 的源碼開放到 GitHub 上,可能連他自己都沒想到,Redis 后來如此受歡迎。

假如現(xiàn)在有人問 Redis的作者 都有誰在使用 Redis,我想他可以開句玩笑的回答:還有誰不使用Redis,當(dāng)然這只是開玩笑,但是從 Redis 的官方公司統(tǒng)計(jì)來看,有很多重量級(jí)的公司都在使用 Redis,如果單單從體量來統(tǒng)計(jì),新浪微博 可以說是全球最大的 Redis 使用者,除了 新浪微博,還有像 阿里巴巴、騰訊、百度、搜狐、優(yōu)酷土豆、美團(tuán)、小米、唯品會(huì)等公司都是 Redis 的使用者。

除此之外,許多開源技術(shù)想ELK等已經(jīng)把 Redis 作為它們組件中的重要一環(huán),而且 Redis 會(huì)在未來的版本中提供 模板系統(tǒng) 讓第三方人員 實(shí)現(xiàn)擴(kuò)展功能,讓 Redis 發(fā)揮出更大的威力。

所以,可以這么說,熟練使用和運(yùn)維 Redis 已經(jīng)成為開發(fā)運(yùn)維人員的一個(gè)必備技能。

1.2 Redis特性

? Redis 之所以受到如此多公司的青睞,必然有之過人之處,下面是關(guān)于 Redis 的 8個(gè)重要特性。

  • 速度 快

    正常情況下,Redis 執(zhí)行命令的速度 非常快,官方給出的數(shù)字是 讀寫性能 可以達(dá)到 10萬/秒,當(dāng)然這也取決于 機(jī)器的性能,但這里先不討論 機(jī)器性能上的差異,只分析一下是什么造就了 Redis 除此之外的 速度,可以大致歸納為以下四點(diǎn):

    • Redis 的 所有數(shù)據(jù) 都是 存放在 內(nèi)存 中的,表1-1是谷歌公司2009年給出的各層級(jí)硬件執(zhí)行速度,所以 把數(shù)據(jù)放在內(nèi)存 中是 Redis速度快 的最主要原因。
    • Redis 使用 C語言 實(shí)現(xiàn)的,一般來說 C語言 實(shí)現(xiàn)的程序 “距離” 操作系統(tǒng)更近,執(zhí)行速度 相對(duì)會(huì)更快。
    • Redis 使用了 單線程架構(gòu),預(yù)防了 多線程 可能產(chǎn)生的 競爭問題。
    • 作者對(duì)于 Redis源代碼 可以說是 精打細(xì)磨,曾經(jīng)有人評(píng)價(jià) Redis 是少有的 集性能和優(yōu)雅于一身 的 開源代碼。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-CZFzKuIB-1621301836851)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210513170503130.png)]

    表1-1 谷歌公司給出的 各層級(jí) 硬件 執(zhí)行速度

    層級(jí)速度
    L1 cache reference0.5ns
    Branch mispredict5ns
    L2 cache reference7ns
    Mutex lock/unlock25ns
    Main memory reference100ns
    Compress 1K bytes with Zippy3 000ns
    Send 2K bytes over 1Gbps network20 000ns
    Read 1MB sequentially from Memory250 000ns
    Round trip within same datacenter500 000ns
    Disk seek10 000 000ns
    Read 1 MB sequentially from disk20 000 000ns
    Send packet CA->Netherlands->CA150 000 000ns
  • 基于 鍵值對(duì) 的數(shù)據(jù)結(jié)構(gòu) 服務(wù)器

    幾乎所有的 編程語言 都提供了類似 字典 的功能,

    例如Java里的 map、Python里的 dict

    類似于這種 組織數(shù)據(jù)的方式 叫做 基于鍵值 的方式

    與很多 鍵值對(duì) 數(shù)據(jù)庫 不同的是,

    Redis 中的 不僅可以是 字符串,而且還可以是 具體的 數(shù)據(jù)結(jié)構(gòu)

    這樣不僅能 便于在許多應(yīng)用場景的開發(fā),同時(shí)也能夠 提高開發(fā)效率

    Redis全稱Remote Dictionary Server

    它主要提供了 5種數(shù)據(jù)結(jié)構(gòu)字符串、哈希、列表、集合、有序集合

    同時(shí)在 字符串基礎(chǔ)之上 演變 出了 位圖Bitmaps)和 HyperLogLog 兩種神奇的 “數(shù)據(jù)結(jié)構(gòu)”

    并且隨著 LBSLocation Based Service基于位置服務(wù))的不斷發(fā)展,Redis 3.2 版本 中加入有關(guān) GEO地理信息定位)的功能,

    總之在這些數(shù)據(jù)結(jié)構(gòu)的幫助下,開發(fā)者可以開發(fā)出各種“有意思”的應(yīng)用。

  • 豐富的功能

    除了 5種數(shù)據(jù)結(jié)構(gòu)Redis 還提供了許多額外的功能:

    • 提供了 鍵過期 功能,可以用來實(shí)現(xiàn) 緩存。
    • 提供了 發(fā)布訂閱 功能,可以用來實(shí)現(xiàn) 消息系統(tǒng)
    • 支持 Lua腳本 功能,可以利用 Lua 創(chuàng)造出 新的Reds命令。
    • 提供了簡單的 事務(wù) 功能,能在一定程度上保證 事務(wù)特性。
    • 提供了 流水線Pipeline)功能,這樣 客戶端 能將 一批命令 一次性 傳到 Redis減少了 網(wǎng)絡(luò)的開銷
  • 簡單穩(wěn)定

    Redis簡單 主要表現(xiàn)在 三個(gè)方面。

    首先,Redis源碼 很少早期版本 的代碼只有 2萬行左右3.0版本 以后由于添加了 集群特性,代碼增至 5萬行左右,相對(duì)于很多 NoSQL數(shù)據(jù)庫 來說代碼量相對(duì)要少很多,也就意味著普通的開發(fā)和運(yùn)維人員完全可以“吃透”它。

    其次,Redis 使用 單線程模型,這樣不僅使得 Redis服務(wù)端處理模型 變得簡單, 而且也使得 客戶端開發(fā) 變得簡單。

    最后,Redis 不需要依賴于 操作系統(tǒng) 中的類庫(例如 Memcache 需要 依賴 libevent 這樣的 系統(tǒng)類庫),Redis 自己 實(shí)現(xiàn)事件處理 的相關(guān)功能。

    Redis 雖然很簡單,但是不代表它不穩(wěn)定。

    以筆者維護(hù)的上千個(gè)Redis為例,沒有出現(xiàn)過因?yàn)镽edis自身bug而宕掉的情況。

  • 客戶端語言 多

    Redis 提供了 簡單的 TCP通信協(xié)議,很多 編程語言 可以很 方便地 接入到 Redis,并且由于 Redis 受到 社區(qū)和各大公司的 廣泛認(rèn)可,所以 支持Redis的客戶端語言 也非常 ,幾乎涵蓋了 主流的編程語言,例如Java、PHP、Python、C、C++、Nodejs等,第4章我們將對(duì) Redis的客戶端 進(jìn)行詳細(xì)說明。

  • 持久化

    通常看,將 數(shù)據(jù) 放在 內(nèi)存 中是 不安全的,一旦發(fā)生 斷電 或者 機(jī)器故障重要的數(shù)據(jù) 可能就會(huì) 丟失,因此 Redis 提供了 兩種 持久化 方式RDBAOF,即可以用 兩種策略內(nèi)存的數(shù)據(jù) 保存到 硬盤中(如圖1-1所示),這樣就 保證數(shù)據(jù)的可持久性,第5章我們將對(duì) Redis的持久化 進(jìn)行詳細(xì)說明。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-1inDcMPh-1621301836855)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210513173702303.png)]

  • 主從復(fù)制

    Redis 提供了 復(fù)制 功能,實(shí)現(xiàn)了 多個(gè)相同數(shù)據(jù)的Redis副本(如圖1-2所示),復(fù)制 功能是 分布式Redis的基礎(chǔ)。第6章我們將會(huì)對(duì) Redis的復(fù)制 進(jìn)行詳細(xì)說明。

  • 高可用 和 分布式

    Redis2.8版本 正式提供了 高可用 實(shí)現(xiàn)Redis Sentinel,它能夠保證 Redis節(jié)點(diǎn)故障發(fā)現(xiàn)故障自動(dòng)轉(zhuǎn)移。

    Redis3.0版本 正式提供了 分布式 實(shí)現(xiàn) Redis Cluster,它是 Redis 真正的 分布式實(shí)現(xiàn),提供了 高可用讀寫容量的擴(kuò)展性。

  • 1.3 Redis 使用場景

    ? 上節(jié)我們已經(jīng)了解了 Redis 的若干個(gè) 特性,本節(jié)來看一下 Redis典型應(yīng)用場景 有哪些?

    1.3.1 Redis 可以做什么
  • 緩存

    緩存機(jī)制 幾乎在所有的大型網(wǎng)站 都有使用,合理地使用緩存 不僅可以 加快數(shù)據(jù)的訪問速度,而且能夠 有效地降低后端數(shù)據(jù)源的壓力。

    Redis 提供了 鍵值過期時(shí)間設(shè)置,并且也提供了 靈活控制最大內(nèi)存內(nèi)存溢出后的淘汰策略。

    可以這么說,一個(gè) 合理的緩存設(shè)計(jì) 能夠?yàn)?一個(gè)網(wǎng)站的穩(wěn)定 保駕護(hù)航。第11章將對(duì) 緩存的設(shè)計(jì)與使用 進(jìn)行詳細(xì)說明。

  • 排行榜系統(tǒng)

    排行榜系統(tǒng) 幾乎存在于所有的網(wǎng)站,例如 按照熱度排名的排行榜,按照發(fā)布時(shí)間的排行榜,按照各種復(fù)雜維度計(jì)算出的排行榜,Redis 提供了 列表有序集合 數(shù)據(jù)結(jié)構(gòu),合理地使用 這些 數(shù)據(jù)結(jié)構(gòu) 可以很 方便地構(gòu)建各種排行榜系統(tǒng)。

  • 計(jì)數(shù)器應(yīng)用

    計(jì)數(shù)器 在網(wǎng)站中的作用 至關(guān)重要,例如 視頻網(wǎng)站有 播放數(shù)、電商網(wǎng)站有 瀏覽數(shù),為了保證 數(shù)據(jù)的實(shí)時(shí)性每一次 播放和瀏覽 都要做 加1 的操作,如果 并發(fā)量很大 對(duì)于 傳統(tǒng)關(guān)系型數(shù)據(jù)庫的性能 是一種挑戰(zhàn)。

    Redis 天然支持 計(jì)數(shù)功能 而且 計(jì)數(shù)的性能 也非常,可以說是 計(jì)數(shù)器系統(tǒng) 的重要選擇。

  • 社交網(wǎng)絡(luò)

    贊/踩、粉絲、共同好友/喜好、推送、下拉刷新等是 社交網(wǎng)站的必備功能,由于社交網(wǎng)站 訪問量通常比較大,而且 傳統(tǒng)的關(guān)系型數(shù)據(jù)庫 不太適合保存這種類型的數(shù)據(jù),Redis 提供的 數(shù)據(jù)結(jié)構(gòu) 可以相對(duì)比較容易地實(shí)現(xiàn)這些功能。

  • 消息隊(duì)列系統(tǒng)

    消息隊(duì)列系統(tǒng) 可以說是 一個(gè)大型網(wǎng)站的必備基礎(chǔ)組件,因?yàn)槠渚哂?業(yè)務(wù) 解耦非實(shí)時(shí)業(yè)務(wù) 削峰等特性。

    Redis 提供了 發(fā)布訂閱阻塞隊(duì)列 的功能,雖然和專業(yè)的消息隊(duì)列比還不夠足夠強(qiáng)大,但是對(duì)于一般的消息隊(duì)列基本可以滿足。

  • 1.3.2 Redis不可以做什么

    ? 實(shí)際上和任何一門技術(shù)一樣,每個(gè)技術(shù)都有自己的 應(yīng)用場景邊界,也就是說 Redis不是 萬金油,有很多適合它解決的問題,但是也有很多不適合它解決的問題。

    我們可以站在 數(shù)據(jù)規(guī)模數(shù)據(jù)冷熱角度來進(jìn)行分析。

    站在 數(shù)據(jù)規(guī)模 的角度看,數(shù)據(jù) 可以分為 大規(guī)模數(shù)據(jù)小規(guī)模數(shù)據(jù)

    我們知道 Redis數(shù)據(jù)存放在 內(nèi)存 中的,雖然現(xiàn)在 內(nèi)存 已經(jīng)足夠 便宜,但是如果 數(shù)據(jù)量 非常大,例如每天有幾億的用戶行為數(shù)據(jù),使用 Redis存儲(chǔ)的話,基本上是個(gè) 無底洞經(jīng)濟(jì)成本 非常的

    站在 數(shù)據(jù)冷熱 的角度看,數(shù)據(jù) 分為 熱數(shù)據(jù)冷數(shù)據(jù)熱數(shù)據(jù) 通常是指需要 頻繁操作的數(shù)據(jù),反之為冷數(shù)據(jù),

    例如對(duì)于 視頻網(wǎng)站 來說,視頻基本信息 基本上在各個(gè)業(yè)務(wù)線都是 經(jīng)常要操作 的數(shù)據(jù),而 用戶的觀看記錄 不一定是經(jīng)常需要訪問的數(shù)據(jù),

    這里暫且不討論兩者數(shù)據(jù)規(guī)模的差異,

    單純站在 數(shù)據(jù)冷熱的角度 上看,視頻信息 屬于 熱數(shù)據(jù)用戶觀看記錄 屬于冷數(shù)據(jù)

    如果將這些 冷數(shù)據(jù) 放在 Redis 上,基本上是 對(duì) 內(nèi)存的一種浪費(fèi)

    但是對(duì)于一些 熱數(shù)據(jù) 可以放在 Redis加速讀寫,也可以 減輕后端存儲(chǔ)的負(fù)載,可以說是事半功倍。

    所以,Redis不是 萬金油,相信隨著我們對(duì) Redis 的逐步學(xué)習(xí),能夠清楚 Redis 真正的使用場景。

    1.4 用好Redis的建議

  • 切勿當(dāng)做 黑盒 使用,開發(fā)與運(yùn)維同樣重要

    很多使用 Redis 的開發(fā)者認(rèn)為只要會(huì)用 API 開發(fā)相應(yīng)的功能就可以,更有甚者認(rèn)為 Redis 就是 get、set、del,不需要知道 Redis 的 原理。

    但是在我們實(shí)際運(yùn)維和使用 Redis 的過程中發(fā)現(xiàn),很多線上的故障和問題都是由于完全把 Redis 當(dāng)做 黑盒 造成的,

    如果不了解 Redis的單線程模型,有些開發(fā)者會(huì)在 上千萬個(gè)鍵的Redis上 執(zhí)行 keys * 操作,

    如果不了解 持久化的相關(guān)原理,會(huì)在一個(gè) 寫操作量很大的Redis上 配置自動(dòng)保存RDB

    而且在很多公司內(nèi)只有專職的 關(guān)系型數(shù)據(jù)庫DBA,并沒有 NoSQL 的相關(guān)運(yùn)維人員,也就是說開發(fā)者很有可能會(huì)自己運(yùn)維 Redis,對(duì)于 Redis 的開發(fā)者來說既是好事又是壞事。

    站在好的方面看,開發(fā)人員可以通過 運(yùn)維 Redis 真正了解 Redis 的一些原理,不單純停留在開發(fā)上。

    站在壞的方面看,Redis 的開發(fā)人員不僅要支持開發(fā),還要承擔(dān)運(yùn)維的責(zé)任,而且由于運(yùn)維經(jīng)驗(yàn)不足可能會(huì)造成線上故障。

    但是從實(shí)際經(jīng)驗(yàn)來看,運(yùn)維足夠規(guī)模的 Redis 會(huì)對(duì)用好 Redis 更加有幫助。

  • 閱讀源碼

    我們在前面提到過,Redis開源項(xiàng)目,由于作者對(duì) Redis代碼 的極致追求,Redis的代碼量 相對(duì)于許多 NoSQL數(shù)據(jù)庫 來說是非常 的,也就意味著作為普通的開發(fā)和運(yùn)維人員也是可以 “吃透”的。

    通過閱讀優(yōu)秀的源碼,不僅能夠加深我們對(duì) Redis 的理解,而且還能提高自身的需求,例如新浪微博在 Redis的早期版本 上做了很多的 定制化 來滿足自身的需求,豌豆莢也開源基于 Proxy 的 Redis 分布式 實(shí)現(xiàn) Codis。

  • 1.5 正確安裝并啟動(dòng)Redis

    通常來說,學(xué)習(xí)一門技術(shù)最好的方法就是實(shí)戰(zhàn),所以在學(xué)習(xí) Redis 這樣一個(gè)實(shí)戰(zhàn)中產(chǎn)生的技術(shù)時(shí),首先把它安裝部署起來,值得慶幸的是,相比于很多軟件和工具部署步驟繁雜,Redis的安裝 不得不說是非常 簡單,本節(jié)我們將學(xué)習(xí)如何 安裝Redis。

    注意

    在寫本書時(shí),Redis 4.0 已經(jīng)發(fā)布 RC版,但是大部分公司還都在使用 3.0 或更早的版本(2.6 或 2.8),本書所講的內(nèi)容基于 Redis3.0。

    1.5.1 安裝Redis
  • 在Linux上安裝Redis

    Redis 能夠 兼容 絕大部分的 POSIX 系統(tǒng),例如 Linux、OS X、OpenBSDNetBSDFreeBSD

    其中比較典型的是 Linux 操作系統(tǒng)(例如 CentOS、Redhat、Ubuntu、Debian、OS X等)。

    在 Linux 安裝軟件通常有 兩種方法,

    第一種是通過 各個(gè)操作系統(tǒng)的軟件管理軟件 進(jìn)行安裝,例如 CentOSyum 管理工具,Ubuntuapt。

    但是由于 Redis 的更新速度相對(duì)較快,而這些管理工具不一定能更新到最新的版本,同時(shí)前面提到 Redis的安裝 本身不是很復(fù)雜,所以一般推薦使用第二種方式:源碼的方式 進(jìn)行安裝,整個(gè)安裝只需一下 六步 即可完成,以 3.0.7 版本 為例:

    wget http://download.redis.io/release/redis-3.0.7.tar.gztar xzf redis-3.0.7.tar.gzln -s redis-3.0.7 rediscd redismakemake install
  • 下載 Redis 指定版本的 源碼壓縮包 到當(dāng)前目錄。

  • 解壓縮 Redis 源碼壓縮包。

  • 建立一個(gè) redis 目錄 的軟連接,指向 redis-3.0.7

  • 進(jìn)入 redis 目錄

  • 編譯(編譯之前確保操作系統(tǒng)已經(jīng)安裝 gcc)

  • 安裝

  • 這里有 兩點(diǎn) 需要注意:

    第一,第3步 中建立了一個(gè) redis 目錄的 軟鏈接,這樣做是為了 不把 redis 目錄 固定在 指定版本上,有利于 Redis 未來版本升級(jí),算是 安裝軟件 的一種好習(xí)慣。

    第二,第6步 中的 安裝 是將 Redis 的相關(guān)運(yùn)行文件放到 /usr/local/bin/ 下,這樣就可以在任意目錄下執(zhí)行 Redis 的命令。

    例如安裝后,可以在任何目錄執(zhí)行 redis-cli -v 查看 Redis 版本。

    redis-cli -v redis-cli 3.0.7

    注意

    第12章將介紹更多 Linux配置優(yōu)化 技巧,為 Redis 的良好運(yùn)行保駕護(hù)航。

  • 在Windows上安裝Redis
  • Redis 的官方并不支持微軟的Windows操作系統(tǒng),但是 Redis 作為一款優(yōu)秀的開源技術(shù)吸引到了微軟公司的注意,微軟公司的開源技術(shù)組在 GitHub 上維護(hù)一個(gè) Redis 的分支:https://github.com/MSOpenTech/redis。

    那為什么 Redis 的作者沒有開發(fā)和維護(hù)對(duì)Windows用戶的 Redis 版本呢?

    這里可以簡單分析一下:

    首先 Redis 的許多 特性 都是和 操作系統(tǒng) 相關(guān)的,Windows操作系統(tǒng) 和 Linux操作系統(tǒng) 有很大的區(qū)別,所以會(huì) 增加維護(hù)成本,而且更重要的是大部分公司都在使用 Linux 操作系統(tǒng),而 Redis 在Linux 操作系統(tǒng)上的表現(xiàn)已經(jīng)得到了實(shí)踐的驗(yàn)證。

    對(duì)于使用 Windows操作系統(tǒng) 的讀者,可以通過安裝虛擬機(jī)來體驗(yàn) Redis 的諸多特性。

    注意

    對(duì) Windows版本 的 Redis 感興趣的讀者,可以嘗試安裝和部署 Windows版本的Redis,但是本書中的知識(shí)和例子不能確保在Windows下能夠運(yùn)行。

    1.5.2 配置、啟動(dòng)、操作、關(guān)閉 Redis

    Redis 安裝之后,src 和 /usr/local/bin 目錄下多了幾個(gè)以 redis 開頭 可執(zhí)行文件,我們稱之為 Redis Shell,這些 可執(zhí)行文件 可以做很多事情,例如可以啟動(dòng)和停止 Redis、可以 檢測和修復(fù) Redis 的持久化文件,還可以 檢測 Redis 的性能

    表 1-2 中分別列出這些可執(zhí)行文件的說明。

    表 1-2 Redis 可執(zhí)行文件說明

    可執(zhí)行文件作用
    redis-server啟動(dòng)Redis
    redis-cliRedis命令行客戶端
    redis-benchmarkRedis基準(zhǔn)測試工具
    redis-check-aofRedis AOF持久化文件檢測和修復(fù)工具
    redis-check-dumpRedis RDB持久化文件檢測和修復(fù)工具
    redis-sentinel啟動(dòng)Redis Sentinel

    Redis 持久化Redis Sentinel 分別在第5章和第9章才會(huì)涉及,Redis基準(zhǔn)測試 將在第3章介紹,所以本節(jié)只對(duì) redis-server、redis-cli 進(jìn)行介紹。

  • 啟動(dòng) Redis

    三種方法 啟動(dòng)Redis默認(rèn)配置、運(yùn)行配置、配置文件啟動(dòng)。

    (1)默認(rèn)配置

    這種方法會(huì)使用 Redis的默認(rèn)配置 來啟動(dòng),下面就是 redis-server 執(zhí)行后輸出的相關(guān)日志。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bRAOIMuK-1621301836858)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210514142427083.png)]

    可以看到直接使用 redis-server 啟動(dòng) Redis 后,會(huì)打印一些日志,通過日志可以看到一些信息,上例中可以看到:

    • 當(dāng)前的 Redis版本 是 3.0.7。
    • Redis 的 默認(rèn)端口 是 6379。
    • Redis 建議要 使用配置文件 來啟動(dòng)。

    因?yàn)?直接啟動(dòng) 無法自定義配置,所以這種方式是不會(huì)在生產(chǎn)環(huán)境中使用的。

    (2)運(yùn)行啟動(dòng)

    redis-server 加上 要修改配置名和值(可以是多對(duì)),沒有設(shè)置的配置將使用默認(rèn)配置:

    # redis-server --configKey1 configValue1 --configKey2 configValue2

    例如,如果要用 6380 作為 端口 啟動(dòng) Redis,那么可以執(zhí)行:

    # redis-server --port 6380

    雖然 運(yùn)行配置 可以 自定義配置,但是如果 需要修改的配置較多 或者 希望將配置保存到文件中,不建議使用這種方式。

    (3)配置文件啟動(dòng)

    將 配置 寫到 指定文件 里,例如我們將配置寫到了 /opt/redis/redis.conf 中,那么只需要執(zhí)行如下命令即可啟動(dòng) Redis:

    # redis-server /opt/redis/redis.conf

    Redis 有 60 多個(gè)配置,這里只給出一些重要的配置(參見表 1-3),其他配置會(huì)隨著不斷深入學(xué)習(xí)進(jìn)行介紹,第14章會(huì)將所有的配置說明進(jìn)行匯總。

    表 1-3 Redis的基礎(chǔ)配置

    配置名配置說明
    port端口
    logfile日志文件
    dirRedis 工作目錄(存放持久化文件和日志文件)
    daemonize是否以守護(hù)進(jìn)程的方式啟動(dòng)Redis

    運(yùn)維提示

    Redis 目錄下都會(huì)有一個(gè) redis.conf 配置文件,里面就是 Redis的 默認(rèn)配置,通常來講我們會(huì)在 一臺(tái)機(jī)器上啟動(dòng)多個(gè)Redis,并且將 配置集中管理在指定目錄下,而且 配置不是完全手寫的,而是將 redis.conf 作為模板進(jìn)行修改

    顯然通過 配置文件啟動(dòng)的方式 提供了 更大的靈活性,所以大部分生產(chǎn)環(huán)境會(huì)使用這種方式啟動(dòng)Redis。

  • Redis 命令行客戶端

    現(xiàn)在我們已經(jīng)啟動(dòng)了 Redis 服務(wù),下面將介紹如何使用 redis-cli 連接,操作 Redis 服務(wù)。

    redis-cli 可以使用 兩種方式 連接Redis服務(wù)器。

    • 第一種是 交互式方式

      通過 redis-cli -h {host} -p {port}的方式連接到 Redis服務(wù),之后所有的操作都是通過 交互的方式 實(shí)現(xiàn),不需要再執(zhí)行 redis-cli 了,例如:

      redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world"
    • 第二種是 命令方式

      用 redis-cli -h ip {host} -p {port} {command}就可以直接得到 命令的返回結(jié)果,例如:

      redis-cli -h 127.0.0.1 -p 6379 get hello "world"

      這里有 兩點(diǎn) 要注意:

      1)如果沒有 -h 參數(shù),那么 默認(rèn)連接 127.0.0.1 ;

      ? 如果沒有 -p ,那么 默認(rèn) 6379 端口,也就是說如果 -h 和 -p 都沒寫就是連接 127.0.0.1:6379 這個(gè)Redis實(shí)例。

      2)redis-cli 是學(xué)習(xí) Redis 的重要工具,后面的很多章節(jié)都是用它作講解,同時(shí) redis-cli 還提供了很多有價(jià)值的參數(shù),可以幫助解決很多問題,有關(guān)于 redis-cli 的強(qiáng)大功能將在第3章進(jìn)行詳細(xì)介紹。

  • 停止 Redis 服務(wù)

    Redis 提供了 shutdown 命令來 停止Redis服務(wù),例如要停掉 127.0.0.1 上 6379 端口上的 Redis 服務(wù),可以執(zhí)行如下操作:

    redis-cli shutdown

    可以看到 Redis 的日志輸出如下:

    # User requested shutdown... # 客戶端發(fā)出的shutdown命令* Saving the final RDB snapshot before exiting. #保存 RDB 持久化文件(有關(guān) Redis持久化的特性在 1.2節(jié) 已經(jīng)進(jìn)行了簡單的介紹,RDB 是 Redis 的一種 持久化方式)* DB saved on disk # 將 RDB 文件保存在磁盤上# Redis is now ready to exit, bye bye... #關(guān)閉

    當(dāng)使用 redis-cli 再次連接該 Redis 服務(wù)時(shí),看到 Redis 已經(jīng) “失聯(lián)”。

    redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused

    這里有 三點(diǎn) 需要注意一下:

    1)Redis 關(guān)閉的過程斷開與客戶端的連接、持久化文件生成,是一種相對(duì)優(yōu)雅的關(guān)閉方式。

    2)除了可以通過 shutdown 命令 關(guān)閉Redis服務(wù) 以外,還可以通過 kill 進(jìn)程號(hào) 的方式關(guān)閉掉 Redis,但是不要 粗暴地 使用 kill -9 強(qiáng)制殺死 Redis服務(wù),不但 不會(huì)做 持久化操作,還會(huì) 造成 緩沖區(qū)等資源不能被優(yōu)雅關(guān)閉,極端情況會(huì)造成 AOF和復(fù)制丟失數(shù)據(jù) 的情況。

    3)shutdown 還有一個(gè)參數(shù),代表 是否在關(guān)閉Redis前,生成持久化文件

    redis-cli shutdown nosave|save
  • 1.6 Redis 重大版本

    Redis 借鑒了 Linux 操作系統(tǒng) 對(duì)于 版本號(hào)的命名規(guī)則版本號(hào) 第二位數(shù) 如果是 奇數(shù)則為 非穩(wěn)定版本(例如2.7、2.9、3.1),如果是 偶數(shù)則為 穩(wěn)定版本(例如2.6、2.8、3.0、3.2)。

    當(dāng)前 奇數(shù)版本 就是下一個(gè) 穩(wěn)定版本 的 開發(fā)版本,例如 2.9版本 是 3.0版本 的開發(fā)版本。

    所以我們在生產(chǎn)環(huán)境通常 選取 偶數(shù)版本 的Redis,如果對(duì)于某些新的特性想提前了解和使用,可以選擇最新的奇數(shù)版本。

    介紹一門技術(shù)的版本是很多技術(shù)圖書的必備內(nèi)容,通常讀者容易忽略,但隨著你對(duì)這門技術(shù)深入學(xué)習(xí)后,會(huì)覺得“倍感親切”,而且通常也會(huì)關(guān)注 新版本的特性,本小節(jié)將對(duì) Redis 發(fā)展過程中的一些重要版本及特性進(jìn)行說明。

  • Redis 2.6

    Redis 2.62012 年正式發(fā)布,經(jīng)歷了 17 個(gè)版本,到 2.6.17 版本,相比于 Redis 2.4,主要特性如下:

    1)服務(wù)端 支持 Lua 腳本。

    2)去掉 虛擬內(nèi)存 相關(guān)功能。

    3)放開對(duì) 客戶端連接數(shù) 的硬編碼限制。

    4)鍵 的 過期時(shí)間 支持毫秒。

    5)從結(jié)點(diǎn) 提供 只讀功能

    6)兩個(gè)新的 位圖命令:bitcount 和 bitop 。

    7)增強(qiáng)了 redis-benchmark 的功能:支持 定制化的壓測CSV輸出 等功能。

    8)基于 浮點(diǎn)數(shù) 自增命令:incrbyfloat 和 hincrbyfloat。

    9)redis-cli 可以使用 --eval 參數(shù)實(shí)現(xiàn) Lua腳本執(zhí)行

    10)shutdown 命令增強(qiáng)。

    11)info 可以按照 section 輸出,并且添加了一些統(tǒng)計(jì)項(xiàng)。

    12)重構(gòu)了大量的核心代碼,所有 集群相關(guān)的代碼 都去掉了,cluster 功能 將會(huì)是 3.0版本 最大的亮點(diǎn)

    13)sort 命令優(yōu)化。

  • Redis 2.8

    Redis 2.82013 年 11 月 22 日正式發(fā)布,經(jīng)歷了 24 個(gè)版本,到 2.8.24 版本,相比于 Redis 2.6,主要特性如下:

    1)添加部分 主從復(fù)制 的功能,在一定程度上 降低了 由于 網(wǎng)絡(luò)問題造成頻繁 全量復(fù)制生成RDB 對(duì)系統(tǒng)造成的壓力。

    2)嘗試性地支持 IPv6。

    3)可以通過 config set 命令設(shè)置 maxclients。

    4)可以用 bind 命令 綁定 多個(gè) IP地址

    5)Redis 設(shè)置 了明顯的 進(jìn)程名,方便使用 ps 命令 查看系統(tǒng)進(jìn)程。

    6)config rewrite 命令可以將 config set 持久化到 Redis配置文件 中。

    7)發(fā)布訂閱 添加了 pubsub 命令。

    8)Redis Sentinel 第二版,相比于 Redis 2.6 的 Redis Sentinel,此版本已經(jīng)變成 生產(chǎn)可用。

  • Redis 3.0

    Redis 3.02015 年 4 月 1 日 正式發(fā)布,截止到本書完成已經(jīng)到 3.0.7 版本,相比于 Redis 2.8 主要特性如下:

    Redis 3.0 最大的改動(dòng)就是添加 Redis的分布式 實(shí)現(xiàn) Redis Cluster,填補(bǔ)了 Redis 官方?jīng)]有 分布式 實(shí)現(xiàn)的空白。

    Redis Cluster 經(jīng)歷了 4 年才正式發(fā)布也是有原因的,具體可以參考 Redis Cluster 的開發(fā)日志(http://antirez.com/news/79)。

    1)Redis Cluster:Redis 的 官方 分布式實(shí)現(xiàn)

    2)全新的 embedded string 對(duì)象編碼結(jié)果,優(yōu)化 小對(duì)象 內(nèi)存訪問,在特定的工作負(fù)載下 速度大幅提升。

    3)lur 算法大幅提升。

    4)migrate 連接緩存,大幅提升 鍵遷移的速度。

    5)migrate 命令 兩個(gè)新的參數(shù) copyreplace。

    6)新的 client pause 命令,在指定時(shí)間內(nèi)停止處理客戶端請(qǐng)求。

    7)bitcount 命令性能提升。

    8)config set 設(shè)置 maxmemory 時(shí)候可以 設(shè)置不同的單位(之前只能是字節(jié)),例如 config set maxmemory 1gb。

    9)Redis 日志小做調(diào)整:日志中會(huì)反應(yīng) 當(dāng)前實(shí)例的角色master 或者 slave)。

    10)incr 命令 性能提升。

  • Redis 3.2

    Redis 3.22016 年 5 月 6 日正式發(fā)布,相比于 Redis 3.0 主要特征如下:

    1)添加 GEO 相關(guān)功能。

    2)SDS速度節(jié)省空間 上都做了優(yōu)化。

    3)支持用 upstart 或者 systemd 管理 Redis 進(jìn)程。

    4)新的 List 編碼類型:quicklist。

    5)從結(jié)點(diǎn) 讀取 過期數(shù)據(jù) 保證一致性。

    6)添加了 hstrlen 命令。

    7)增強(qiáng)了 debug 命令,支持了更多的參數(shù)。

    8)Lua 腳本功能增強(qiáng)。

    9)添加了 Lua Debugger。

    10)config set 支持更多的配置參數(shù)。

    11)優(yōu)化了 Redis 崩潰 后的相關(guān)報(bào)告。

    12)新的 RDB 格式,但是仍然兼容舊的 RDB。

    13)加速 RDB 的加載速度。

    14)spop 命令支持 個(gè)數(shù) 參數(shù)。

    15)cluster nodes 命令得到 加速。

    16)Jemalloc 更新到 4.0.3 版本。

  • Redis 4.0

    可能出乎很多人的意料,Redis 3.2 之后的版本是 4.0,而不是 3.4、3.6、3.8。

    一般這種 重大版本號(hào) 的 升級(jí) 也意味著 軟件或者工具本身發(fā)生了重大變革,直到本書截稿前,Redis 發(fā)布了 4.0-RC2,下面列出 Redis 4.0 的新特性:

    1)提供了 模塊系統(tǒng)方便第三方開發(fā)者 拓展 Redis 的功能,更多模塊詳見:http://redismodules.com。

    2)PSYNC 2.0優(yōu)化了之前版本中,主從節(jié)點(diǎn)切換 必然引起 全量復(fù)制 的問題

    3)提供了新的 緩存剔除 算法LFULast Frequently Used),并對(duì)已有算法進(jìn)行了優(yōu)化。

    4)提供了 非阻塞 del 和 flushall/flushdb 功能,有效解決 刪除 bigkey 可能造成的 Redis 阻塞

    5)提供了 RDB-AOF 混合持久式 格式,充分利用了 AOF 和 RDB 各自優(yōu)勢。

    6)提供 memory 命令,實(shí)現(xiàn) 對(duì)內(nèi)存更為全面的監(jiān)控統(tǒng)計(jì)。

    7)提供了 交互數(shù)據(jù)庫 功能,實(shí)現(xiàn) Redis 內(nèi)部數(shù)據(jù)庫之間的 數(shù)據(jù)置換

    8)Redis Cluster 兼容 NATDocker。

  • 1.7 本章重點(diǎn)回顧

    1)Redis8個(gè)特性速度快、基于鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)服務(wù)器功能豐富簡單穩(wěn)定客戶端語言多、持久化、主從復(fù)制、支持高可用和分布式。

    2)Redis不是 萬金油,有些場景不適合 Redis 進(jìn)行開發(fā)。

    3)開發(fā)運(yùn)維結(jié)合 以及 閱讀源碼 是用好 Redis 的重要方法。

    4)生產(chǎn)環(huán)境 中使用 配置文件 啟動(dòng) Redis

    5)生產(chǎn)環(huán)境 選取 穩(wěn)定版本的 Redis

    6)Redis 3.0 是重要的里程碑,發(fā)布了 Redis官方的 分布式實(shí)現(xiàn) Redis Cluster。

    第2章 API的理解和使用

    ? Redis 提供了 5種 數(shù)據(jù)結(jié)構(gòu),理解每種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn) 對(duì)于 Redis 開發(fā)運(yùn)維 非常重要,同時(shí)掌握 Redis的單線程命令處理機(jī)制,會(huì)使 數(shù)據(jù)結(jié)構(gòu)和命令的選擇事半功倍,本章內(nèi)容如下:

    • 預(yù)備知識(shí):幾個(gè)簡單的全局命令數(shù)據(jù)結(jié)構(gòu)內(nèi)部編碼單線程命令處理機(jī)制分析。
    • 5種 數(shù)據(jù)結(jié)構(gòu)特點(diǎn),命令使用、應(yīng)用場景
    • 鍵管理、遍歷鍵、數(shù)據(jù)庫管理。

    2.1 預(yù)備

    ? 在正式介紹 5種數(shù)據(jù)結(jié)構(gòu) 之前,了解一下 Redis 的一些 全局命令、數(shù)據(jù)結(jié)構(gòu)內(nèi)部編碼、單線程命令處理機(jī)制 是十分有必要的,它們能為后面內(nèi)容的學(xué)習(xí)打下一個(gè)好的基礎(chǔ),主要體現(xiàn)在兩個(gè)方面:

    ? 第一、Redis 的命令有上百個(gè),如果純靠死記硬背比較困難,但是如果理解 Redis 的一些機(jī)制,會(huì)發(fā)現(xiàn)這些命令有很強(qiáng)的通用性。

    ? 第二、Redis不是萬金油,有些數(shù)據(jù)結(jié)構(gòu) 和 命令 必須在特定場景下使用,一旦使用不當(dāng) 可能對(duì) Redis本身 或者 應(yīng)用本身造成致命傷害。

    2.1.1 全局命令

    ? Redis5種數(shù)據(jù)結(jié)構(gòu),它們是 鍵值對(duì)中的 值,對(duì)于 來說有一些 通用的命令。

  • 查看所有鍵

    keys *

    下面插入了 3對(duì) 字符串類型的鍵值對(duì)

    127.0.0.1:6379> set hello world OK 127.0.0.1:6379> set java jedis OK 127.0.0.1:6379> set python redis-py OK

    keys * 命令會(huì) 將所有的鍵輸出

    127.0.0.1:6379> keys * 1) "python" 2) "java" 3) "hello"
  • 鍵總數(shù)

    dbsize

    下面插入一個(gè) 列表類型的鍵值對(duì)(值 是多個(gè)元素組成)

    127.0.0.1:6379> rpush mylist a b c d e f g (integer) 7

    dbsize 命令會(huì)返回 當(dāng)前數(shù)據(jù)庫中鍵的總數(shù)。

    例如 當(dāng)前數(shù)據(jù)庫有 4 個(gè)鍵,分別是 hello、java、python、mylist,所以 dbsize 的結(jié)果是 4:

    127.0.0.1:6379> dbsize (integer) 4

    dbsize 命令在 計(jì)算鍵總數(shù) 時(shí) 不會(huì)遍歷所有鍵,而是 直接獲取 Redis 內(nèi)置的 鍵總數(shù) 變量,所以 dbsize 命令的 時(shí)間復(fù)雜度O(1)

    而 keys 命令會(huì) 遍歷所有鍵,所以它的 時(shí)間復(fù)雜度O(n)當(dāng) Redis 保存了 大量鍵時(shí),線上環(huán)境 禁止使用。

  • 檢查鍵是否存在

    exists key

    如果 鍵存在 則返回1不存在則返回0。

    127.0.0.1:6379> exists java (integer) 1 127.0.0.1:6379> exists not_exist_key (integer) 0
  • 刪除鍵

    del key [key ...]

    del 是一個(gè)通用命令無論值是什么數(shù)據(jù)結(jié)構(gòu)類型,del 命令 都可以將其刪除,例如下面將 字符串類型的鍵 java 和 列表類型的鍵 mylist 分別刪除:

    127.0.0.1:6379> del java (integer) 1 127.0.0.1:6379> exists java (integer) 0 127.0.0.1:6379> del mylist (integer) 1 127.0.0.1:6379> exists mylist (integer) 0

    返回結(jié)果為 成功刪除鍵的個(gè)數(shù)假設(shè)刪除一個(gè)不存在的鍵,就會(huì)返回0

    127.0.0.1:6379> del not_exist_key (integer) 0

    同時(shí) del 命令可以支持 刪除多個(gè)鍵

    127.0.0.1:6379> set a 1 OK 127.0.0.1:6379> set b 2 OK 127.0.0.1:6379> set c 3 OK 127.0.0.1:6379> del a b c (integer) 3
  • 鍵過期

    expire key seconds

    Redis 支持對(duì) 鍵 添加過期時(shí)間當(dāng)超過 過期時(shí)間 后,會(huì)自動(dòng)刪除 鍵,例如為 鍵 hello 設(shè)置了 10秒過期時(shí)間:

    127.0.0.1:6379> set hello world OK 127.0.0.1:6379> expire hello 10 (integer) 1

    ttl 命令會(huì)返回 鍵的剩余過期時(shí)間,它有 3種返回值

    • 大于等于0 的整數(shù)鍵剩余的過期時(shí)間
    • -1鍵沒設(shè)置過期時(shí)間。
    • -2鍵不存在。

    可以通過 ttl 命令觀察鍵 hello 的剩余過期時(shí)間:

    # 還剩7秒 127.0.0.1:6379> ttl hello (integer) 7 ... # 還剩1秒 127.0.0.1:6379> ttl hello (integer) 1 # 返回結(jié)果為 -2 ,說明 鍵hello 已經(jīng)被刪除 127.0.0.1:6379> ttl hello (integer) -2 127.0.0.1:6379> get hello (nil)

    有關(guān) 鍵過期 更為詳細(xì)的使用以及原理會(huì)在 2.7 節(jié)介紹。

  • 鍵的數(shù)據(jù)結(jié)構(gòu)類型
  • type key

    例如鍵 hello 是字符串類型,返回結(jié)果為 string。

    鍵 mylist 是列表類型,返回結(jié)果為 list。

    127.0.0.1:6379> set a b OK 127.0.0.1:6379> type a string 127.0.0.1:6379> rpush mylist a b c d e f g (integer) 7 127.0.0.1:6379> type mylist list

    如果 鍵不存在,則返回 none :

    127.0.0.1:6379> type not_exist_key none

    本小節(jié)只是拋磚引玉,給出幾個(gè)通用的命令,為 5種數(shù)據(jù)結(jié)構(gòu)的使用 做一個(gè)熱身,2.7節(jié) 將對(duì) 鍵管理 做一個(gè)更為詳細(xì)的介紹。

    2.1.2 數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

    type 命令實(shí)際返回的就是 當(dāng)前鍵的數(shù)據(jù)結(jié)構(gòu)類型,它們分別是:string字符串)、hash哈希)、list列表)、set集合)、zset有序集合),但這些只是 Redis 對(duì)外的數(shù)據(jù)結(jié)構(gòu),如圖 2-1 所示。

    實(shí)際上 每種 數(shù)據(jù)結(jié)構(gòu) 都有自己 底層的內(nèi)部編碼 實(shí)現(xiàn),而且是 多種實(shí)現(xiàn),這樣 Redis 會(huì)在 合適的場景選擇合適的內(nèi)部編碼,如圖 2-2 所示。

    可以看到 每種數(shù)據(jù)結(jié)構(gòu) 都有 兩種以上的內(nèi)部編碼實(shí)現(xiàn),例如 list 數(shù)據(jù)結(jié)構(gòu)包含了 linkedlistziplist 兩種內(nèi)部編碼。同時(shí) 有些內(nèi)部編碼,例如 ziplist可以作為 多種外部數(shù)據(jù)結(jié)構(gòu) 的 內(nèi)部實(shí)現(xiàn),可以通過 object encoding 命令 查詢內(nèi)部編碼

    127.0.0.1:6379> object encoding hello "embstr" 127.0.0.1:6379> object encoding mylist "ziplist"

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-BB8LhGU3-1621301836862)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517120419269.png)]

    可以看到 鍵hello 對(duì)應(yīng)值的內(nèi)部編碼是 embstr,鍵 mylist 對(duì)應(yīng)值的內(nèi)部編碼是 ziplist。

    Redis 這樣設(shè)計(jì)有兩個(gè)好處

    第一,可以改進(jìn)內(nèi)部編碼,而對(duì)外的數(shù)據(jù)結(jié)構(gòu)和命令沒有影響,這樣一旦開發(fā)出更優(yōu)秀的內(nèi)部編碼,無需改動(dòng)外部數(shù)據(jù)結(jié)構(gòu)和命令,例如 Redis 3.2 提供了 quicklist,結(jié)合了 ziplistlinkedlist 兩者的優(yōu)勢,為 列表類型 提供了 一種更為優(yōu)秀的內(nèi)部編碼實(shí)現(xiàn),而對(duì) 外部用戶 來說基本感知不到。

    第二多種內(nèi)部編碼實(shí)現(xiàn) 可以在 不同場景下發(fā)揮各自的優(yōu)勢,例如 ziplist 比較節(jié)省內(nèi)存,但是在 列表元素 比較多 的情況下,性能會(huì)有所下降,這時(shí)候 Redis 會(huì)根據(jù) 配置選項(xiàng)列表類型的內(nèi)部實(shí)現(xiàn) 轉(zhuǎn)換為 linkedlist。

    數(shù)據(jù)結(jié)構(gòu)stringhashlistsetzset
    內(nèi)部編碼rawhashtablelinkedlisthashtableskiplist
    intziplistziplistintsetziplist
    embstr
    2.1.3 單線程架構(gòu)

    Redis 使用了 單線程架構(gòu)I/O多路復(fù)用模型 來實(shí)現(xiàn) 高性能內(nèi)存數(shù)據(jù)庫服務(wù),本節(jié)首先通過 多個(gè)客戶端命令調(diào)用 的例子說明 Redis 單線程命令處理機(jī)制,接著分析 Redis 單線程模型 為什么性能如此之,最終給出為什么 理解單線程模型 是 使用和運(yùn)維 Redis 的關(guān)鍵。

  • 引出單線程模型

    現(xiàn)在開啟了 三個(gè) redis-cli 客戶端 同時(shí)執(zhí)行命令、

    客戶端1 設(shè)置一個(gè) 字符串鍵值對(duì):

    127.0.0.1:6379> set hello world

    客戶端2 對(duì) counter 做自增操作:

    127.0.0.1:6379> incr counter

    客戶端3 對(duì) counter 做自增操作:

    127.0.0.1:6379> incr counter

    Redis 客戶端 與 服務(wù)端 的模型可以簡化成 圖2-3,每次 客戶端調(diào)用都經(jīng)歷了 發(fā)送命令、執(zhí)行命令返回結(jié)果 三個(gè)過程。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-oAqoELf9-1621301836863)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517124231618.png)]

    其中 第2步 是重點(diǎn)要討論的,因?yàn)?Redis 是 單線程 來處理命令的,所以 一條命令從客戶端 到達(dá) 服務(wù)端 不會(huì)立刻被執(zhí)行所有命令都會(huì)進(jìn)入一個(gè) 隊(duì)列 中然后 逐個(gè)被執(zhí)行。

    所以上面 3個(gè)客戶端 命令的執(zhí)行順序是不確定的(如圖2-4所示),但是可以確定 不會(huì)有兩條命令被同時(shí)執(zhí)行(如圖2-5所示),所以 incr 命令無論怎么執(zhí)行最終結(jié)果都是 2,不會(huì)產(chǎn)生并發(fā)問題,這就是 Redis 單線程的基本模型。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-4uukxun5-1621301836864)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517124353808.png)]

    但是像 發(fā)送命令、返回結(jié)果、命令排隊(duì) 肯定不像描述的這么簡單,Redis 使用了 I/O多路復(fù)用技術(shù) 來解決 I/O 的問題,下一節(jié)將進(jìn)行介紹。

  • 為什么單線程還能這么快

    通常來講,單線程處理能力 要比 多線程 差

    例如有 10 000 斤貨物,每輛車的運(yùn)載能力是每次 200斤,那么要50次才能完成,

    但是如果有 50輛車,只要安排合理,只需一次就可以完成任務(wù)。

    那么為什么 Redis 使用 單線程模型 會(huì)達(dá)到每秒萬級(jí)別的處理能力 呢?

    可以將其歸結(jié)為三點(diǎn)

    第一純內(nèi)存訪問,Redis 將 所有數(shù)據(jù)放在 內(nèi)存 中內(nèi)存 的 響應(yīng)時(shí)長 大約為 100納秒,這是 Redis 達(dá)到每秒 萬級(jí)別 訪問的重要基礎(chǔ)。

    第二非阻塞I/O,Redis 使用 epoll 作為 I/O 多路復(fù)用技術(shù) 的 實(shí)現(xiàn),再加上 Redis 自身的 事件處理模型epoll 中的 連接、讀寫、關(guān)閉 都轉(zhuǎn)換為 事件不在 網(wǎng)絡(luò) I/O 上浪費(fèi)過多的時(shí)間,如圖 2-6 所示:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-8LbJKfu9-1621301836865)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517124935714.png)]

    第三單線程 避免了 線程切換 和 競態(tài)產(chǎn)生 的消耗。

    既然采用 單線程 就能達(dá)到如此高的性能,那么也不失為一種不錯(cuò)的選擇,

    因此單線程能帶來幾個(gè)好處

    ? 第一單線程 可以 簡化 數(shù)據(jù)結(jié)構(gòu)和算法 的實(shí)現(xiàn)。如果對(duì)高級(jí)編程語言熟悉的讀者應(yīng)該了解 并發(fā)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) 不但困難 而且 開發(fā)測試比較麻煩。

    ? 第二單線程 避免了 線程切換 和 競態(tài)產(chǎn)生 的消耗,對(duì)于 服務(wù)端開發(fā) 來說,鎖 和 線程切換 通常是 性能殺手

    但是 單線程 會(huì)有一個(gè)問題:對(duì)于 每個(gè)命令的執(zhí)行時(shí)間 是有要求的。如果某個(gè)命令 執(zhí)行過長,會(huì)造成 其他命令的 阻塞,對(duì)于 Redis 這種 高性能的服務(wù) 來說是致命的,所以 Redis 是面向 快速執(zhí)行 場景的數(shù)據(jù)庫。

    單線程機(jī)制 很容易被初學(xué)者忽視,但筆者認(rèn)為 Redis 單線程機(jī)制 是 開發(fā)和運(yùn)維人員 使用和理解 Redis 的核心之一,隨著后面的學(xué)習(xí),相信讀者會(huì)逐步理解。

  • 2.2 字符串

    字符串類型 是 Redis 最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。

    首先 都是 字符串類型,而且 其他幾種數(shù)據(jù)結(jié)構(gòu) 都是在 字符串類型 基礎(chǔ)上構(gòu)建的,所以 字符串類型 能為 其他四種數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí) 奠定基礎(chǔ)。

    如圖 2-7 所示,字符串類型的值 實(shí)際可以是 字符串(簡單的字符串、復(fù)雜的字符串(例如JSON、XML))、數(shù)字(整數(shù)、浮點(diǎn)數(shù)),甚至是二進(jìn)制(圖片、音頻、視頻),但是 值最大 不能超過 512MB。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-zYS8Dm8l-1621301836866)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517130333277.png)]

    2.2.1 命令

    ? 字符串類型 的 命令 比較多,本小節(jié) 將按照 常用和不常用 兩個(gè)維度 進(jìn)行說明,但是這里 常用和不常用 是相對(duì)的,希望讀者盡可能都去了解和掌握。

  • 常用命令

    (1)設(shè)置值

    set key value [ex seconds] [px milliseconds] [nx|xx]

    下面操作 設(shè)置鍵為hello,值為world的鍵值對(duì),返回結(jié)果為 OK 代表設(shè)置成功:

    127.0.0.1:6379> set hello world OK

    set 命令 有幾個(gè)選項(xiàng):

    • ex seconds為 鍵 設(shè)置 秒級(jí) 過期時(shí)間
    • px milliseconds為 鍵 設(shè)置 毫秒級(jí) 過期時(shí)間。
    • nx鍵 必須不存在,才可以設(shè)置成功,用于添加
    • xx與 nx 相反,鍵必須存在,才可以設(shè)置成功,用于更新。

    除了 set 選項(xiàng),Redis 還提供了 setex 和 setnx 兩個(gè)命令:

    setex key seconds value setnx key value

    它們的作用和 ex 和 nx 選項(xiàng)是一樣的。

    下面的例子說明了 set、setnx、set xx 的區(qū)別。

    當(dāng)前 鍵 hello 不存在:

    127.0.0.1:6379> exists hello (integer) 0

    設(shè)置 鍵為hello, 值為world 的鍵值對(duì):

    127.0.0.1:6379> set hello world OK

    因?yàn)殒I hello 已存在,所以 setnx 失敗,返回結(jié)果為 0

    127.0.0.1:6379> setnx hello world (integer) 0

    因?yàn)殒I hello 已存在,所以 set xx 成功,返回結(jié)果為 OK。

    127.0.0.1:6379> set hello jedis xx OK

    setnx 和 setxx 在實(shí)際使用中有什么應(yīng)用場景嗎?

    以 setnx 命令為例子,由于 Redis 的 單線程命令處理機(jī)制,如果有 多個(gè)客戶端 同時(shí)執(zhí)行 setnx key value,根據(jù) setnx 的特性 只有一個(gè)客戶端能設(shè)置成功,setnx 可以作為 分布式鎖 的一種實(shí)現(xiàn)方案,Redis 官方給出了使用 setnx 實(shí)現(xiàn)分布式鎖 的方法:http://redis.io/topics/distlock。

    (2)獲取值

    get key

    下面操作 獲取鍵hello的值:

    127.0.0.1:6379> get hello "world"

    如果 要獲取的鍵 不存在,則返回 nil(空)

    127.0.0.1:6379> get not_exist_key (nil)

    (3)批量設(shè)置值

    mset key value [key value ...]

    下面操作通過 mset 命令一次性設(shè)置 4個(gè)鍵值對(duì):

    127.0.0.1:6379> mset a 1 b 2 c 3 d 4 OK

    (4)批量獲取值

    mget key [key ...]

    下面操作批量獲取了鍵 a、b、c、d的值:

    127.0.0.1:6379> mget a b c d 1) "1" 2) "2" 3) "3" 4) "4"

    如果有些 鍵 不存在,那么它的值 為 nil(空),結(jié)果是按照 傳入鍵 的順序 返回

    127.0.0.1:6379> mget a b c f 1) "1" 2) "2" 3) "3" 4) (nil)

    批量操作 命令 可以 有效提高開發(fā)效率,假如沒有 mget 這樣的命令,要執(zhí)行 n 次 get 命令 需要按照?qǐng)D 2-8 的方式來執(zhí)行,具體耗時(shí)如下:

    n 次 get 時(shí)間 = n 次網(wǎng)絡(luò)時(shí)間 + n 次命令時(shí)間

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-tpk8mJqK-1621301836867)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517133127643.png)]

    使用 mget 命令后,要執(zhí)行 n 次 get 命令操作 只需要按照?qǐng)D 2-9 的方式來完成,具體耗時(shí)如下:

    n 次 get 時(shí)間 = 1 次網(wǎng)絡(luò)時(shí)間 + n 次命令時(shí)間

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-KrQD9scU-1621301836868)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517133254794.png)]

    Redis 可以支撐 每秒數(shù)萬 的讀寫操作,但是這指的是 Redis 服務(wù)端的處理能力

    對(duì)于客戶端來說,一次命令除了 命令時(shí)間 還有 網(wǎng)絡(luò)時(shí)間,假設(shè) 網(wǎng)絡(luò)時(shí)間為 1 毫秒,命令時(shí)間為 0.1 毫秒(按照每秒處理 1 萬條命令算),那么執(zhí)行 1000次 get 命令 和 1次 mget 命令的區(qū)別 如表 2-1,因?yàn)?Redis 的處理能力已經(jīng)足夠高,對(duì)于開發(fā)人員來說,網(wǎng)絡(luò) 可能會(huì)成為 性能 的瓶頸。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-7z4vsnzX-1621301836869)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517133726771.png)]

    操作時(shí)間
    1 000 次 get1 000 × 1 + 1 000 × 0.1 = 1 100 毫秒 = 1.1 秒
    1 次 mget(組裝了 1 000個(gè)鍵值對(duì))1 × 1 + 1 000 × 0.1 = 101 毫秒 = 0.101 秒

    學(xué)會(huì)使用 批量操作,有助于 提高業(yè)務(wù)處理效率,但是要注意的是 每次批量操作 所發(fā)送的命令數(shù) 不是無節(jié)制的,如果數(shù)量過多 可能造成 Redis 阻塞 或者 網(wǎng)絡(luò)擁塞

    (5)計(jì)數(shù)

    incr key

    incr 命令用于對(duì)值 做自增操作,返回結(jié)果分為三種情況:

    • 值不是整數(shù),返回錯(cuò)誤
    • 值是整數(shù),返回自增后的結(jié)果。
    • 鍵不存在,按照值為0 自增,返回結(jié)果為1

    例如對(duì)一個(gè) 不存在的鍵 執(zhí)行 incr 操作后,返回結(jié)果是1:

    127.0.0.1:6379> exists key (integer) 0 127.0.0.1:6379> incr key (integer) 1

    再次對(duì)鍵 執(zhí)行 incr 命令,返回結(jié)果是 2:

    127.0.0.1:6379> incr key (integer) 2

    如果值 不是整數(shù),那么會(huì) 返回錯(cuò)誤。

    127.0.0.1:6379> set hello world OK 127.0.0.1:6379> incr hello (error) ERR value is not an integer or out of range

    除了 incr 命令,Redis 提供了 decr(自減)、incrby(自增指定數(shù)字)、decrby(自減指定數(shù)字)、incrbyfloat(自增浮點(diǎn)數(shù)):

    decr key incrby key increment decrby key decrement incrbyfloat key increment

    很多 存儲(chǔ)系統(tǒng)和編程語言內(nèi)部 使用 CAS機(jī)制實(shí)現(xiàn)計(jì)數(shù)功能會(huì)有一定的CPU開銷,但在 Redis 中完全不存在這個(gè)問題,因?yàn)?Redis 是單線程架構(gòu)任何命令到了 Redis 服務(wù)端 都要 順序執(zhí)行。

  • 不常用命令

    (1)追加值

    append key value

    append 可以向 字符串尾部 追加值,例如:

    127.0.0.1:6379> get key "redis" 127.0.0.1:6379> append key world (integer) 10 127.0.0.1:6379> get key "redisworld"

    (2)字符串長度

    strlen key

    例如,當(dāng)前值為 redisworld,所以返回值為10:

    127.0.0.1:6379> get key "redisworld" 127.0.0.1:6379> strlen key (integer) 10

    下面操作返回結(jié)果為 6,因?yàn)?每個(gè)中文占用 3個(gè)字節(jié):

    127.0.0.1:6379> set hello "世界" OK 127.0.0.1:6379> strlen hello (integer) 6

    (3)設(shè)置并返回原值

    getset key value

    getset 和 set 一樣會(huì) 設(shè)置值,但是不同的是,它同時(shí)會(huì) 返回鍵原來的值,例如:

    127.0.0.1:6379> getset hello world (nil) 127.0.0.1:6379> getset hello redis "world"

    (4)設(shè)置 指定位置 的 字符

    setrange key offeset value

    下面操作將由 pest 變?yōu)榱?best:

    127.0.0.1:6379> set redis pest OK 127.0.0.1:6379> setrange redis 0 b (integer) 4 127.0.0.1:6379> get redis "best"

    (5)獲取 部分字符串

    getrange key start end

    start 和 end 分別是 開始 和 結(jié)束的 偏移量([start, end]),偏移量 從 0 開始計(jì)算,例如下面操作獲取了 值 best 的 前兩個(gè)字符。

    127.0.0.1:6379> getrange redis 0 1 "be"

    表 2-2 是 字符串類型命令的 時(shí)間復(fù)雜度,開發(fā)人員可以參考此表,結(jié)合自身業(yè)務(wù)需求 和 數(shù)據(jù)大小 選擇合適的命令。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bA8PTUZ3-1621301836874)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517141143590.png)]

    命令時(shí)間復(fù)雜度
    set key valueO(1)
    get keyO(1)
    del key [key …]O(k),k 是鍵的個(gè)數(shù)
    mset key value [key value …]O(k),k 是鍵的個(gè)數(shù)
    mget key [key …]O(k),k 是鍵的個(gè)數(shù)
    incr keyO(1)
    decr keyO(1)
    incrby key incrementO(1)
    decrby key decrementO(1)
    incrbyfloat key incrementO(1)
    append key valueO(1)
    strlen keyO(1)
    setrange key offset valueO(1)
    getrange key start endO(n),n是字符串長度,由于獲取字符串非???#xff0c;所以如果字符串不是很長,可以視同為O(1)
  • 2.2.2 內(nèi)部編碼

    字符串類型的 內(nèi)部編碼 有3種

    • int8個(gè)字節(jié)的長整型。
    • embstr小于等于39個(gè)字節(jié)的字符串
    • raw大于39個(gè)字節(jié)的字符串

    Redis 會(huì)根據(jù) 當(dāng)前值的 類型 和 長度 決定使用哪種內(nèi)部編碼 實(shí)現(xiàn)

    整數(shù)類型示例如下:

    127.0.0.1:6379> set key 8653 OK 127.0.0.1:6379> object encoding key "int"

    短字符串示例如下:

    # 小于等于 39 個(gè)字節(jié) 的字符串:embstr 127.0.0.1:6379> set key "hello world" OK 127.0.0.1:6379> object encoding key "embstr"

    長字符串示例如下:

    # 大于 39個(gè)字節(jié) 的字符串:raw 127.0.0.1:6379> set key "one string greater than 39 byte........." OK 127.0.0.1:6379> object encoding key "raw" 127.0.0.1:6379> strlen key (integer) 40

    有關(guān) 字符串類型的內(nèi)存優(yōu)化技巧 將在 8.3 節(jié)詳細(xì)介紹。

    2.2.3 典型使用場景
  • 緩存功能

    圖 2-10 是比較典型的 緩存使用場景,其中 Redis 作為 緩存層MySQL 作為 存儲(chǔ)層絕大部分請(qǐng)求的數(shù)據(jù)都是從 Redis 中獲取。

    由于 Redis 具有支撐 高并發(fā) 的特性,所以 緩存 通常能起到 加速讀寫降低后端壓力 的作用。

    下面?zhèn)未a模擬了 圖 2-10 的訪問過程:

    1) 該函數(shù)用于 獲取用戶的基礎(chǔ)信息:

    UserInfo getUserInfo(long id){... }

    2)首先從 Redis 獲取用戶信息:

    //定義鍵 userRedisKey = "user:info:"+id;//從 Redis 獲取值 value = redis.get(userRedisKey); if(value != null){//將值 進(jìn)行反序列化 為UserInfo 并返回結(jié)果userInfo = deserialize(value);return UserInfo; }

    開發(fā)提示

    與 MySQL 等關(guān)系型數(shù)據(jù)庫不同的是,Redis 沒有 命令空間,而且也沒有對(duì) 鍵名 有強(qiáng)制要求(除了 不能使用一些特殊字符)。

    設(shè)計(jì)合理的鍵名,有利于 防止鍵沖突項(xiàng)目的可維護(hù)性,比較推薦的方式是使用 “業(yè)務(wù)名 : 對(duì)象名 : id : [ 屬性 ]” 作為 鍵名(也可以不是分號(hào))。

    例如 MySQL 的 數(shù)據(jù)庫名為 vs,用戶表名為 user,那么對(duì)應(yīng)的鍵可以用 “vs:user:1”,“vs:user:1:name"來表示,例如"user : {uid} : friends : messages : {mid}”,可以在 能描述鍵含義的前提下 適當(dāng)減少鍵的長度,例如變?yōu)?“u : {uid} : fr : m : {mid}”,從而 減少由于 鍵過長的內(nèi)存浪費(fèi)。

    3)如果沒有從 Redis 獲取到用戶信息,需要從 MySQL 中進(jìn)行獲取,并將結(jié)果回寫到 Redis,添加 1小時(shí)(3600秒)過期時(shí)間:

    //從 MySQL 獲取用戶信息 userInfo = mysql.get(id);//將 userInfo 序列化,并存入 redis redis.setex(userRedisKey, 3600, serialize(userInfo));//返回結(jié)果 return userInfo;

    整個(gè)功能的偽代碼如下:

    UserInfo getUserInfo(long id){userRedisKey = "user:info:"+id;value = redis.get(userRedisKey);UserInfo userInfo;if(value != null){userInfo = deserialize(value);}else{userInfo = mysql.get(id);if(userInfo != null)redis.setex(userRedisKey, 3600, serialize(userInfo));}return userInfo; }
  • 計(jì)數(shù)

    許多應(yīng)用都會(huì)使用 Redis 作為計(jì)數(shù)的 基礎(chǔ)工具,它可以實(shí)現(xiàn) 快速計(jì)數(shù)、查詢緩存的功能,同時(shí) 數(shù)據(jù) 可以 異步落地 到 其他數(shù)據(jù)源

    例如筆者所在團(tuán)隊(duì)的 視頻播放數(shù)系統(tǒng) 就是使用 Redis 作為視頻播放數(shù) 計(jì)數(shù)的基礎(chǔ)組件,用戶每播放一次視頻,相應(yīng)的視頻播放數(shù) 就會(huì) 自增1。

    long incrVideoCounter(long id){key = "Video:playCount:"+id;return redis.incr(key); }

    開發(fā)提示

    實(shí)際上一個(gè)真實(shí)的 計(jì)數(shù)系統(tǒng) 要考慮的問題會(huì)很多:防作弊、按照不同維度計(jì)數(shù)數(shù)據(jù)持久化到底層數(shù)據(jù)源等。

  • 共享Session

    如圖 2-11 所示,一個(gè) 分布式 Web 服務(wù) 將用戶的 Session信息 (例如用戶登錄信息)保存在各自服務(wù)器中,這樣會(huì)造成一個(gè)問題,出于負(fù)載均衡的考慮,分布式服務(wù) 會(huì)將 用戶的訪問 均衡到不同服務(wù)器上用戶刷新一次訪問 可能會(huì)發(fā)現(xiàn) 需要重新登錄,這個(gè)問題是 用戶無法容忍的。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-cRZQHxM6-1621301836877)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517150020342.png)]

    為了解決這個(gè)問題,可以使用 Redis 將用戶的Session進(jìn)行集中管理,如圖 2-12 所示,在這種模式下 只要保證 Redis是 高可用 和 擴(kuò)展性 的,每次用戶更新或者查詢登錄信息 都是直接從 Redis 中集中獲取。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-jG7RsGBG-1621301836878)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517150425297.png)]

  • 限速

    很多應(yīng)用處于安全的考慮,會(huì)在每次進(jìn)行登錄時(shí),讓用戶輸入手機(jī)驗(yàn)證碼,從而確定是否是用戶本人。

    但是為了 短信接口 不被頻繁訪問會(huì)限制 用戶每分鐘獲取驗(yàn)證碼的頻率,例如一分鐘不能超過 5次,如圖 2-13 所示。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ZEaLrmw9-1621301836879)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517150617130.png)]

    此功能可以使用 Redis 來實(shí)現(xiàn),下面的偽代碼給出了基本實(shí)現(xiàn)思路:

    phoneNum = "138xxxxxxxx"; key = "shortMsg:limit:"+phoneNum; // SET key value EX 60 NX isExists = redis.set(key, 1, "EX 60", "NX"); if(isExists != null || redis.incr(key) <=5){//通過 }else{//限速 }

    上述就是利用 Redis 實(shí)現(xiàn)了 限速功能,例如一些網(wǎng)站限制一個(gè) IP地址 不能在一秒鐘之內(nèi)訪問超過 n次 也可以采用類似的思路。

    除了上面介紹的幾種使用場景,字符串還有非常多的使用場景,開發(fā)人員可以結(jié)合字符串提供的相應(yīng)命令充分發(fā)揮自己的想象力。

  • 2.3 哈希

    ? 幾乎所有的編程語言都提供了 哈希hash)類型,它們的叫法可能是 哈希、字典、關(guān)聯(lián)數(shù)組

    Redis 中,哈希類型是指 鍵本身 又是一個(gè)鍵值對(duì)結(jié)構(gòu),形如 value={{field1,value1}, ...{fieldN,valueN}},Redis鍵值對(duì) 和 哈希類型 兩者的關(guān)系 可以用圖 2-14來表示。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-xJws3o4J-1621301836879)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517151327641.png)]

    注意

    哈希類型 中的 映射關(guān)系 叫做 field-value,

    注意這里的 value 是指 field 對(duì)應(yīng)的值,

    不是 鍵對(duì)應(yīng)的值,請(qǐng)注意 value 在不同上下文的作用。

    2.3.1 命令

    (1)設(shè)置值

    hset key field value

    下面為 user:1 添加一對(duì) field-value:

    127.0.0.1:6379> hset user:1 name tom (integer) 1

    如果 設(shè)置成功 會(huì)返回1,反之會(huì)返回0

    此外 Redis 提供了 hsetnx 命令,它們的關(guān)系就像 set 和 setnx 命令一樣,只不過作用域 由 變?yōu)?field。

    (2)獲取值

    hget key field

    例如,下面操作獲取 user:1 的 name 域(屬性)對(duì)應(yīng)的值:

    127.0.0.1:6379> hget user:1 name "tom"

    如果 鍵 或 field 不存在,會(huì)返回 nil

    127.0.0.1:6379> hget user:2 name (nil) 127.0.0.1:6379> hget user:1 age (nil)

    (3)刪除 field

    hdel key field [field ...]

    hdel 會(huì)刪除 一個(gè) 或 多個(gè) field,返回結(jié)果為 成功刪除 field 的個(gè)數(shù),例如:

    127.0.0.1:6379> hdel user:1 name (integer) 1 127.0.0.1:6379> hdel user:1 age (integer) 0

    (4)計(jì)算 field 個(gè)數(shù)

    hlen key

    例如 user:1 有 3 個(gè)field:

    127.0.0.1:6379> hset user:1 name tom (integer) 1 127.0.0.1:6379> hset user:1 age 23 (integer) 1 127.0.0.1:6379> hset user:1 city tianjin (integer) 1 127.0.0.1:6379> hlen user:1 (integer) 3

    (5)批量設(shè)置 或 獲取 field-value

    hmget key field [field ...] hmset key field value [field value ...]

    hmset 和 hmget 分別是 批量設(shè)置 和 獲取 field-value,hmset 需要的參數(shù)是 key 和 多對(duì) field-value,hmget 需要的參數(shù)是 key 和多個(gè) field。

    例如:

    127.0.0.1:6379> hmset user:1 name mike age 12 city tianjin OK 127.0.0.1:6379> hmget user:1 name city 1) "mike" 2) "tianjin"

    (6)判斷 field 是否存在

    hexists key field

    例如,user:1 包含 name 域,所以 返回結(jié)果為 1,不包含時(shí)返回0

    127.0.0.1:6379> hexists user:1 name (integer) 1

    (7)獲取所有field

    hkeys key

    hkeys 命令應(yīng)該叫 hfields 更為恰當(dāng),它返回 指定哈希鍵 所有的field,例如:

    127.0.0.1:6379> hkeys user:1 1) "name" 2) "age" 3) "city"

    (8)獲取所有 value

    hvals key

    下面操作 獲取 user:1 全部 value:

    127.0.0.1:6379> hvals user:1 1) "mike" 2) "12" 3) "tianjin"

    (9)獲取所有的field-value

    hgetall key

    下面操作獲取 user:1 所有的field-value

    127.0.0.1:6379> hgetall user:1 1) "name" 2) "mike" 3) "age" 4) "12" 5) "city" 6) "tianjin"

    開發(fā)提示

    在使用 hgetall 時(shí),如果 哈希元素個(gè)數(shù)比較多,會(huì)存在阻塞 Redis 的可能。

    如果開發(fā)人員 只需要獲取部分field,可以使用 hmget,如果 一定要獲取 全部 field-value,可以使用 hscan 命令,該命令會(huì) 漸進(jìn)式遍歷哈希類型hscan 將在 2.7節(jié) 介紹。

    (10) hincrby hincrbyfloat

    hincrby key field hincrbyfloat key field

    hincrbyhincrbyfloat,就像 incrbyincrbyfloat 命令一樣,但是它們的 作用域field。

    (11)計(jì)算 value 的字符串長度(需要 Redis 3.2 以上)

    hstrlen key field

    例如 hget user:1 name 的 value 是 tom,那么 hstrlen 的返回結(jié)果是 3:

    127.0.0.1:6379> hstrlen user:1 name (integer) 3

    表 2-3 是 哈希類型命令的時(shí)間復(fù)雜度,開發(fā)人員可以參考此表選擇合適的命令。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-rY0t7IhA-1621301836880)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517163340964.png)]

    命令時(shí)間復(fù)雜度
    hset key field valueO(1)
    hget key fieldO(1)
    hdel key field [field …]O(k),k 是field個(gè)數(shù)
    hlen keyO(1)
    hgetall keyO(n),n 是field總數(shù)
    hmget key field [field …]O(k),k 是field的個(gè)數(shù)
    hmset key field value [field value …]O(k),k 是field的個(gè)數(shù)
    hexists key fieldO(1)
    hkeys keyO(n),n 是field總數(shù)
    hvals keyO(n),n 是field 總數(shù)
    hsetnx key field valueO(1)
    hincrby key field incrementO(1)
    hincrbyfloat key field incrementO(1)
    hstrlen key fieldO(1)
    2.3.2 內(nèi)部編碼

    ? 哈希類型內(nèi)部編碼兩種

    • ziplist壓縮列表

      • 當(dāng) 哈希類型元素個(gè)數(shù) 小于 hash-max-ziplist-entries 配置(默認(rèn) 512 個(gè))、同時(shí) 所有 值 都小于 hash-max-ziplist-value 配置(默認(rèn) 64字節(jié))時(shí),Redis 會(huì)使用 ziplist 作為 哈希的 內(nèi)部實(shí)現(xiàn),ziplist 使用更加 緊湊的結(jié)構(gòu) 實(shí)現(xiàn) 多個(gè)元素的連續(xù)存儲(chǔ),所以在 節(jié)省內(nèi)存方面 比 hashtable 更加優(yōu)秀。
    • hashtable哈希表

      • 當(dāng) 哈希類型 無法滿足 ziplist 的條件 時(shí),Redis 會(huì)使用 hashtable 作為 哈希的內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí) ziplist 的 讀寫效率 會(huì)下降,而 hashtable 的 讀寫時(shí)間復(fù)雜度為O(1)。

      下面的示例演示了 哈希類型的內(nèi)部編碼,以及相應(yīng)的變化。

      1)當(dāng) field 個(gè)數(shù)比較少 且 沒有大的 value 時(shí),內(nèi)部編碼為 ziplist:

      127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 OK 127.0.0.1:6379> object encoding hashkey "ziplist"

      2.1)當(dāng)有 value 大于 64 字節(jié)內(nèi)部編碼會(huì)由 ziplist 變?yōu)?hashtable:

      127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64bute...忽略..." OK 127.0.0.1:6379> object encoding hashkey "hashtable"

      2.2)當(dāng) field 個(gè)數(shù)超過 512內(nèi)部編碼也會(huì)由 ziplist 變?yōu)?hashtable:

      127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 f3 v3 ...忽略... f513 v513 OK 127.0.0.1:6379> object encoding hashkey "hashtable"

      有關(guān) 哈希類型的內(nèi)存優(yōu)化技巧 將在8.3節(jié)中詳細(xì)介紹。

    2.3.3 使用場景

    圖 2-15 為 關(guān)系型數(shù)據(jù)表記錄 的兩條用戶信息,用戶的屬性 作為 表的列,每條用戶信息 作為 行。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-R2soFSmP-1621301836881)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517171153802.png)]

    idnameagecity
    1tom23beijing
    2mike30tianjin

    如果將其用 哈希類型 存儲(chǔ),如圖 2-16所示。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-LFYe6u71-1621301836881)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517171236539.png)]

    相比于使用 字符串序列化 緩存 用戶信息哈希類型 變得更加直觀,并且在 更新操作上 會(huì)更加便捷

    可以將 每個(gè)用戶的 id 定義為 鍵后綴,多對(duì) field-value 對(duì)應(yīng) 每個(gè)用戶的屬性,類似如下偽代碼:

    UserInfo getUserInfo(long id){//用戶id 作為 key 后綴userRedisKey = "user:info:" + id;//使用 hgetall 獲取所有用戶信息映射關(guān)系userInfoMap = redis.hgetall(userRedisKey);UserInfo userInfo;if (userInfoMap != null){//將映射關(guān)系轉(zhuǎn)換為 UserInfouserInfo = transferMapToUserInfo(userInfoMap);}else{// 從 MySQL 中獲取 用戶信息userInfo = mysql.get(id);//將UserInfo 變?yōu)橛成潢P(guān)系 使用 hmset 保存到 Redis 中redis.hmset(userRedisKey,transferUserInfoToMap(userInfo));//添加過期時(shí)間redis.expire(userRedisKey, 3600);}return userInfo; }

    但是需要注意的是 哈希類型關(guān)系型數(shù)據(jù)庫兩點(diǎn)不同之處:

    • 哈希類型稀疏的,而 關(guān)系型數(shù)據(jù)庫 是完全 結(jié)構(gòu)化的,例如 哈希類型 每個(gè)鍵 可以有不同的 field,而 關(guān)系型數(shù)據(jù)庫一旦 添加新的列,所有行 都要為其 設(shè)置值(即使為NULL),如圖2-17所示。
    • 關(guān)系型數(shù)據(jù)庫 可以做 復(fù)雜的關(guān)系查詢,而 Redis 去模擬關(guān)系型復(fù)雜查詢 開發(fā)困難,維護(hù)成本高。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-6IYVNvHA-1621301836882)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517172939955.png)]

    開發(fā)人員需要將兩者的特點(diǎn)搞清楚,才能在合適的場景使用合適的技術(shù)。

    到目前為止,我們已經(jīng)能夠 用三種方法緩存用戶信息,下面給出 三種方案的實(shí)現(xiàn)方法和優(yōu)缺點(diǎn)分析。

    1)原生字符串類型:每個(gè)屬性一個(gè)鍵。

    set user:1:name tom set user:1:age 23 set user:1:city beijing

    優(yōu)點(diǎn):簡單直觀每個(gè)屬性支持更新 操作。

    缺點(diǎn):占用過多的鍵內(nèi)存占用量較大,同時(shí) 用戶信息 內(nèi)聚性 比較差,所以此種方案 一般不會(huì)在 生產(chǎn)環(huán)境使用。

    2)序列化 字符串類型:將 用戶信息 序列化后 用一個(gè)鍵保存。

    set user:1 serialize(userInfo)

    優(yōu)點(diǎn):簡化編程,如果 合理的使用序列化 可以提高內(nèi)存的使用率

    缺點(diǎn):序列化和反序列化 有一定的開銷,同時(shí)每次更新屬性都需要把全部數(shù)據(jù) 取出進(jìn)行 反序列化,更新后再序列化到 Redis 中。

    3)哈希類型每個(gè)用戶屬性使用一對(duì) field-value,但是只用一個(gè)鍵保存

    hmset user:1 name tom age 23 city beijing

    優(yōu)點(diǎn):簡單直觀,如果 使用合理 可以減少 內(nèi)存空間的使用。

    缺點(diǎn):要控制 哈希在 ziplist 和 hashtable 兩種內(nèi)部編碼的轉(zhuǎn)換,hashtable 會(huì)消耗更多內(nèi)存。

    2.4 列表

    列表(list)類型 是用來 存儲(chǔ)多個(gè) 有序的 字符串

    如圖 2-18 所示,a、b、c、d、e 五個(gè)元素 從左到右 組成了一個(gè) 有序的列表,列表中的 每個(gè)字符串 稱為 元素element),

    一個(gè)列表 最多可以存儲(chǔ) 2的32次方-1 個(gè)元素。

    在 Redis 中,可以對(duì) 列表 兩端 插入push)和 彈出pop),還可以獲取 指定范圍的元素列表、獲取 指定索引下標(biāo)的元素 等(如圖 2-18 和 圖 2-19 所示)。

    列表 是一種 比較靈活的 數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng) 隊(duì)列 的角色,在實(shí)際開發(fā)上 有很多應(yīng)用場景。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-NI5bMq4X-1621301872080)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517205903000.png)]

    列表類型兩個(gè)特點(diǎn)

    第一、列表 中的 元素 是 有序的,這就意味著可以通過 索引下標(biāo) 獲取某個(gè)元素 或者 某個(gè)范圍內(nèi)的 元素列表,例如要獲取 圖 2-19的 第5個(gè)元素,可以執(zhí)行 lindex user:1:message 4 (索引從 0 算起)就可以得到元素e。

    第二列表 中的 元素 可以是 重復(fù)的,例如圖 2-20所示 列表中 包含了 兩個(gè)字符串 a。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-5Wnl6pK9-1621301872082)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517210257862.png)]

    這兩個(gè)特點(diǎn)在后面介紹 集合有序集合 后,會(huì)顯得更加突出,因此在考慮是否使用該數(shù)據(jù)結(jié)構(gòu)前,首先需要弄清楚 列表 數(shù)據(jù)結(jié)構(gòu) 的特點(diǎn)。

    2.4.1 命令

    下面將按照對(duì) 列表的 5種操作類型 對(duì)命令 進(jìn)行介紹,命令如表2-4所示。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-PLEeBqM9-1621301872085)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517210707928.png)]

    操作類型操作
    添加rpush lpush linsert
    lrange lindex llen
    刪除lpop rpop lrem ltrim
    修改lset
    阻塞操作blpop brpop
  • 添加操作

    (1)從右邊插入元素

    rpush key value [value ...]

    下面代碼 從右向左 插入元素 c、b、a:

    127.0.0.1:6379> rpush listkey c b a (integer) 3

    lrange 0 -1 命令可以獲取 從左到右 獲取列表的所有元素

    127.0.0.1:6379> lrange listkey 0 -1 1) "c" 2) "b" 3) "a"

    (2)從左邊插入元素

    lpush key value [value ...]

    使用方法和 rpush 相同,只不過從左側(cè)插入,這里不再贅述。

    (3)向 某個(gè)元素 前 或者 后 插入元素

    linsert key before|after pivot value

    linsert 命令會(huì)從 列表 中 找到等于 pivot 的元素,在其 before) 或者 after插入一個(gè)新的元素 value,例如下面操作會(huì)在列表的元素 b 前 插入 java:

    127.0.0.1:6379> linsert listkey before b java (integer) 4

    返回結(jié)果為 4,代表 當(dāng)前列表的長度,當(dāng)前列表變?yōu)?#xff1a;

    127.0.0.1:6379> lrange listkey 0 -1 1) "c" 2) "java" 3) "b" 4) "a"
  • 查找

    (1) 獲取 指定范圍內(nèi)的元素列表

    lrange key start end

    lrange 操作會(huì) 獲取列表 指定索引范圍 所有的元素

    索引下標(biāo)兩個(gè)特點(diǎn)

    第一索引下標(biāo) 從左到右 分別是 0 到 N-1,但是 從右到左 分別是 -1 到 -N。

    第二,lrange 中的 end 選項(xiàng)包含了自身,這個(gè)和很多編程語言不包含 end 不太相同,例如想獲取 列表的第2到第4個(gè)元素,可以執(zhí)行如下操作:

    127.0.0.1:6379> lrange listkey 1 3 1) "java" 2) "b" 3) "a"

    (2)獲取 列表 指定索引下標(biāo) 的元素

    lindex key index

    例如 當(dāng)前列表 最后一個(gè)元素為a:

    127.0.0.1:6379> lindex listkey -1 "a"

    (3) 獲取列表長度

    llen key

    例如,下面示例 當(dāng)前列表長度為 4:

    127.0.0.1:6379> llen listkey (integer) 4
  • 刪除

    (1)從列表左側(cè) 彈出 元素

    lpop key

    如下操作將 列表最左側(cè)的元素 c 會(huì)被彈出,彈出后列表變?yōu)?java、b、a:

    127.0.0.1:6379> lpop listkey "c" 127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "a"

    (2)從列表右側(cè)彈出

    rpop key

    它的使用方法和 lpop 是一樣的,只不過從 列表 右側(cè)彈出,這里不再贅述。

    (3)刪除指定元素

    lrem key count value

    lrem 命令會(huì)從 列表中找到等于 value 的元素進(jìn)行刪除,根據(jù) count 的不同 分為 三種情況

    • count > 0從左到右刪除最多 count 個(gè)元素。
    • count < 0從右到左刪除最多 count 絕對(duì)值個(gè)元素。
    • count = 0刪除所有。

    例如向 列表 從左向右 插入 5個(gè)a,那么當(dāng)前列表變?yōu)?“a a a a a java b a”,下面操作將從 列表左邊開始刪除4個(gè)為a 的元素:

    127.0.0.1:6379> lrem listkey 4 a (integer) 4 127.0.0.1:6379> lrange listkey 0 -1 1) "a" 2) "java" 3) "b" 4) "a"

    (4)按照索引范圍 修剪 列表

    ltrim key start end

    例如,下面操作會(huì) 只保留 列表 listkey 第2個(gè)到第4個(gè)元素:

    127.0.0.1:6379> ltrim listkey 1 3 OK 127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "a"
  • 修改

    修改指定索引下標(biāo)的元素

    lset key index newValue

    下面操作會(huì)將 列表 listkey 中的 第3個(gè) 元素設(shè)置為 python:

    127.0.0.1:6379> lset listkey 2 python OK 127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "python"
  • 阻塞操作

    阻塞式彈出 如下:

    blpop key [key ...] timeout brpop key [key ...] timeout

    blpop 和 brpop 是 lpop 和 rpop 的 阻塞版本,它們除了 彈出方向不同使用方法基本相同,所以下面以 brpop 命令進(jìn)行說明,brpop 命令包含 兩個(gè)參數(shù):

    • key [key …]多個(gè)列表的鍵
    • timeout阻塞時(shí)間(單位:

    1)列表為空

    如果 timeout = 3,那么 客戶端 要等到 3 秒后返回

    如果 timeout = 0,那么 客戶端 一直阻塞等下去

    127.0.0.1:6379> brpop list:test 3 (nil) (3.10s) 127.0.0.1:6379> brpop list:test 0 ...阻塞...

    如果此期間添加了數(shù)據(jù) element1,客戶端立即返回:

    127.0.0.1:6379> brpop list:test 3 1) "list:test" 2) "element1" (2.06s)

    2)列表不為空客戶端會(huì)立即返回

    127.0.0.1:6379> brpop list:test 0 1) "list:test" 2) "element1"

    在使用 brpop 時(shí),有 兩點(diǎn) 需要注意。

    第一點(diǎn),如果是 多個(gè)鍵,那么 brpop 會(huì) 從左至右 遍歷鍵一旦有一個(gè)鍵 能彈出元素,客戶端立即返回

    127.0.0.1:6379> brpop list:1 list:2 list:3 ...阻塞...

    此時(shí) 另一個(gè)客戶端 分別向 list:2 和 list:3 插入元素:

    client-lpush> lpush list:2 element2 (integer) 1 client-lpush> lpush list:3 element3 (integer) 1

    客戶端會(huì) 立即返回 list:2 中的element2 ,因?yàn)?list:2 最先有可以彈出的元素:

    127.0.0.1:6379> brpop list:1 list:2 list:3 1) "list:2" 2) "element2"

    第二點(diǎn),如果 多個(gè)客戶端 對(duì) 同一個(gè)鍵執(zhí)行 brpop,那么 最先執(zhí)行 brpop 命令的客戶端 可以獲取到 彈出的值

    客戶端1:

    client-1> brpop list:test 0 ...阻塞...

    客戶端2:

    client-2> brpop list:test 0 ...阻塞...

    客戶端3:

    client-3> brpop list:test 0 ...阻塞...

    此時(shí)另一個(gè)客戶端 lpush 一個(gè)元素到 list:test 列表中:

    client-lpush> lpush list:test element (integer) 1

    那么 客戶端1 最先會(huì)獲取到元素,因?yàn)?客戶端1 最先執(zhí)行 brpop,而客戶端2 和 客戶端3繼續(xù)阻塞:

    client> brpop list:test 0 1) "list:test" 2) "element"

    有關(guān) 列表 的 基礎(chǔ)命令 已經(jīng)介紹完了,表 2-5 是這些命令的時(shí)間復(fù)雜度,開發(fā)人員可以參考此表 選擇合適的命令。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-55GHVUyL-1621301872089)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517214858071.png)]

    操作類型命令時(shí)間復(fù)雜度
    添加rpush key value [value …]O(k),k 是元素個(gè)數(shù)
    添加lpush key value [value …]O(k),k 是元素個(gè)數(shù)
    添加linsert key before|after pivot valueO(n),n 是pivot 距離列表頭或尾的舉例
    查找lrange key start endO(s+n),s 是 start 偏移量,n 是 start 到 end 的范圍
    查找lindex key indexO(n),n 是索引的偏移量
    查找llen keyO(1)
    刪除lpop keyO(1)
    刪除rpop keyO(1)
    刪除lrem count keyO(n),n 是列表長度
    刪除ltrim key start endO(n),n 是要裁剪的元素總數(shù)
    修改lset key index valueO(n),n 是索引的偏移量
    阻塞操作blpop brpopO(1)
  • 2.4.2 內(nèi)部編碼

    列表類型內(nèi)部編碼兩種。

    • ziplist壓縮列表

      • 當(dāng) 列表的 元素個(gè)數(shù) 小于 list-max-ziplist-entries 配置(默認(rèn) 512 個(gè)),同時(shí) 列表中 每個(gè)元素的值 都小于 list-max-ziplist-value 配置時(shí)(默認(rèn) 64 字節(jié)),Redis 會(huì)選用 ziplist 來作為 列表的內(nèi)部實(shí)現(xiàn)減少內(nèi)存的使用。
    • linkedlist鏈表

      • 當(dāng) 列表類型 無法滿足 ziplist 的條件時(shí),Redis 會(huì)使用 linkedlist 作為 列表的內(nèi)部實(shí)現(xiàn)

      下面的示例演示了 列表類型的內(nèi)部編碼,以及相應(yīng)的變化。

      1)當(dāng) 元素個(gè)數(shù) 較少 且 沒有大元素 時(shí),內(nèi)部編碼為 ziplist:

      127.0.0.1:6379> rpush listkey e1 e2 e3 (integer) 3 127.0.0.1:6379> object encoding listkey "ziplist"

      2.1)當(dāng) 元素個(gè)數(shù)超過 512個(gè)內(nèi)部編碼變?yōu)?linkedlist:

      127.0.0.1:6379> rpush listkey e4 e5 ...忽略... e512 e 513 (integer) 513 127.0.0.1:6379> object encoding listkey "linkedlist"

      2.2)或者當(dāng) 某個(gè)元素超過 64 字節(jié)內(nèi)部編碼也會(huì)變?yōu)?linkedlist:

      127.0.0.1:6379> rpush listkey "one string is bigger than 64 byte ......................................." (integer) 4 127.0.0.1:6379> object encoding listkey "linkedlist"

      開發(fā)提示

      Redis 3.2 版本提供了 quicklist 內(nèi)部編碼,

      簡單地說它是 以一個(gè)ziplist 為節(jié)點(diǎn)的 linkedlist,它結(jié)合了 ziplistlinkedlist 兩者的優(yōu)勢,為 列表類型 提供了一種更為優(yōu)秀的內(nèi)部編碼實(shí)現(xiàn),它的設(shè)計(jì)原理可以參考Redis的另一個(gè)作者M(jìn)att Stancliff 的博客:http://matt.sh/redis-quicklist。

      有關(guān) 列表類型的優(yōu)化技巧 將在 8.3節(jié) 詳細(xì)介紹。

    2.4.3 使用場景
  • 消息隊(duì)列

    如圖 2-21所示,Redis的 lpush+brpop 命令組合即可實(shí)現(xiàn) 阻塞隊(duì)列,生產(chǎn)者客戶端 使用 lpush 從列表左側(cè)插入元素,多個(gè)消費(fèi)者客戶端使用 brpop 命令阻塞式的 “搶” 列表尾部的元素,多個(gè)客戶端 保證了 消費(fèi)的負(fù)載均衡 和 高可用性。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-kzgBPzc3-1621301872090)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210517222037844.png)]

  • 文章列表

    每個(gè)用戶有屬于自己的 文章列表,現(xiàn)需要 分頁展示 文章列表。

    此時(shí)可以考慮使用 列表,因?yàn)?列表 不但是 有序的,同時(shí) 支持按照 索引范圍 獲取元素。

    1)每篇文章使用 哈希結(jié)構(gòu) 存儲(chǔ),例如每篇文章有 3個(gè)屬性 title、timestamp、content:

    hmset article:1 title xx timestamp 1476536196 content xxxx ... hmset article:k title yy timestamp 1476512536 content yyyy ....

    2)向 用戶文章列表 添加文章,user : {id} : articles 作為 用戶文章列表 的鍵:

    lpush user:1:articles article:1 article3 ... lpush user:k:articles article:5 ...

    3)分頁 獲取 用戶文章列表,例如下面?zhèn)未a獲取用戶 id=1 的前 10 篇文章:

    articles = lrange user:1:articles 0 9 for article in {articles}hgetall {article}

    使用 列表類型保存 和 獲取文章列表 會(huì)存在兩個(gè)問題。

    第一,如果 每次分頁獲取的文章個(gè)數(shù)較多,需要執(zhí)行多次 hgetall 操作,此時(shí)可以考慮使用 Pipeline(第3章會(huì)介紹)批量獲取,或者考慮 將文章數(shù)據(jù)序列化為字符串,使用 mget 批量獲取。

    第二,分頁獲取文章列表時(shí),lrange 命令在列表兩端性能較好,但是如果 列表較大,獲取列表中間范圍的元素 性能會(huì)變差,此時(shí)可以考慮將 列表做二級(jí)拆分,或者使用 Redis 3.2 的quicklist 內(nèi)部編碼實(shí)現(xiàn),它結(jié)合 ziplist 和 linkedlist 的特點(diǎn),獲取 列表中間范圍的元素 時(shí)也可以高效完成。

  • 總結(jié)

    以上是生活随笔為你收集整理的Redis开发与运维的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产精品久久久av久久久 | 亚洲国产欧美国产综合一区 | 精品人人妻人人澡人人爽人人 | 精品aⅴ一区二区三区 | 夜精品a片一区二区三区无码白浆 | 精品无码成人片一区二区98 | 国产在线aaa片一区二区99 | 久精品国产欧美亚洲色aⅴ大片 | 色偷偷人人澡人人爽人人模 | 国产午夜视频在线观看 | 日韩人妻无码中文字幕视频 | 国产黄在线观看免费观看不卡 | 十八禁真人啪啪免费网站 | 日日碰狠狠丁香久燥 | 一本久久伊人热热精品中文字幕 | 成人精品天堂一区二区三区 | 国产在热线精品视频 | 国产激情艳情在线看视频 | 四十如虎的丰满熟妇啪啪 | 亚洲国精产品一二二线 | 国产电影无码午夜在线播放 | 亚洲综合色区中文字幕 | 国产99久久精品一区二区 | 乱人伦中文视频在线观看 | 国产内射爽爽大片视频社区在线 | 国产片av国语在线观看 | 特大黑人娇小亚洲女 | 国产亚洲视频中文字幕97精品 | 风流少妇按摩来高潮 | 色综合久久久久综合一本到桃花网 | 黑人巨大精品欧美一区二区 | 久久久精品人妻久久影视 | 久青草影院在线观看国产 | 日韩欧美成人免费观看 | 国产无遮挡吃胸膜奶免费看 | 麻豆国产丝袜白领秘书在线观看 | 国产在线精品一区二区高清不卡 | 内射后入在线观看一区 | 久热国产vs视频在线观看 | 国产精品沙发午睡系列 | 中文精品久久久久人妻不卡 | 久久久亚洲欧洲日产国码αv | 久久99精品久久久久婷婷 | 国产成人一区二区三区在线观看 | 色婷婷综合激情综在线播放 | 国产精品久久久久久久影院 | 久精品国产欧美亚洲色aⅴ大片 | 极品尤物被啪到呻吟喷水 | 亚洲欧洲日本无在线码 | 草草网站影院白丝内射 | 在线а√天堂中文官网 | 国产热a欧美热a在线视频 | 亚洲男女内射在线播放 | 久久人妻内射无码一区三区 | 啦啦啦www在线观看免费视频 | 美女扒开屁股让男人桶 | 女人被男人爽到呻吟的视频 | 国产网红无码精品视频 | 十八禁真人啪啪免费网站 | 伦伦影院午夜理论片 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕无码av激情不卡 | 欧美大屁股xxxxhd黑色 | 日韩欧美成人免费观看 | 国产午夜精品一区二区三区嫩草 | 少妇无码av无码专区在线观看 | 久久视频在线观看精品 | 综合激情五月综合激情五月激情1 | 中文字幕 亚洲精品 第1页 | 久久精品国产日本波多野结衣 | 无码国产激情在线观看 | 久久精品中文字幕一区 | 久久综合九色综合97网 | 国产在线aaa片一区二区99 | 色诱久久久久综合网ywww | 日韩成人一区二区三区在线观看 | 无码av中文字幕免费放 | 国产艳妇av在线观看果冻传媒 | 99久久99久久免费精品蜜桃 | 少妇太爽了在线观看 | 国产无套内射久久久国产 | 又大又紧又粉嫩18p少妇 | aa片在线观看视频在线播放 | 亚洲精品久久久久avwww潮水 | 激情五月综合色婷婷一区二区 | 少妇性荡欲午夜性开放视频剧场 | 亚洲无人区午夜福利码高清完整版 | 国产美女极度色诱视频www | 久久久久成人精品免费播放动漫 | 日本一卡2卡3卡四卡精品网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品久久久久avwww潮水 | 正在播放老肥熟妇露脸 | 成 人 网 站国产免费观看 | 国产精品久久久一区二区三区 | 亚洲色无码一区二区三区 | 精品 日韩 国产 欧美 视频 | a国产一区二区免费入口 | 久久亚洲精品成人无码 | 色老头在线一区二区三区 | 无码国模国产在线观看 | 亚洲国产av美女网站 | 午夜理论片yy44880影院 | 亚洲大尺度无码无码专区 | 国产精品亚洲а∨无码播放麻豆 | 曰韩无码二三区中文字幕 | 精品国精品国产自在久国产87 | 日本大乳高潮视频在线观看 | 麻花豆传媒剧国产免费mv在线 | 一本久久a久久精品vr综合 | 国产熟妇另类久久久久 | 亚洲一区二区观看播放 | 国产成人一区二区三区别 | 婷婷五月综合缴情在线视频 | 无码精品国产va在线观看dvd | 国产精品多人p群无码 | 日本www一道久久久免费榴莲 | 亚洲精品久久久久avwww潮水 | 老太婆性杂交欧美肥老太 | 国内丰满熟女出轨videos | 在线亚洲高清揄拍自拍一品区 | 欧美三级不卡在线观看 | a在线观看免费网站大全 | 中文无码成人免费视频在线观看 | 亚洲日本va中文字幕 | 国产精品第一区揄拍无码 | 国产精品第一区揄拍无码 | 色婷婷久久一区二区三区麻豆 | 成人试看120秒体验区 | 亚洲阿v天堂在线 | 日韩人妻无码中文字幕视频 | 少妇被粗大的猛进出69影院 | 国产亚洲精品久久久闺蜜 | 99久久久无码国产aaa精品 | 熟妇人妻激情偷爽文 | аⅴ资源天堂资源库在线 | 激情内射日本一区二区三区 | 久久精品女人天堂av免费观看 | 无码人妻精品一区二区三区不卡 | aⅴ亚洲 日韩 色 图网站 播放 | 国产精品久久久久久久9999 | 少妇人妻偷人精品无码视频 | 男人的天堂av网站 | 久久精品国产大片免费观看 | 欧美成人家庭影院 | 岛国片人妻三上悠亚 | 国产av久久久久精东av | 国产超级va在线观看视频 | 大地资源网第二页免费观看 | 女高中生第一次破苞av | 国产国产精品人在线视 | 欧美激情综合亚洲一二区 | 亚洲国产精品一区二区第一页 | 日日干夜夜干 | 一本色道久久综合狠狠躁 | 高清国产亚洲精品自在久久 | 亚洲中文字幕在线观看 | 国产午夜无码视频在线观看 | 天干天干啦夜天干天2017 | 久久久久亚洲精品男人的天堂 | 精品国产aⅴ无码一区二区 | 麻花豆传媒剧国产免费mv在线 | 奇米影视888欧美在线观看 | 精品国产一区二区三区四区 | 日产精品99久久久久久 | 国产精品亚洲а∨无码播放麻豆 | 欧美真人作爱免费视频 | 一二三四在线观看免费视频 | 日本精品高清一区二区 | 国产人成高清在线视频99最全资源 | 日产精品99久久久久久 | 377p欧洲日本亚洲大胆 | 亚洲精品久久久久avwww潮水 | 日本又色又爽又黄的a片18禁 | 久久99国产综合精品 | 国产亚洲精品久久久闺蜜 | 大肉大捧一进一出好爽视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲无人区午夜福利码高清完整版 | 国产在线精品一区二区三区直播 | 人人妻人人澡人人爽精品欧美 | 成人精品天堂一区二区三区 | 精品国产一区二区三区av 性色 | 99精品视频在线观看免费 | 精品少妇爆乳无码av无码专区 | 久久久久久九九精品久 | 久久久国产一区二区三区 | 性欧美大战久久久久久久 | 国产情侣作爱视频免费观看 | 久久午夜无码鲁丝片 | 色婷婷久久一区二区三区麻豆 | 久久久中文久久久无码 | 对白脏话肉麻粗话av | 青青草原综合久久大伊人精品 | 性生交大片免费看l | 日韩av无码一区二区三区不卡 | 窝窝午夜理论片影院 | 少妇高潮喷潮久久久影院 | 日韩精品成人一区二区三区 | 欧美日本日韩 | 国产成人精品一区二区在线小狼 | 曰本女人与公拘交酡免费视频 | 午夜精品一区二区三区的区别 | 人妻aⅴ无码一区二区三区 | 亚洲爆乳精品无码一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 国产精品二区一区二区aⅴ污介绍 | 国产精品久久久av久久久 | 无码人妻av免费一区二区三区 | 精品国产一区二区三区四区 | 大地资源中文第3页 | 国产精品人妻一区二区三区四 | 九九在线中文字幕无码 | 国产高潮视频在线观看 | 国产精品亚洲专区无码不卡 | 国产精品久免费的黄网站 | 中文字幕+乱码+中文字幕一区 | 久久精品中文闷骚内射 | 六月丁香婷婷色狠狠久久 | 两性色午夜免费视频 | 亚洲色在线无码国产精品不卡 | 国产成人无码av片在线观看不卡 | 国产在线精品一区二区三区直播 | 欧美黑人性暴力猛交喷水 | 亚洲 日韩 欧美 成人 在线观看 | 日韩人妻少妇一区二区三区 | 老熟妇仑乱视频一区二区 | 东京热男人av天堂 | 亚洲成a人片在线观看日本 | 国产特级毛片aaaaaaa高清 | √8天堂资源地址中文在线 | 亚洲熟妇色xxxxx欧美老妇 | 久久熟妇人妻午夜寂寞影院 | 免费人成网站视频在线观看 | 色妞www精品免费视频 | 老太婆性杂交欧美肥老太 | 亚洲综合无码一区二区三区 | 日日摸日日碰夜夜爽av | 丰满肥臀大屁股熟妇激情视频 | 欧洲欧美人成视频在线 | 亚洲成a人片在线观看日本 | 国产亚洲精品精品国产亚洲综合 | 亚洲中文无码av永久不收费 | 一区二区三区高清视频一 | 精品国产一区二区三区四区在线看 | 亚洲日本va午夜在线电影 | 久久99精品久久久久婷婷 | 成人av无码一区二区三区 | 免费无码一区二区三区蜜桃大 | 97精品人妻一区二区三区香蕉 | 成 人 网 站国产免费观看 | 亚洲综合伊人久久大杳蕉 | 国产99久久精品一区二区 | 美女张开腿让人桶 | 熟女少妇在线视频播放 | 好爽又高潮了毛片免费下载 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲一区二区三区在线观看网站 | 无码国产激情在线观看 | 人妻尝试又大又粗久久 | 内射欧美老妇wbb | 狂野欧美性猛xxxx乱大交 | 18无码粉嫩小泬无套在线观看 | 免费国产成人高清在线观看网站 | 俄罗斯老熟妇色xxxx | 中文无码精品a∨在线观看不卡 | 国产xxx69麻豆国语对白 | 亚洲日韩精品欧美一区二区 | 国产精品嫩草久久久久 | 人妻少妇被猛烈进入中文字幕 | 性欧美熟妇videofreesex | 精品国产aⅴ无码一区二区 | 久久精品成人欧美大片 | 久久亚洲日韩精品一区二区三区 | 中文字幕亚洲情99在线 | 天海翼激烈高潮到腰振不止 | 亚洲s码欧洲m码国产av | 亚洲精品午夜无码电影网 | 国产成人精品久久亚洲高清不卡 | 牛和人交xxxx欧美 | 男人和女人高潮免费网站 | 人妻无码αv中文字幕久久琪琪布 | 我要看www免费看插插视频 | 亚洲s码欧洲m码国产av | 久在线观看福利视频 | 欧美丰满老熟妇xxxxx性 | 在教室伦流澡到高潮hnp视频 | 成人无码精品1区2区3区免费看 | 国产欧美精品一区二区三区 | 中文字幕人妻无码一区二区三区 | 色综合久久中文娱乐网 | 亲嘴扒胸摸屁股激烈网站 | 久久久久久a亚洲欧洲av冫 | 国产乱子伦视频在线播放 | 东京热一精品无码av | 综合激情五月综合激情五月激情1 | 日韩精品无码免费一区二区三区 | 国产av一区二区精品久久凹凸 | 99久久精品日本一区二区免费 | 天堂亚洲2017在线观看 | 永久免费观看美女裸体的网站 | 亚洲国产精品无码久久久久高潮 | 久久久久久久女国产乱让韩 | 成人精品视频一区二区三区尤物 | 伊人久久大香线焦av综合影院 | 天天爽夜夜爽夜夜爽 | 欧美自拍另类欧美综合图片区 | 国产精品久久久久久亚洲影视内衣 | 久久精品国产亚洲精品 | 色噜噜亚洲男人的天堂 | 无码精品人妻一区二区三区av | 亚洲人成影院在线无码按摩店 | 性开放的女人aaa片 | 沈阳熟女露脸对白视频 | 大屁股大乳丰满人妻 | 无遮挡国产高潮视频免费观看 | 亚洲午夜福利在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 伊人色综合久久天天小片 | 亚洲乱码日产精品bd | 人妻少妇精品无码专区二区 | 99久久99久久免费精品蜜桃 | 国产精品久久国产三级国 | 宝宝好涨水快流出来免费视频 | 色欲av亚洲一区无码少妇 | 日日碰狠狠躁久久躁蜜桃 | 久久 国产 尿 小便 嘘嘘 | 国产热a欧美热a在线视频 | 亚洲爆乳无码专区 | 国产精品亚洲综合色区韩国 | 十八禁视频网站在线观看 | 国产亚洲精品久久久ai换 | 最近免费中文字幕中文高清百度 | 亚洲成av人片天堂网无码】 | √天堂中文官网8在线 | www国产亚洲精品久久久日本 | 国产精品沙发午睡系列 | 无人区乱码一区二区三区 | 女人被爽到呻吟gif动态图视看 | 国产成人精品一区二区在线小狼 | 狂野欧美性猛xxxx乱大交 | 成人三级无码视频在线观看 | 亚洲日韩av片在线观看 | 少妇性俱乐部纵欲狂欢电影 | 成人精品一区二区三区中文字幕 | 强开小婷嫩苞又嫩又紧视频 | 在线观看国产午夜福利片 | 男人的天堂av网站 | 日本www一道久久久免费榴莲 | 国内老熟妇对白xxxxhd | 日韩精品久久久肉伦网站 | 强伦人妻一区二区三区视频18 | 亚洲综合精品香蕉久久网 | 国产黄在线观看免费观看不卡 | 成人欧美一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 狠狠色噜噜狠狠狠狠7777米奇 | 国内精品人妻无码久久久影院蜜桃 | 国产成人无码区免费内射一片色欲 | 色 综合 欧美 亚洲 国产 | 亚洲精品综合一区二区三区在线 | 人人妻人人澡人人爽欧美一区 | а天堂中文在线官网 | 一区二区传媒有限公司 | 精品国产一区av天美传媒 | 丝袜人妻一区二区三区 | 无码帝国www无码专区色综合 | 麻豆国产丝袜白领秘书在线观看 | 99国产欧美久久久精品 | 久久综合香蕉国产蜜臀av | 性欧美熟妇videofreesex | 99在线 | 亚洲 | 熟妇人妻激情偷爽文 | 人人妻人人澡人人爽人人精品浪潮 | 大地资源中文第3页 | 国产一区二区三区日韩精品 | 性色欲情网站iwww九文堂 | 97无码免费人妻超级碰碰夜夜 | 欧洲极品少妇 | 精品亚洲成av人在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 波多野结衣乳巨码无在线观看 | aⅴ在线视频男人的天堂 | 免费无码午夜福利片69 | 又湿又紧又大又爽a视频国产 | 特大黑人娇小亚洲女 | 国产一区二区三区精品视频 | 在线а√天堂中文官网 | 狠狠亚洲超碰狼人久久 | 亚洲国产精品无码久久久久高潮 | 精品人人妻人人澡人人爽人人 | 国产在线一区二区三区四区五区 | 97人妻精品一区二区三区 | 亚洲国产午夜精品理论片 | 1000部啪啪未满十八勿入下载 | 国产亚洲欧美在线专区 | 青青草原综合久久大伊人精品 | 午夜肉伦伦影院 | 日日摸天天摸爽爽狠狠97 | 午夜丰满少妇性开放视频 | 人人爽人人澡人人人妻 | 国产成人无码av一区二区 | 国产午夜亚洲精品不卡下载 | 亚洲精品国偷拍自产在线麻豆 | 亚洲欧美日韩综合久久久 | 99久久精品午夜一区二区 | 国产精品va在线播放 | 亚洲一区二区三区香蕉 | 亚洲欧美色中文字幕在线 | 欧美日韩一区二区综合 | 国产成人无码av一区二区 | 欧美野外疯狂做受xxxx高潮 | 一本久道久久综合婷婷五月 | 精品一区二区三区波多野结衣 | 天下第一社区视频www日本 | 国产人妻精品一区二区三区 | 亚洲精品国产第一综合99久久 | 图片区 小说区 区 亚洲五月 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 99久久人妻精品免费一区 | 欧美第一黄网免费网站 | 在线观看国产午夜福利片 | 鲁鲁鲁爽爽爽在线视频观看 | 特黄特色大片免费播放器图片 | 少妇高潮一区二区三区99 | 76少妇精品导航 | 日本又色又爽又黄的a片18禁 | 乌克兰少妇xxxx做受 | 色妞www精品免费视频 | 中文字幕+乱码+中文字幕一区 | 亚洲综合无码久久精品综合 | 国产av剧情md精品麻豆 | 美女黄网站人色视频免费国产 | 午夜精品一区二区三区在线观看 | 国产偷抇久久精品a片69 | 牲欲强的熟妇农村老妇女视频 | 又湿又紧又大又爽a视频国产 | 无码国产乱人伦偷精品视频 | 狠狠色丁香久久婷婷综合五月 | 亚洲中文字幕久久无码 | 亚洲欧美国产精品久久 | 大屁股大乳丰满人妻 | 熟妇人妻中文av无码 | 性欧美疯狂xxxxbbbb | 青青青手机频在线观看 | 亚洲国产精华液网站w | 免费网站看v片在线18禁无码 | 亚洲 另类 在线 欧美 制服 | 中文字幕无线码免费人妻 | 国产成人精品一区二区在线小狼 | 俺去俺来也在线www色官网 | 女人高潮内射99精品 | 国产午夜视频在线观看 | 三上悠亚人妻中文字幕在线 | 日日麻批免费40分钟无码 | 丝袜 中出 制服 人妻 美腿 | 婷婷六月久久综合丁香 | 人妻少妇被猛烈进入中文字幕 | √8天堂资源地址中文在线 | 小鲜肉自慰网站xnxx | 伊人久久大香线蕉亚洲 | 亚洲一区二区三区国产精华液 | 天堂а√在线中文在线 | 国产精品内射视频免费 | 精品无人区无码乱码毛片国产 | 精品国产成人一区二区三区 | 性欧美videos高清精品 | 欧美野外疯狂做受xxxx高潮 | 中文毛片无遮挡高清免费 | 国产成人无码午夜视频在线观看 | 欧洲美熟女乱又伦 | 欧美黑人性暴力猛交喷水 | 久久亚洲中文字幕精品一区 | 东京热无码av男人的天堂 | 婷婷丁香六月激情综合啪 | 最新国产麻豆aⅴ精品无码 | 99精品久久毛片a片 | 小泽玛莉亚一区二区视频在线 | 国产亚洲精品久久久闺蜜 | 色诱久久久久综合网ywww | 欧美午夜特黄aaaaaa片 | 中文精品无码中文字幕无码专区 | 无人区乱码一区二区三区 | 久久国产精品精品国产色婷婷 | 国产精品va在线观看无码 | 九月婷婷人人澡人人添人人爽 | 亚洲综合在线一区二区三区 | 午夜精品久久久内射近拍高清 | 丝袜足控一区二区三区 | 亚洲中文字幕无码中字 | 久久亚洲国产成人精品性色 | 丰满少妇人妻久久久久久 | 国产在线精品一区二区三区直播 | 亚洲精品一区国产 | 俄罗斯老熟妇色xxxx | 国产人妖乱国产精品人妖 | 97色伦图片97综合影院 | 日韩在线不卡免费视频一区 | 中文字幕无码免费久久99 | 乱人伦人妻中文字幕无码久久网 | 国产午夜视频在线观看 | 国产网红无码精品视频 | 国产激情精品一区二区三区 | 3d动漫精品啪啪一区二区中 | 性生交大片免费看女人按摩摩 | 人人妻人人藻人人爽欧美一区 | 欧美丰满熟妇xxxx性ppx人交 | 偷窥日本少妇撒尿chinese | 久久人人爽人人爽人人片av高清 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产精品第一区揄拍无码 | 国产成人综合美国十次 | 嫩b人妻精品一区二区三区 | 亚洲阿v天堂在线 | 欧美精品在线观看 | 欧美阿v高清资源不卡在线播放 | 少妇被粗大的猛进出69影院 | 999久久久国产精品消防器材 | 欧洲美熟女乱又伦 | 亚洲经典千人经典日产 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲小说春色综合另类 | 亚洲精品成人av在线 | 欧美三级a做爰在线观看 | 岛国片人妻三上悠亚 | 久久久久国色av免费观看性色 | 亚洲 a v无 码免 费 成 人 a v | 亚洲国产精品美女久久久久 | 国产精品自产拍在线观看 | 性欧美牲交在线视频 | 99视频精品全部免费免费观看 | 少妇被粗大的猛进出69影院 | 水蜜桃色314在线观看 | 国产精品对白交换视频 | 国产97色在线 | 免 | 亚洲天堂2017无码中文 | 无码精品人妻一区二区三区av | 三上悠亚人妻中文字幕在线 | 国产免费久久久久久无码 | 国产激情精品一区二区三区 | 亚洲国产精品一区二区美利坚 | 图片区 小说区 区 亚洲五月 | 人人澡人人妻人人爽人人蜜桃 | 成年美女黄网站色大免费视频 | 精品久久久无码人妻字幂 | www国产亚洲精品久久网站 | 熟女少妇人妻中文字幕 | 麻豆精品国产精华精华液好用吗 | 最近的中文字幕在线看视频 | 久久精品国产一区二区三区肥胖 | 亚洲aⅴ无码成人网站国产app | 曰韩无码二三区中文字幕 | 大肉大捧一进一出好爽视频 | 玩弄少妇高潮ⅹxxxyw | 精品国产av色一区二区深夜久久 | 国产精品亚洲综合色区韩国 | 亚洲欧美色中文字幕在线 | 玩弄少妇高潮ⅹxxxyw | aⅴ在线视频男人的天堂 | 99re在线播放 | 日本成熟视频免费视频 | 久久国产精品精品国产色婷婷 | www国产亚洲精品久久网站 | 亚洲日韩av一区二区三区中文 | 狠狠色欧美亚洲狠狠色www | 人人妻人人澡人人爽欧美精品 | 欧美日韩一区二区免费视频 | 欧洲欧美人成视频在线 | 中文毛片无遮挡高清免费 | 内射老妇bbwx0c0ck | 久久久久成人片免费观看蜜芽 | 99麻豆久久久国产精品免费 | 狠狠色欧美亚洲狠狠色www | 日韩欧美中文字幕在线三区 | 久久伊人色av天堂九九小黄鸭 | 国产香蕉尹人视频在线 | 清纯唯美经典一区二区 | 久久97精品久久久久久久不卡 | 综合人妻久久一区二区精品 | 白嫩日本少妇做爰 | 欧美兽交xxxx×视频 | 一本无码人妻在中文字幕免费 | 日本爽爽爽爽爽爽在线观看免 | 国产精品自产拍在线观看 | 日本一区二区三区免费播放 | 国产成人精品必看 | 任你躁国产自任一区二区三区 | 十八禁真人啪啪免费网站 | 强开小婷嫩苞又嫩又紧视频 | 国产情侣作爱视频免费观看 | av香港经典三级级 在线 | 人妻互换免费中文字幕 | 国内精品久久毛片一区二区 | 在线播放免费人成毛片乱码 | 日日摸日日碰夜夜爽av | 国产精品亚洲а∨无码播放麻豆 | 欧美大屁股xxxxhd黑色 | 波多野结衣一区二区三区av免费 | 一本精品99久久精品77 | 男女下面进入的视频免费午夜 | 成人免费视频一区二区 | 精品aⅴ一区二区三区 | 亚洲爆乳精品无码一区二区三区 | 亚洲啪av永久无码精品放毛片 | 色婷婷av一区二区三区之红樱桃 | 亚洲 日韩 欧美 成人 在线观看 | 日本精品久久久久中文字幕 | 国内揄拍国内精品人妻 | 88国产精品欧美一区二区三区 | 日韩欧美中文字幕公布 | 一本色道久久综合狠狠躁 | 思思久久99热只有频精品66 | 黑人粗大猛烈进出高潮视频 | 久久精品国产99精品亚洲 | 国内精品人妻无码久久久影院 | 老熟女重囗味hdxx69 | 性做久久久久久久免费看 | 国产精品多人p群无码 | 国产av人人夜夜澡人人爽麻豆 | 欧美激情综合亚洲一二区 | 国产精品久久久久影院嫩草 | 小sao货水好多真紧h无码视频 | 久久人人爽人人爽人人片av高清 | 亚洲s码欧洲m码国产av | 亚洲国产欧美国产综合一区 | 成人欧美一区二区三区黑人 | 免费国产成人高清在线观看网站 | 日本护士xxxxhd少妇 | 国内精品久久久久久中文字幕 | 亚洲精品久久久久avwww潮水 | 中文精品久久久久人妻不卡 | 日韩精品a片一区二区三区妖精 | 国内精品久久毛片一区二区 | 免费观看激色视频网站 | 无码人妻丰满熟妇区五十路百度 | 国产9 9在线 | 中文 | 无码人妻久久一区二区三区不卡 | 伊人久久婷婷五月综合97色 | 人人妻人人澡人人爽欧美一区 | 午夜熟女插插xx免费视频 | 久久精品国产亚洲精品 | 免费观看的无遮挡av | 成人精品视频一区二区三区尤物 | 5858s亚洲色大成网站www | 野外少妇愉情中文字幕 | √天堂资源地址中文在线 | 在线 国产 欧美 亚洲 天堂 | 一本加勒比波多野结衣 | 97夜夜澡人人爽人人喊中国片 | 久久精品女人的天堂av | 成人精品视频一区二区 | 伦伦影院午夜理论片 | 日韩人妻无码一区二区三区久久99 | 国产黑色丝袜在线播放 | 久久亚洲日韩精品一区二区三区 | 日韩欧美群交p片內射中文 | 人妻少妇精品视频专区 | 久久久久成人精品免费播放动漫 | 午夜福利试看120秒体验区 | 九九综合va免费看 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲一区二区三区四区 | 一本无码人妻在中文字幕免费 | 鲁一鲁av2019在线 | 大乳丰满人妻中文字幕日本 | 欧美日韩一区二区免费视频 | 人人妻人人澡人人爽欧美精品 | 国产色精品久久人妻 | 国产在线无码精品电影网 | 性欧美videos高清精品 | 婷婷六月久久综合丁香 | 丰满少妇弄高潮了www | 女人被男人爽到呻吟的视频 | 丁香花在线影院观看在线播放 | 无码国产乱人伦偷精品视频 | 夫妻免费无码v看片 | 国产成人精品三级麻豆 | 国产成人综合色在线观看网站 | аⅴ资源天堂资源库在线 | 99久久人妻精品免费一区 | 国产精品久免费的黄网站 | 在教室伦流澡到高潮hnp视频 | 鲁大师影院在线观看 | 国产麻豆精品一区二区三区v视界 | 日本丰满熟妇videos | 国产疯狂伦交大片 | 无码人妻精品一区二区三区下载 | 亚洲人成网站色7799 | 国产亚洲精品久久久久久国模美 | 东北女人啪啪对白 | 7777奇米四色成人眼影 | 中文字幕无码av波多野吉衣 | 麻豆国产人妻欲求不满 | 国产情侣作爱视频免费观看 | 国内精品一区二区三区不卡 | 天天爽夜夜爽夜夜爽 | 欧美成人免费全部网站 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 又大又紧又粉嫩18p少妇 | 色一情一乱一伦一视频免费看 | 女人被男人躁得好爽免费视频 | 人妻尝试又大又粗久久 | 亚洲国产精华液网站w | 青春草在线视频免费观看 | 亚洲午夜无码久久 | 亚洲啪av永久无码精品放毛片 | 欧美成人家庭影院 | 人妻插b视频一区二区三区 | 午夜精品久久久久久久久 | 精品水蜜桃久久久久久久 | 欧美日韩在线亚洲综合国产人 | 欧美日韩亚洲国产精品 | 欧美日韩一区二区三区自拍 | 天天摸天天透天天添 | 性欧美videos高清精品 | 亚洲精品一区三区三区在线观看 | 亚洲人成网站色7799 | 亚洲中文字幕乱码av波多ji | 国产国语老龄妇女a片 | 欧美xxxx黑人又粗又长 | 中文字幕无码日韩欧毛 | 色一情一乱一伦一区二区三欧美 | 无码国产色欲xxxxx视频 | 2020久久超碰国产精品最新 | 国产免费观看黄av片 | 色老头在线一区二区三区 | 动漫av网站免费观看 | 国产无遮挡吃胸膜奶免费看 | 国产色在线 | 国产 | 亚洲国产高清在线观看视频 | 国内丰满熟女出轨videos | av在线亚洲欧洲日产一区二区 | 5858s亚洲色大成网站www | 丝袜足控一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产成人精品视频ⅴa片软件竹菊 | 国产成人无码区免费内射一片色欲 | 精品国产国产综合精品 | 国产va免费精品观看 | 亚洲区欧美区综合区自拍区 | 人妻aⅴ无码一区二区三区 | 久久综合激激的五月天 | 日韩精品一区二区av在线 | 久久久久se色偷偷亚洲精品av | www国产亚洲精品久久久日本 | 国产在线aaa片一区二区99 | 日本一区二区三区免费播放 | 久久久www成人免费毛片 | 性色欲情网站iwww九文堂 | 亚洲一区二区三区国产精华液 | av无码不卡在线观看免费 | 动漫av一区二区在线观看 | 三上悠亚人妻中文字幕在线 | 国内精品久久毛片一区二区 | 日韩av激情在线观看 | 对白脏话肉麻粗话av | 国产亚洲欧美日韩亚洲中文色 | 亚洲精品一区二区三区在线 | 久久精品国产日本波多野结衣 | 亚洲の无码国产の无码步美 | 欧美肥老太牲交大战 | 97夜夜澡人人爽人人喊中国片 | 亚洲国产av精品一区二区蜜芽 | 国产在线一区二区三区四区五区 | 欧美自拍另类欧美综合图片区 | 特黄特色大片免费播放器图片 | 久久久久久久人妻无码中文字幕爆 | 国产精品人人妻人人爽 | 少妇厨房愉情理9仑片视频 | 精品国产一区二区三区四区在线看 | 欧美日韩在线亚洲综合国产人 | 欧美亚洲日韩国产人成在线播放 | 无码av中文字幕免费放 | 国産精品久久久久久久 | 国内少妇偷人精品视频免费 | 国产精品99爱免费视频 | 国产精品无码成人午夜电影 | 亚洲自偷自拍另类第1页 | 一区二区传媒有限公司 | 狂野欧美激情性xxxx | 无码人妻出轨黑人中文字幕 | 九九久久精品国产免费看小说 | 激情亚洲一区国产精品 | 日韩人妻少妇一区二区三区 | 任你躁在线精品免费 | 国产农村乱对白刺激视频 | 色欲综合久久中文字幕网 | 精品偷自拍另类在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 无码成人精品区在线观看 | 国产九九九九九九九a片 | 国产三级精品三级男人的天堂 | 国产精品久久久 | 国产精品永久免费视频 | 亚洲成av人在线观看网址 | 亚洲 另类 在线 欧美 制服 | 日本丰满熟妇videos | 东京热男人av天堂 | 人妻少妇精品视频专区 | 色老头在线一区二区三区 | 久久国产精品_国产精品 | 国产性生大片免费观看性 | 久久精品人妻少妇一区二区三区 | 色综合久久中文娱乐网 | 欧美成人高清在线播放 | 国精产品一品二品国精品69xx | 日韩人妻系列无码专区 | 日本成熟视频免费视频 | 东京一本一道一二三区 | 夜精品a片一区二区三区无码白浆 | 亚洲熟悉妇女xxx妇女av | 国产av剧情md精品麻豆 | 熟女少妇在线视频播放 | 野外少妇愉情中文字幕 | 亚洲综合无码一区二区三区 | 国产在线无码精品电影网 | 成在人线av无码免观看麻豆 | 性色欲网站人妻丰满中文久久不卡 | 骚片av蜜桃精品一区 | 国产成人无码a区在线观看视频app | 日韩人妻系列无码专区 | 熟妇激情内射com | 久久久久成人片免费观看蜜芽 | 久久精品国产一区二区三区肥胖 | 久久久久久av无码免费看大片 | 宝宝好涨水快流出来免费视频 | 亚洲国产精品成人久久蜜臀 | 国产精品鲁鲁鲁 | 久久午夜无码鲁丝片 | 日本大乳高潮视频在线观看 | 亚洲成a人片在线观看无码 | 美女毛片一区二区三区四区 | 亚洲s色大片在线观看 | 日本肉体xxxx裸交 | 国产精品久久久久影院嫩草 | 欧美日韩久久久精品a片 | 欧美人与牲动交xxxx | 精品一区二区三区无码免费视频 | 两性色午夜免费视频 | 国产va免费精品观看 | 国产成人精品优优av | 久久久婷婷五月亚洲97号色 | 亚洲 激情 小说 另类 欧美 | 永久黄网站色视频免费直播 | 久激情内射婷内射蜜桃人妖 | 中文字幕精品av一区二区五区 | 人人妻人人澡人人爽人人精品浪潮 | 夜夜影院未满十八勿进 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲国产av美女网站 | 免费国产黄网站在线观看 | 免费无码午夜福利片69 | 亚洲精品一区三区三区在线观看 | 成年女人永久免费看片 | 少妇性l交大片欧洲热妇乱xxx | 亚洲国产综合无码一区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 在线精品国产一区二区三区 | 性生交大片免费看女人按摩摩 | 久久久婷婷五月亚洲97号色 | 无码av最新清无码专区吞精 | 强伦人妻一区二区三区视频18 | 久久亚洲国产成人精品性色 | 色欲人妻aaaaaaa无码 | 国产无套内射久久久国产 | 水蜜桃av无码 | 国内少妇偷人精品视频免费 | 中文字幕乱妇无码av在线 | 国产va免费精品观看 | 精品乱码久久久久久久 | 性欧美大战久久久久久久 | 少妇被黑人到高潮喷出白浆 | 精品一区二区三区波多野结衣 | 青青青爽视频在线观看 | 青青青手机频在线观看 | 成人精品一区二区三区中文字幕 | 色爱情人网站 | 亚洲色在线无码国产精品不卡 | 国产莉萝无码av在线播放 | 国产午夜亚洲精品不卡 | 久久久久av无码免费网 | 国产亚洲人成a在线v网站 | 性啪啪chinese东北女人 | 日韩少妇白浆无码系列 | 久久久中文久久久无码 | 欧美日本精品一区二区三区 | 4hu四虎永久在线观看 | www一区二区www免费 | 人人妻人人澡人人爽欧美精品 | www国产亚洲精品久久久日本 | 激情爆乳一区二区三区 | 精品偷拍一区二区三区在线看 | 免费无码av一区二区 | 精品国精品国产自在久国产87 | 精品无码一区二区三区的天堂 | 日韩精品无码一区二区中文字幕 | 成人无码影片精品久久久 | 国产亚洲tv在线观看 | 人妻无码αv中文字幕久久琪琪布 | 牛和人交xxxx欧美 | 人妻天天爽夜夜爽一区二区 | 在线观看免费人成视频 | 国产精品高潮呻吟av久久4虎 | 亚洲人亚洲人成电影网站色 | 中文字幕无码免费久久99 | 国内精品人妻无码久久久影院 | 国产亚洲精品久久久久久大师 | 久久综合九色综合97网 | 国产女主播喷水视频在线观看 | 99久久久无码国产精品免费 | 国产精品美女久久久久av爽李琼 | 熟女少妇人妻中文字幕 | 欧美野外疯狂做受xxxx高潮 | 日日夜夜撸啊撸 | 国产乱子伦视频在线播放 | 亚洲精品久久久久avwww潮水 | 色婷婷综合激情综在线播放 | 丰满少妇熟乱xxxxx视频 | 熟女俱乐部五十路六十路av | 国产精品第一国产精品 | 一本加勒比波多野结衣 | 波多野结衣av在线观看 | 中文字幕人妻丝袜二区 | 成人欧美一区二区三区黑人免费 | 婷婷六月久久综合丁香 | av人摸人人人澡人人超碰下载 | 亚洲性无码av中文字幕 | 领导边摸边吃奶边做爽在线观看 | 亚洲综合无码久久精品综合 | 久久久久成人精品免费播放动漫 | 亚洲乱码国产乱码精品精 | 婷婷六月久久综合丁香 | 免费观看的无遮挡av | 蜜桃视频插满18在线观看 | 国产97人人超碰caoprom | 性欧美疯狂xxxxbbbb | av人摸人人人澡人人超碰下载 | 水蜜桃亚洲一二三四在线 | 亚洲精品一区二区三区在线 | 国产精品手机免费 | 亚洲精品成a人在线观看 | 妺妺窝人体色www婷婷 | 又大又紧又粉嫩18p少妇 | 久激情内射婷内射蜜桃人妖 | 激情亚洲一区国产精品 | 亚洲中文字幕av在天堂 | 欧美老熟妇乱xxxxx | 亚洲一区二区三区四区 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品日本一区二区三区在线观看 | 鲁大师影院在线观看 | 综合激情五月综合激情五月激情1 | 成 人 免费观看网站 | 中文久久乱码一区二区 | 日产精品99久久久久久 | 国产另类ts人妖一区二区 | 天堂亚洲免费视频 | 成熟人妻av无码专区 | 欧美老人巨大xxxx做受 | 国产成人久久精品流白浆 | 欧美35页视频在线观看 | 3d动漫精品啪啪一区二区中 | 亚洲а∨天堂久久精品2021 | 国产熟妇高潮叫床视频播放 | 男女作爱免费网站 | 又大又黄又粗又爽的免费视频 | 男人扒开女人内裤强吻桶进去 | 久久久久久久人妻无码中文字幕爆 | 影音先锋中文字幕无码 | 久久精品无码一区二区三区 | 日本xxxx色视频在线观看免费 | 久久五月精品中文字幕 | 国产日产欧产精品精品app | a在线亚洲男人的天堂 | 人人妻人人澡人人爽精品欧美 | 国产精品亚洲五月天高清 | 亚洲区小说区激情区图片区 | 麻豆av传媒蜜桃天美传媒 | 妺妺窝人体色www在线小说 | 国产成人无码午夜视频在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 无遮挡国产高潮视频免费观看 | 国产美女极度色诱视频www | 午夜丰满少妇性开放视频 | 任你躁在线精品免费 | 四虎4hu永久免费 | 18精品久久久无码午夜福利 | 亚洲欧美国产精品专区久久 | 亚洲国产精品无码久久久久高潮 | 在线a亚洲视频播放在线观看 | 99久久亚洲精品无码毛片 | 特级做a爰片毛片免费69 | 激情五月综合色婷婷一区二区 | 欧美一区二区三区视频在线观看 | 国内精品人妻无码久久久影院 | 亚洲精品中文字幕久久久久 | 国产精品亚洲五月天高清 | 国产女主播喷水视频在线观看 | 九月婷婷人人澡人人添人人爽 | 人人澡人人透人人爽 | 无码人妻精品一区二区三区下载 | 色欲av亚洲一区无码少妇 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成人免费视频一区二区 | 日本一本二本三区免费 | 国产av一区二区精品久久凹凸 | 天堂无码人妻精品一区二区三区 | 西西人体www44rt大胆高清 | 国产97人人超碰caoprom | 福利一区二区三区视频在线观看 | 亚洲色欲色欲天天天www | 夜夜夜高潮夜夜爽夜夜爰爰 | 精品无码国产一区二区三区av | 老司机亚洲精品影院无码 | 久久精品国产99久久6动漫 | 青草视频在线播放 | 天下第一社区视频www日本 | 欧美老人巨大xxxx做受 | 久久久久成人精品免费播放动漫 | 国产免费久久精品国产传媒 | 日韩欧美中文字幕在线三区 | 窝窝午夜理论片影院 | 欧美喷潮久久久xxxxx | 国产艳妇av在线观看果冻传媒 | av在线亚洲欧洲日产一区二区 | 欧美一区二区三区 | 无遮挡国产高潮视频免费观看 | 国产精品亚洲五月天高清 | 色情久久久av熟女人妻网站 | 综合人妻久久一区二区精品 | 亚洲精品久久久久中文第一幕 | a在线观看免费网站大全 | 亚洲精品一区国产 | 欧美野外疯狂做受xxxx高潮 | 国产亚洲精品精品国产亚洲综合 | 国产乱人伦偷精品视频 | 国产人妻久久精品二区三区老狼 | 四虎国产精品一区二区 | 成人一在线视频日韩国产 | 日本又色又爽又黄的a片18禁 | 中文字幕无码免费久久9一区9 | 奇米影视7777久久精品 | 国产做国产爱免费视频 | 国产极品美女高潮无套在线观看 | 国产精品无码成人午夜电影 | 亚洲一区二区三区香蕉 | 国模大胆一区二区三区 | 亚洲另类伦春色综合小说 | 无码人妻丰满熟妇区毛片18 | 亚洲人成网站在线播放942 | 精品国产一区二区三区四区在线看 | 欧美丰满老熟妇xxxxx性 | 日韩精品无码免费一区二区三区 | 国产精品美女久久久网av | 午夜无码区在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 日本爽爽爽爽爽爽在线观看免 | 国产精品久免费的黄网站 | 国产精品第一区揄拍无码 | 精品久久久无码人妻字幂 | 熟女少妇在线视频播放 | 一本色道久久综合亚洲精品不卡 | 久久久久久久人妻无码中文字幕爆 | 国产人妖乱国产精品人妖 | 99精品国产综合久久久久五月天 | 丰满少妇弄高潮了www | 乌克兰少妇xxxx做受 | 国内精品九九久久久精品 | 中文字幕日韩精品一区二区三区 | 亚洲人成人无码网www国产 | 欧美日韩色另类综合 | 国产在线aaa片一区二区99 | 兔费看少妇性l交大片免费 | 国产成人无码午夜视频在线观看 | 一本色道久久综合亚洲精品不卡 | 亚洲码国产精品高潮在线 | 亚洲成av人片在线观看无码不卡 | 精品午夜福利在线观看 | 激情内射亚州一区二区三区爱妻 | 亚洲男女内射在线播放 | 久久综合网欧美色妞网 | 国产精品国产自线拍免费软件 | 国产无遮挡又黄又爽免费视频 | 麻豆国产丝袜白领秘书在线观看 | 在线 国产 欧美 亚洲 天堂 | 久久精品人人做人人综合试看 | 国产成人无码av在线影院 | 亚洲大尺度无码无码专区 | 131美女爱做视频 | 三级4级全黄60分钟 | 国产精品无码一区二区桃花视频 | 国内精品九九久久久精品 | 高潮毛片无遮挡高清免费视频 | 久久97精品久久久久久久不卡 | 免费无码午夜福利片69 | 97色伦图片97综合影院 | 欧美黑人性暴力猛交喷水 | 亚洲区小说区激情区图片区 | 成人一区二区免费视频 | 国产99久久精品一区二区 | 在线观看国产一区二区三区 | 少妇被黑人到高潮喷出白浆 | 国产精品亚洲一区二区三区喷水 | 亚洲va中文字幕无码久久不卡 | 中文字幕人妻无码一夲道 | 亚洲aⅴ无码成人网站国产app | 国产免费无码一区二区视频 | 国产av久久久久精东av | 麻豆果冻传媒2021精品传媒一区下载 | 国产人妖乱国产精品人妖 | 午夜熟女插插xx免费视频 | 国产凸凹视频一区二区 | 国产精品香蕉在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲男女内射在线播放 | 欧美真人作爱免费视频 | 中文无码成人免费视频在线观看 | 色五月丁香五月综合五月 | 久久国产精品_国产精品 | 无码人妻少妇伦在线电影 | 精品无码一区二区三区爱欲 | 成人无码精品1区2区3区免费看 | 久久人人爽人人爽人人片ⅴ | 国产手机在线αⅴ片无码观看 | 国产亚洲日韩欧美另类第八页 | aa片在线观看视频在线播放 | 亚洲中文字幕无码一久久区 | 亚洲成av人片在线观看无码不卡 | √8天堂资源地址中文在线 | 特级做a爰片毛片免费69 | 丰满少妇女裸体bbw | 亚洲国产精品一区二区第一页 | 中文字幕av伊人av无码av | 少妇被黑人到高潮喷出白浆 | 国产精品沙发午睡系列 | 国产欧美熟妇另类久久久 | 一本色道久久综合狠狠躁 | 亚洲色大成网站www国产 | 欧美日韩久久久精品a片 | 无码福利日韩神码福利片 | 我要看www免费看插插视频 | 亚洲精品一区二区三区婷婷月 | 少妇高潮喷潮久久久影院 | 国产免费无码一区二区视频 | 亚欧洲精品在线视频免费观看 | 99久久99久久免费精品蜜桃 | 国语自产偷拍精品视频偷 | 丰满护士巨好爽好大乳 | www成人国产高清内射 | 亚洲欧洲中文日韩av乱码 | 欧美日韩一区二区综合 | 国产免费久久久久久无码 | 日本熟妇浓毛 | 精品无码一区二区三区爱欲 | 国产在线一区二区三区四区五区 | 大肉大捧一进一出好爽视频 | 国产精品无码久久av | 日本免费一区二区三区最新 | 正在播放东北夫妻内射 | 无套内射视频囯产 | 伊人久久大香线蕉午夜 | 人人妻在人人 | 欧美成人家庭影院 | 亚洲熟悉妇女xxx妇女av | 精品久久综合1区2区3区激情 | 日本xxxx色视频在线观看免费 | 久久久久亚洲精品男人的天堂 | 国产熟妇另类久久久久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 性色欲网站人妻丰满中文久久不卡 | 国产亚洲欧美日韩亚洲中文色 | 精品水蜜桃久久久久久久 | 成人综合网亚洲伊人 | 四虎国产精品免费久久 | 日韩欧美中文字幕在线三区 | 51国偷自产一区二区三区 | 色婷婷香蕉在线一区二区 | 九一九色国产 | 1000部夫妻午夜免费 | 4hu四虎永久在线观看 | 人妻体内射精一区二区三四 | 欧美成人午夜精品久久久 | 欧美激情综合亚洲一二区 | 亚洲人成影院在线观看 | 特大黑人娇小亚洲女 | 大屁股大乳丰满人妻 | 欧美日韩综合一区二区三区 | 成人亚洲精品久久久久软件 | 亚洲熟妇色xxxxx欧美老妇y | 正在播放东北夫妻内射 | 亚洲性无码av中文字幕 | 久久99精品国产麻豆蜜芽 | 亚洲日本一区二区三区在线 | 亚洲熟熟妇xxxx | 人妻夜夜爽天天爽三区 | 欧美亚洲日韩国产人成在线播放 | 久久综合久久自在自线精品自 | 国产熟妇高潮叫床视频播放 | 天天拍夜夜添久久精品大 | 国产农村乱对白刺激视频 | 天天综合网天天综合色 | 男人扒开女人内裤强吻桶进去 | 国产在线精品一区二区三区直播 | 亚洲精品久久久久久久久久久 | 国产精品沙发午睡系列 | 国产精品二区一区二区aⅴ污介绍 | 久久久久成人精品免费播放动漫 | 鲁大师影院在线观看 | 国产精品va在线观看无码 | 国产成人精品无码播放 | 天天躁日日躁狠狠躁免费麻豆 | 东京一本一道一二三区 | 久久国产精品_国产精品 | 亚洲欧美日韩综合久久久 | 午夜精品一区二区三区在线观看 | 国产精品久久国产精品99 | 天天综合网天天综合色 | 男人的天堂2018无码 | 爱做久久久久久 | 亚洲熟悉妇女xxx妇女av | 国产精品久久国产精品99 | 精品欧洲av无码一区二区三区 | 六月丁香婷婷色狠狠久久 | 中文亚洲成a人片在线观看 | 巨爆乳无码视频在线观看 | 亚洲一区二区三区无码久久 | 天堂а√在线地址中文在线 | 国产疯狂伦交大片 | 亚洲高清偷拍一区二区三区 | 亚洲国产精品一区二区美利坚 | 欧美精品国产综合久久 | 精品少妇爆乳无码av无码专区 | 成人三级无码视频在线观看 | 国产乱人无码伦av在线a | 亚洲区欧美区综合区自拍区 | 亚洲色偷偷男人的天堂 | 国产综合久久久久鬼色 | 97久久超碰中文字幕 | 水蜜桃色314在线观看 | 精品国产一区二区三区四区在线看 | 久久久久久久女国产乱让韩 | 日韩成人一区二区三区在线观看 | 久久久中文字幕日本无吗 | 久久久久亚洲精品中文字幕 | 国产片av国语在线观看 | 18精品久久久无码午夜福利 | 国产精品丝袜黑色高跟鞋 | 国产美女精品一区二区三区 | 无码国产乱人伦偷精品视频 | 人妻少妇精品无码专区二区 | 亚洲欧美精品伊人久久 | 无套内谢的新婚少妇国语播放 | 国产黄在线观看免费观看不卡 | 国产猛烈高潮尖叫视频免费 | 全黄性性激高免费视频 | 中文亚洲成a人片在线观看 | 中文字幕乱码人妻二区三区 | 欧美zoozzooz性欧美 | 亚洲国产精品一区二区美利坚 | 国产一区二区三区四区五区加勒比 | 国产麻豆精品精东影业av网站 | 性做久久久久久久久 | 欧美日本精品一区二区三区 | 少妇无套内谢久久久久 | 久久亚洲中文字幕精品一区 | 亚洲国产精品一区二区第一页 | 成人试看120秒体验区 | 亚洲呦女专区 | 国产偷抇久久精品a片69 | 久久亚洲精品中文字幕无男同 | 日本在线高清不卡免费播放 | 精品无人国产偷自产在线 | 国产精品久久久久久久9999 | 国内揄拍国内精品人妻 | 日韩精品无码免费一区二区三区 | 性欧美videos高清精品 | 人人澡人摸人人添 | 在线观看欧美一区二区三区 | 伊人久久大香线蕉av一区二区 | 在线观看欧美一区二区三区 | 最新国产乱人伦偷精品免费网站 | 免费看男女做好爽好硬视频 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 永久免费精品精品永久-夜色 | 国产97人人超碰caoprom | 中文字幕无码日韩欧毛 | 双乳奶水饱满少妇呻吟 | 无码人中文字幕 | 久久 国产 尿 小便 嘘嘘 | 国产成人综合在线女婷五月99播放 | 黄网在线观看免费网站 | 高潮毛片无遮挡高清免费视频 | 久久国产精品二国产精品 | 国产精品a成v人在线播放 | 亚洲乱码国产乱码精品精 | 国产美女极度色诱视频www | 亚洲人成无码网www | 无码人妻丰满熟妇区五十路百度 | 亚洲中文字幕无码中文字在线 | 国产热a欧美热a在线视频 | 精品国产一区二区三区四区 | av无码不卡在线观看免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 无码人妻精品一区二区三区不卡 | 婷婷综合久久中文字幕蜜桃三电影 | 色一情一乱一伦一区二区三欧美 | 九九久久精品国产免费看小说 | 国内丰满熟女出轨videos | 精品久久久久久亚洲精品 | 亚洲色偷偷男人的天堂 | 永久免费观看美女裸体的网站 | 亚洲精品久久久久久久久久久 | 亚洲精品一区二区三区四区五区 | 成人三级无码视频在线观看 | 国产农村妇女高潮大叫 | 伊人久久大香线焦av综合影院 | 国产色xx群视频射精 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品国产自线拍免费软件 | 99久久久无码国产精品免费 | 蜜臀av无码人妻精品 | 久久无码人妻影院 | 亚洲精品无码国产 | 国产亚洲美女精品久久久2020 | 欧洲熟妇精品视频 | 久久综合色之久久综合 | 久久99精品久久久久婷婷 | 西西人体www44rt大胆高清 | 天天做天天爱天天爽综合网 | 久久综合网欧美色妞网 | 无遮无挡爽爽免费视频 | 丰满少妇高潮惨叫视频 | 国产成人无码av在线影院 | 亚洲人成无码网www | 亚洲精品久久久久中文第一幕 | 人妻无码αv中文字幕久久琪琪布 | 日韩精品a片一区二区三区妖精 | 久久久久国色av免费观看性色 | 国产一区二区三区日韩精品 | 国产午夜精品一区二区三区嫩草 | 中文无码成人免费视频在线观看 | 国产精品久久久午夜夜伦鲁鲁 | 国产小呦泬泬99精品 | 日韩av无码一区二区三区不卡 | 免费看少妇作爱视频 | 99久久精品午夜一区二区 | 久久亚洲精品中文字幕无男同 | 乌克兰少妇性做爰 | 久久99国产综合精品 | 熟妇人妻激情偷爽文 | 日本一区二区更新不卡 | 国产偷自视频区视频 | 国产亲子乱弄免费视频 | 亚洲精品国偷拍自产在线麻豆 | 清纯唯美经典一区二区 | 亚洲区小说区激情区图片区 | 大肉大捧一进一出好爽视频 | 久久97精品久久久久久久不卡 | 亚洲aⅴ无码成人网站国产app | 欧美国产亚洲日韩在线二区 | 亚洲一区二区三区偷拍女厕 | 欧洲熟妇色 欧美 | 初尝人妻少妇中文字幕 | 国产精品对白交换视频 | 日韩精品成人一区二区三区 | 亚洲国产精品一区二区美利坚 | 亚洲日韩一区二区 | 精品久久久无码中文字幕 | 精品一区二区三区波多野结衣 | 狠狠色色综合网站 | 久激情内射婷内射蜜桃人妖 | 亚洲色欲久久久综合网东京热 | 国产成人精品无码播放 | 女高中生第一次破苞av | 亚洲日韩av片在线观看 | 亚洲娇小与黑人巨大交 | 麻豆果冻传媒2021精品传媒一区下载 | 日韩精品久久久肉伦网站 | 人人妻人人澡人人爽欧美一区九九 | 日韩亚洲欧美精品综合 | 日韩少妇内射免费播放 | 亚洲色成人中文字幕网站 | 国产69精品久久久久app下载 | 正在播放东北夫妻内射 | 成人女人看片免费视频放人 | 少妇厨房愉情理9仑片视频 | 国产成人精品必看 | 成人免费视频视频在线观看 免费 | 日韩精品无码免费一区二区三区 | 国产激情无码一区二区app | 无遮挡啪啪摇乳动态图 | 成年女人永久免费看片 | 无码人妻精品一区二区三区不卡 | 色婷婷av一区二区三区之红樱桃 | 亚洲色www成人永久网址 | 丰满少妇女裸体bbw | 欧美三级不卡在线观看 | 最近免费中文字幕中文高清百度 | 免费无码的av片在线观看 | 天天摸天天碰天天添 | 成人亚洲精品久久久久 | 色综合久久久久综合一本到桃花网 | 乌克兰少妇性做爰 | 在教室伦流澡到高潮hnp视频 | 老熟女重囗味hdxx69 | 国产精品久久久久影院嫩草 | 高清无码午夜福利视频 | 欧美老妇交乱视频在线观看 | 成人试看120秒体验区 | 国产综合在线观看 | 亚洲欧洲无卡二区视頻 | 国内精品人妻无码久久久影院蜜桃 | 亚洲日韩一区二区三区 | 欧美丰满老熟妇xxxxx性 | 亚洲成a人片在线观看无码3d | 无码人妻久久一区二区三区不卡 | 动漫av一区二区在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 色爱情人网站 | 99精品无人区乱码1区2区3区 | 中文字幕av无码一区二区三区电影 | 巨爆乳无码视频在线观看 | 亚洲欧美日韩国产精品一区二区 | 伊人色综合久久天天小片 | 国产明星裸体无码xxxx视频 | 狠狠色丁香久久婷婷综合五月 | 久久久久se色偷偷亚洲精品av | 亚洲国产精品毛片av不卡在线 | 日产精品高潮呻吟av久久 | 欧美性生交xxxxx久久久 | 无人区乱码一区二区三区 | 国产精品久免费的黄网站 | 精品久久综合1区2区3区激情 | 久久综合九色综合欧美狠狠 | 亚洲精品一区二区三区婷婷月 | 亚洲男女内射在线播放 | 亚洲欧洲日本综合aⅴ在线 | 国产内射爽爽大片视频社区在线 | 久久国产精品偷任你爽任你 | 成人欧美一区二区三区黑人免费 | 300部国产真实乱 | 亚洲精品中文字幕久久久久 | 国产精品99爱免费视频 | 亚洲日韩av一区二区三区中文 | 大肉大捧一进一出视频出来呀 | 色综合天天综合狠狠爱 | 日日天干夜夜狠狠爱 | 2019午夜福利不卡片在线 | 久久久婷婷五月亚洲97号色 | 久久综合网欧美色妞网 | 国产亚洲精品久久久久久久久动漫 | 亚洲一区二区三区国产精华液 | 中文字幕人妻无码一夲道 | 国产电影无码午夜在线播放 | 成年美女黄网站色大免费视频 | 久久久久久国产精品无码下载 | 激情国产av做激情国产爱 | www成人国产高清内射 | 国产精品99爱免费视频 | 天天av天天av天天透 | 人妻aⅴ无码一区二区三区 | 内射后入在线观看一区 | av人摸人人人澡人人超碰下载 | 大肉大捧一进一出视频出来呀 | 国产97在线 | 亚洲 | 黑人粗大猛烈进出高潮视频 | 中文字幕av伊人av无码av | 国产成人精品久久亚洲高清不卡 | 亚洲国产成人av在线观看 | 国内老熟妇对白xxxxhd | 国产福利视频一区二区 | 久久成人a毛片免费观看网站 | 亚洲欧美精品伊人久久 | 午夜精品一区二区三区在线观看 | 国产精华av午夜在线观看 | 亲嘴扒胸摸屁股激烈网站 | 亚洲娇小与黑人巨大交 | 少妇无码一区二区二三区 | 亚洲国产欧美在线成人 | 老头边吃奶边弄进去呻吟 | 一本久道久久综合狠狠爱 | 国产sm调教视频在线观看 | 国产成人无码av一区二区 | 大地资源中文第3页 | 人人妻人人澡人人爽欧美精品 | 51国偷自产一区二区三区 | 亚洲国产成人a精品不卡在线 | 亚洲无人区午夜福利码高清完整版 | 国产色精品久久人妻 | 国内精品人妻无码久久久影院蜜桃 | 亚洲国精产品一二二线 | 亚洲国产精品久久久久久 | 国产两女互慰高潮视频在线观看 | 国产乱子伦视频在线播放 | 亚洲人成网站在线播放942 | 一区二区三区乱码在线 | 欧洲 | 亚洲国产av美女网站 | 噜噜噜亚洲色成人网站 | 福利一区二区三区视频在线观看 | 乱码午夜-极国产极内射 | 日本欧美一区二区三区乱码 | 久久人人爽人人爽人人片av高清 | 奇米影视7777久久精品人人爽 | 日韩精品无码一区二区中文字幕 | 亚洲中文字幕无码一久久区 | 搡女人真爽免费视频大全 | 亚洲自偷精品视频自拍 | 久久亚洲国产成人精品性色 | 狂野欧美激情性xxxx | 天天摸天天透天天添 | 偷窥日本少妇撒尿chinese | 国产麻豆精品一区二区三区v视界 | 黄网在线观看免费网站 | 久久精品国产精品国产精品污 | 网友自拍区视频精品 | 中文字幕乱码人妻无码久久 | 99久久亚洲精品无码毛片 | 四虎永久在线精品免费网址 | 天堂久久天堂av色综合 | 伊人色综合久久天天小片 | 成人欧美一区二区三区黑人免费 | 高潮毛片无遮挡高清免费视频 | 国产婷婷色一区二区三区在线 | 免费乱码人妻系列无码专区 | 中文字幕乱码中文乱码51精品 | 国模大胆一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久久国产一区二区三区 | 国内综合精品午夜久久资源 | 成在人线av无码免费 | 丰满妇女强制高潮18xxxx | 最近的中文字幕在线看视频 | 大肉大捧一进一出视频出来呀 | 国产精品成人av在线观看 | 亚洲无人区一区二区三区 | 美女极度色诱视频国产 | 麻花豆传媒剧国产免费mv在线 | 日本一区二区三区免费高清 | 色五月五月丁香亚洲综合网 | 国产猛烈高潮尖叫视频免费 | 色综合久久88色综合天天 | 性欧美videos高清精品 | 蜜桃av抽搐高潮一区二区 | 无码av中文字幕免费放 | 亚拍精品一区二区三区探花 | 奇米影视7777久久精品人人爽 | 国产精品久久久久久亚洲影视内衣 | 亚洲国产精品一区二区美利坚 | 国产精品国产自线拍免费软件 | 国产av一区二区精品久久凹凸 | 国产亚洲精品久久久久久久久动漫 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲高清偷拍一区二区三区 | 黑人粗大猛烈进出高潮视频 | 最近中文2019字幕第二页 | 日本护士毛茸茸高潮 | 久久久久se色偷偷亚洲精品av | 天天躁日日躁狠狠躁免费麻豆 | 1000部啪啪未满十八勿入下载 | 久久精品国产精品国产精品污 | 亚洲色大成网站www | 奇米影视7777久久精品人人爽 | 狂野欧美性猛xxxx乱大交 | 久久精品国产一区二区三区 | 99精品国产综合久久久久五月天 | 男女超爽视频免费播放 | 久久久久人妻一区精品色欧美 | 亚洲va欧美va天堂v国产综合 | 美女扒开屁股让男人桶 | 麻豆国产人妻欲求不满谁演的 | 国产精品亚洲五月天高清 | 亚洲天堂2017无码中文 | 国产人妻精品一区二区三区 | 色综合天天综合狠狠爱 | 色综合久久88色综合天天 | 久久99精品久久久久婷婷 | 国产精品美女久久久 | 国产精品无码永久免费888 | 亚洲色欲色欲欲www在线 | 亚洲精品午夜国产va久久成人 | 成年美女黄网站色大免费全看 | 无遮挡啪啪摇乳动态图 | 久久www免费人成人片 | 国产小呦泬泬99精品 | 无码人妻久久一区二区三区不卡 | 亚洲综合色区中文字幕 | 波多野42部无码喷潮在线 | 欧美日韩一区二区免费视频 | 无人区乱码一区二区三区 | 久在线观看福利视频 | 日本熟妇乱子伦xxxx | 日本一区二区三区免费播放 | 亚洲人成影院在线无码按摩店 | 婷婷五月综合激情中文字幕 | 亚洲色欲色欲天天天www | 最近免费中文字幕中文高清百度 | 国语精品一区二区三区 | 久久综合狠狠综合久久综合88 | 欧美zoozzooz性欧美 | 3d动漫精品啪啪一区二区中 | 亚洲欧美精品伊人久久 | 日本大香伊一区二区三区 | 国产办公室秘书无码精品99 | 久久久久免费看成人影片 | 中文久久乱码一区二区 | 精品国产aⅴ无码一区二区 | 天天摸天天碰天天添 | 人妻少妇精品视频专区 | 亚洲国产欧美在线成人 | 全黄性性激高免费视频 | 天干天干啦夜天干天2017 | 精品久久久无码人妻字幂 | 久久www免费人成人片 | 一本久道久久综合婷婷五月 | 无码国产激情在线观看 | 综合激情五月综合激情五月激情1 | 真人与拘做受免费视频 | 自拍偷自拍亚洲精品10p | 中文字幕乱码人妻二区三区 | 少妇一晚三次一区二区三区 | 一本大道伊人av久久综合 | 欧美性黑人极品hd | 日日摸日日碰夜夜爽av | 成人女人看片免费视频放人 | 亚洲精品无码人妻无码 | 精品国产一区二区三区av 性色 | 免费人成网站视频在线观看 | 丁香啪啪综合成人亚洲 | 亚洲色大成网站www国产 | 人妻有码中文字幕在线 | 精品国产精品久久一区免费式 | 亚洲а∨天堂久久精品2021 | 国产精品99爱免费视频 | 麻豆国产人妻欲求不满谁演的 | 日韩精品无码一本二本三本色 | 亚洲欧美精品aaaaaa片 | 中国女人内谢69xxxxxa片 | а√资源新版在线天堂 | 国产深夜福利视频在线 | 丰满人妻翻云覆雨呻吟视频 | 九九综合va免费看 | 亚洲小说春色综合另类 | 永久免费精品精品永久-夜色 | 亚洲人交乣女bbw | 99久久人妻精品免费二区 | 青青草原综合久久大伊人精品 | 爽爽影院免费观看 | 无套内谢老熟女 | 国产欧美亚洲精品a | 影音先锋中文字幕无码 | 亚洲区欧美区综合区自拍区 | 成人无码精品一区二区三区 | 色情久久久av熟女人妻网站 | 2020久久超碰国产精品最新 | 精品偷拍一区二区三区在线看 | 人妻互换免费中文字幕 | 人人爽人人澡人人高潮 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲精品国产精品乱码视色 | 无码国产激情在线观看 | 国产精品久久久av久久久 | 熟妇激情内射com | 色婷婷综合激情综在线播放 | 亚洲小说春色综合另类 | 天天躁夜夜躁狠狠是什么心态 | 无码成人精品区在线观看 | 蜜桃臀无码内射一区二区三区 | 国产成人无码一二三区视频 | 国产精品久久福利网站 | 亚洲综合无码一区二区三区 | 人妻天天爽夜夜爽一区二区 | 国产精品亚洲а∨无码播放麻豆 | 纯爱无遮挡h肉动漫在线播放 | 天天摸天天透天天添 | 少妇邻居内射在线 | 精品成在人线av无码免费看 |