日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis学习笔记,常用方法

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis学习笔记,常用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis-day01-note

Redis介紹

  • 特點及優點
1、開源的,使用C編寫,基于內存且支持持久化 2、高性能的Key-Value的NoSQL數據庫 3、支持數據類型豐富,字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets 等 4、支持多種編程語言(C C++ Python Java PHP ...
  • 與其他數據庫對比
1、MySQL : 關系型數據庫,表格,基于磁盤,慢 2、MongoDB:鍵值對文檔型數據庫,值為JSON文檔,基于磁盤,慢,存儲數據類型單一 3、Redis的誕生是為了解決什么問題??# 解決硬盤IO帶來的性能瓶頸
  • 應用場景
1、使用Redis來緩存一些經常被用到、或者需要耗費大量資源的內容,通過這些內容放到redis里面,程序可以快速讀取這些內容 2、一個網站,如果某個頁面經常會被訪問到,或者創建頁面時消耗的資源比較多,比如需要多次訪問數據庫、生成時間比較長等,我們可以使用redis將這個頁面緩存起來,減輕網站負擔,降低網站的延遲,比如說網站首頁等 3、比如新浪微博# 新浪微博,基于TB級的內存數據庫# 內容 :存儲在MySQL數據庫# 關系 :存儲在redis數據庫# 數字 :粉絲數量,關注數量,存儲在redis數據庫# 消息隊列
  • 數據庫排名

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lnfujJcG-1573565054411)(E:\工作相關\講課文件\Redis\redis_day01_note\db_rank.png)]

  • redis版本
1、最新版本:5.0 2、常用版本:2.42.62.83.0(里程碑)、3.23.44.05.0 3、圖形界面管理工具(寫的一般)RedisDesktopManager # 為了解決負載問題,所以發明了redis
  • 誕生歷程
# 1、歷史 LLOOGG.com 幫助別的網站統計用戶信息,各個網站發送的瀏覽記錄都會存儲到存儲隊列,5-10000條記錄,多余5條需要收費# 2、原理 FIFO機制,先進先出,滿了進一條就出一條,網站越多,隊列越多,推入和彈出操作越多# 3、技術及問題 開始使用MySQL進行硬盤讀寫,速度很慢,導致無法實時顯示,所以自己寫了一個列表結構的內存數據庫,程序性能不會受到硬盤IO的限制,加了持久化的功能# 4、redis數據庫戛然而生
  • Redis附加功能
1、持久化將內存中數據保存到磁盤中,保證數據安全,方便進行數據備份和恢復 2、發布與訂閱功能將消息同時分發給多個客戶端,用于構建廣播系統 3、過期鍵功能為鍵設置一個過期時間,讓它在指定時間內自動刪除<節省內存空間># 音樂播放器,日播放排名,過期自動刪除 4、事務功能原子的執行多個操作 5、主從復制 6、Sentinel哨兵

安裝

  • Ubuntu
# 安裝 sudo apt-get install redis-server # 確認是否啟動 ps -aux | grep redis # 服務端啟動 sudo /etc/init.d/redis-server status sudo /etc/init.d/redis-server start sudo /etc/init.d/redis-server stop sudo /etc/init.d/redis-server restart # 客戶端連接 redis-cli -h IP地址 -p 端口 redis-cli # 默認連接本機的6379端口 127.0.0.1:6379>ping PONG
  • Windows
1、下載安裝包Github下載地址:https://github.com/MicrosoftArchive/redis/releases百度網盤下載地址 https://pan.baidu.com/s/1z1_OdNVbtgyEjiktqgB83g 密碼:kdfq 2、解壓 3、啟動服務端雙擊解壓后的 redis-server.exe 4、客戶端連接雙擊解壓后的 redis-cli.exe# 問題:關閉終端后服務終止 # 解決:將Redis服務安裝到本地服務 1、重命名 redis.windows.conf 為 redis.conf,作為redis服務的配置文件 2、cmd命令行,進入到redis-server.exe所在目錄 3、執行:redis-server --service-install redis.conf --loglevel verbose 4、計算機-管理-服務-Redis-啟動# 卸載 到 redis-server.exe 所在路徑執行: 1、redis-server --service-uninstall 2、sc delete Redis

配置文件詳解

  • 配置文件所在路徑
1、Ubuntu/etc/redis/redis.conf2、windows 下載解壓后的redis文件夾中redis.windows.conf redis.conf
  • 設置連接密碼
1、requirepass 密碼 2、重啟服務sudo /etc/init.d/redis-server restart 3、客戶端連接redis-cli -h 127.0.0.1 -p 6379 -a 123456127.0.0.1:6379>ping
  • 允許遠程連接
1# 注釋掉IP地址綁定bind 127.0.0.1 2# 關閉保護模式(默認開始,不允許外部網絡訪問)protected-mode no 3# 重啟redis服務sudo /etc/init.d/redis-server restart
  • 遠程連接測試

    Windows連接Ubuntu的Redis服務

# cmd命令行 1、d: 2、cd Redis3.0 3、redis-cli -h x.x.x.x -a 123456 4、x.x.x.x:6379>ping

數據類型

字符串類型(string)

特點

1、字符串、數字,都會轉為字符串來存儲 2、以二進制的方式存儲在內存中

必須掌握命令

1set key value 2、setnx key value 3set key value ex seconds 4、get key 5、mset key1 value1 key2 value2 6、mget key1 key2 key3 7、stren key # 數字操作 8、incr key 9、decr key

擴展命令

1、append key value 2、setrange key index value 3、getrange key start stop 4、incrby key step 5、decrby key step

常用命令

  • set | get命令

    作用: 設置鍵值,獲取鍵對應的值

    命令格式: set key value

    ? get key

tarena@tedu:~$ redis-cli -h 127.0.0.1 -p 6379 -a 123456 127.0.0.1:6379> set name 'Lucy' OK 127.0.0.1:6379> get name "Lucy" 127.0.0.1:6379> set number 10 OK 127.0.0.1:6379> get number "10" 127.0.0.1:6379> set number 6.66 OK 127.0.0.1:6379> get number "6.66"
  • set命令之 - setnx

    setnx key value : 鍵不存在時才能進行設置**(必須掌握)**

# 鍵不存在,進行設置(此處name鍵已經存在) 127.0.0.1:6379> setnx name 'Tom' (nil) 127.0.0.1:6379>
  • set命令之 - ex

    作用: 設置過期時間

    命令格式: set key value ex seconds

127.0.0.1:6379> set name 'Tiechui' ex 3 OK 127.0.0.1:6379> get name "Tiechui" # 3秒后再次獲取,得到 nil 127.0.0.1:6379> get name (nil) 127.0.0.1:6379>
  • mset | mget

    作用: 同時設置多個值,獲取多個值

127.0.0.1:6379> mset name1 'lucy' name2 'tom' name3 'jim' OK 127.0.0.1:6379> mget name1 name2 name3 1) "lucy" 2) "tom" 3) "jim" 127.0.0.1:6379>

? 鍵的命名規范

? mset wang::email wangweichao@tedu.cn

127.0.0.1:6379> mset wang::email wangweichao@tedu.cn guo::email guods@tedu.cn OK 127.0.0.1:6379> mget wang::email guo::email 1) "wangweichao@tedu.cn" 2) "guods@tedu.cn" 127.0.0.1:6379>
  • strlen

    作用: 獲取值的長度

    命令格式: strlen key

127.0.0.1:6379> strlen name (integer) 11 127.0.0.1:6379>
  • 字符串索引操作

    setrange key 索引值 value

    作用: 從索引值開始,value替換原內容

127.0.0.1:6379> get message "hello world" 127.0.0.1:6379> setrange message 6 'tarena' (integer) 12 127.0.0.1:6379> get message "hello tarena" 127.0.0.1:6379>

? getrange key 起始值 終止值

? 作用: 獲取指定范圍切片內容

127.0.0.1:6379> get message "hello tarena" 127.0.0.1:6379> getrange message 0 4 "hello" 127.0.0.1:6379> getrange message 0 -1 "hello tarena" 127.0.0.1:6379>
  • append key value

    作用: 追加拼接value的值

127.0.0.1:6379> set message 'hello ' OK 127.0.0.1:6379> append message 'world' (integer) 11 127.0.0.1:6379> get message "hello world" 127.0.0.1:6379>

整數操作

? INCRBY key 步長

? DECRBY key 步長

127.0.0.1:6379> set number 10 OK 127.0.0.1:6379> get number "10" 127.0.0.1:6379> INCRBY number 5 (integer) 15 127.0.0.1:6379> get number "15" 127.0.0.1:6379> DECRBY number 5 (integer) 5 127.0.0.1:6379> get number "5"

? INCR key : +1操作

? DECR key : -1操作

127.0.0.1:6379> incr number (integer) 7 127.0.0.1:6379> decr number (integer) 6 127.0.0.1:6379> get number "6" 127.0.0.1:6379>

? 應用場景

抖音上有人關注你了,是不是可以用INCR呢,如果取消關注了是不是可以用DECR

浮點數操作

? incrbyfloat key step

127.0.0.1:6379> get number "10" 127.0.0.1:6379> INCRBYFLOAT number 6.66 "12.66" 127.0.0.1:6379> INCRBYFLOAT number -6.66 "6" 127.0.0.1:6379> # 先轉為數字類型,然后再進行相加減,不能使用append

string命令匯總

# 字符串操作 1set key value 2、setnx key value 3、get key 3、mset 4、mget 5set key value ex seconds 6、strlen key # 數字操作 7、incrby key 步長 8、decrby key 步長 9、incr key 10、decr key 11、incrbyfloat key number # 設置過期時間的兩種方式 # 方式一 1set key value ex 3 # 方式二 1set key value 2、expire key 5 # 秒 3、pexpire key 5 # 毫秒 # 查看存活時間 ttl key # 刪除過期 persist key
  • 通用命令
# 切換庫 select number # 查看鍵 keys * # 鍵類型 TYPE key # 鍵是否存在 exists key # 刪除鍵 del key # 鍵重命名 rename key newkey # 返回舊值并設置新值(如果鍵不存在,就創建并賦值) getset key value # 清除當前庫中所有數據(慎用) flushdb # 清除所有庫中所有數據(慎用) flushall

string數據類型注意

# key值取值原則 1、key值不宜過長,消耗內存,且在數據中查找這類鍵值的計算成本高 2、不宜過短,可讀性較差 # 值 1、一個字符串類型的值最多能存儲512M內容

練習

1、查看 db0 庫中所有的鍵select 0keys * 2、設置鍵 trill:username 對應的值為 user001,并查看set trill:username 'user001' 3、獲取 trill:username 值的長度strlen trill:username 4、一次性設置 trill:password 、trill:gender、trill:fansnumber 并查看(值自定義)mset trill:password '123456' trill:gender 'm' trill:fansnumber 10mget trill:password trill:gender trill:fansnumber 5、查看鍵 trill:score 是否存在exists trill:score 6、增加10個粉絲incrby trill:fansnumber 10 7、增加2個粉絲(一個一個加)incr trill:fansnumber incr trill:fansnumber 8、有3個粉絲取消關注你了decrby trill:fansnumber 10 9、又有1個粉絲取消關注你了decrby trill:fansnumber 1 10、思考、思考、思考...,清除當前庫flushdb 11、一萬個思考之后,清除所有庫flushall

列表數據類型(List)

  • 特點
1、元素是字符串類型 2、列表頭尾增刪快,中間增刪慢,增刪元素是常態 3、元素可重復 4、最多可包含2^32 -1個元素 5、索引同python列表
  • 頭尾壓入元素(LPUSH | RPUSH)

? 1、LPUSH key value

? 2、RPUSH key value

127.0.0.1:6379> LPUSH mylist1 0 1 2 3 4 (integer) 5 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 5) "0" 127.0.0.1:6379> RPUSH mylist2 0 1 2 3 4 (integer) 5 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "0" 2) "1" 3) "2" 4) "3" 5) "4" 127.0.0.1:6379>
  • 查看|設置 列表元素

    查看(LRANGE)

    LRANGE key start stop # 查看列表中所有元素 LRANGE key 0 -1

    獲取指定位置元素(LINDEX)

    LINDEX key index

    設置指定位置元素的值(LSET)

    LSET key index value

    獲取列表長度(LLEN)

    LLEN key
  • 頭尾彈出元素(LPOP | RPOP)

    LPOP key : 從列表頭部彈出一個元素

    RPOP key : 從列表尾部彈出一個元素

    RPOPLPUSH source destination : 從一個列表尾部彈出元素壓入到另一個列表頭部

127.0.0.1:6379> LRANGE mylist1 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 5) "8" 127.0.0.1:6379> LPOP mylist1 "4" 127.0.0.1:6379> RPOP mylist1 "8" 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> RPOPLPUSH mylist1 mylist2 "1" 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "3" 2) "2" 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "1" 2) "0" 3) "1" 4) "2"
  • 移除指定元素(LREM)

    LREM key count value

    count>0:表示從頭部開始向表尾搜索,移除與value相等的元素,數量為count count<0:表示從尾部開始向表頭搜索,移除與value相等的元素,數量為count count=0:移除表中所有與value相等的值

    示例

    127.0.0.1:6379> LRANGE mylist1 0 -1 1) "3" 2) "2" 127.0.0.1:6379> LPUSH mylist1 3 2 (integer) 4 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "2" 2) "3" 3) "3" 4) "2" 127.0.0.1:6379> LREM mylist1 1 2 (integer) 1 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "3" 2) "3" 3) "2" 127.0.0.1:6379> LREM mylist1 1 3 (integer) 1 127.0.0.1:6379> LRANGE mylist1 0 -1 1) "3" 2) "2" 127.0.0.1:6379>
  • **去除指定范圍外元素(LTRIM) **

    LTRIM key start stop

    127.0.0.1:6379> LRANGE mylist2 0 -1 1) "1" 2) "0" 3) "1" 4) "2" 5) "3" 6) "4" 127.0.0.1:6379> LTRIM mylist2 0 -2 OK 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "1" 2) "0" 3) "1" 4) "2" 5) "3" 127.0.0.1:6379>

    應用場景: 保存微博評論最后500條

    LTRIM user001::comments 0 499
  • 列表中插入值(LINSERT)

    LINSERT key BEFORE|AFTER pivot value

    key和pivot不存在,不進行任何操作

    示例代碼

    127.0.0.1:6379> LRANGE mylist2 0 -1 1) "0" 2) "1" 3) "2" 4) "3" 5) "4" 127.0.0.1:6379> LINSERT mylist2 after 2 666 (integer) 6 127.0.0.1:6379> LINSERT mylist2 before 4 888 (integer) 7 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "0" 2) "1" 3) "2" 4) "666" 5) "3" 6) "888" 7) "4" 127.0.0.1:6379>
  • 阻塞彈出(BLPOP | BRPOP)

    BLPOP key timeout

    BRPOP key timeout

    1、如果彈出的列表不存在或者為空,就會阻塞 2、超時時間設置為0,就是永久阻塞,直到有數據可以彈出 3、如果多個客戶端阻塞再同一個列表上,使用First In First Service原則,先到先服務

    示例

    127.0.0.1:6379> BLPOP mylist2 0 1) "mylist2" 2) "3" 127.0.0.1:6379> BLPOP mylist2 0 1) "mylist2" 2) "2" 127.0.0.1:6379> BLPOP mylist2 0 1) "mylist2" 2) "1" 127.0.0.1:6379> BLPOP mylist2 0 # 阻塞了

列表常用命令總結

# 增 1、LPUSH key value1 value2 2、RPUSH key value1 value2 3、RPOPLPUSH source destination 4、LINSERT key after|before value newvalue # 查 5、LRANGE key start stop 6、LLEN key # 刪 7、LPOP key 8、RPOP key 9、BLPOP key timeout 10、BRPOP key timeout 11、LREM key count value 12、LTRIM key start stop # 改 13、LSET key index newvalue

練習

1、查看所有的鍵keys * 2、向列表 spider::urls 中以RPUSH放入如下幾個元素:01_baidu.com、02_taobao.com、03_sina.com、04_jd.com、05_xxx.comRPUSH spider::urls 01_baidu.com 02_taobao.com 03_sina.com 04_jd.com 05_xxx.com 3、查看列表中所有元素LRANGE spider::urls 0 -1 4、查看列表長度LLEN spider::urls 5、將列表中01_baidu.com 改為 01_tmall.comLSET spider::urls 0 01_tmall.com 6、在列表中04_jd.com之后再加1個元素 02_taobao.comLINSERT spider::urls after 04_jd.com 02_taobao.com 7、彈出列表中的最后一個元素RPOP spider::urls 8、刪除列表中所有的 02_taobao.comLREM spider::urls 0 02_taobao.com 9、剔除列表中的其他元素,只剩前3條LTRIM spider::urls 0 2

與python交互

  • 模塊

Ubuntu

sudo pip3 install redis

Windows

python -m pip install redis
  • 使用流程
import redis # 創建數據庫連接對象 r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')
  • 通用命令代碼示例
import redis# 創建數據庫連接對象 r = redis.Redis(host='192.168.43.49',port=6379,db=0,password='123456') # [b'key1',b'key2'] print(r.keys('*')) # 鍵類型:string print(type('spider::urls')) # 是否存在:1 或者 0 print(r.exists('spider::urls')) # 刪除key:spider::urls r.delete('spider::urls')

字符串命令代碼示例

import redisr = redis.Redis(host='192.168.43.49',port=6379,db=0)r.set('mystring','python') # b'python' print(r.get('mystring')) # False print(r.setnx('mystring','socket')) # mset:參數為字典 r.mset({'mystring2':'mysql','mystring3':'mongodb'}) # mget:結果為一個列表 print(r.mget('mystring','mystring2','mystring3')) # mystring長度:6 print(r.strlen('mystring')) # 數字類型操作 r.set('number',10) r.incrby('number',5) r.decrby('number',5) r.incr('number') r.decr('number') r.incrbyfloat('number',6.66) r.incrbyfloat('number',-6.66) # b'10' print(r.get('number'))

python操作list

import redisr = redis.Redis(host='192.168.43.49',port=6379,db=0) # ['mysql','redis'] r.lpush('pylist','redis','mysql') # ['mysql','redis','django','spider'] r.rpush('pylist','django','spider') # ['mysql','redis','django','spider','AI'] r.linsert('pylist','after','spider','AI') # 5 print(r.llen('pylist')) # ['redis','django','spider'] r.lpop('pylist') r.rpop('pylist') # ['redis','django','spider'] print(r.lrange('pylist',0,-1)) # ['redis','spider'] r.lrem('pylist',0,'django') # 返回True,['redis'] r.ltrim('pylist',0,0) # 返回True,['spiderman'] r.lset('pylist',0,'spiderman')r.delete('pylist')

位圖操作bitmap(重要)

位圖不是真正的數據類型,它是定義在字符串類型中
一個字符串類型的值最多能存儲512M字節的內容,位上限:2^32

強勢點

可以實時的進行統計,極其節省空間。官方在模擬128百萬用戶的模擬環境下,在一臺MacBookPro上,典型的統計如“日用戶數”的時間消耗小于50ms, 占用16MB內存

設置某一位上的值

setbit key offset value # offset是偏移量,從0開始

示例

# 默認擴展位以0填充 127.0.0.1:6379> set mykey ab OK 127.0.0.1:6379> get mykey "ab" 127.0.0.1:6379> SETBIT mykey 0 1 (integer) 0 127.0.0.1:6379> get mykey "\xe1b" 127.0.0.1:6379>

獲取某一位上的值

GETBIT key offset

127.0.0.1:6379> GETBIT mykey 3 (integer) 0 127.0.0.1:6379> GETBIT mykey 0 (integer) 1 127.0.0.1:6379>

bitcount

統計鍵所對應的值中有多少個 1

127.0.0.1:6379> SETBIT user001 1 1 (integer) 0 127.0.0.1:6379> SETBIT user001 30 1 (integer) 0 127.0.0.1:6379> bitcount user001 (integer) 2 127.0.0.1:6379>

應用場景案例

網站用戶的上線次數統計(尋找活躍用戶)

用戶名為key,上線的天作為offset,上線設置為1

示例: 用戶名為 user001 的用戶,今年第1天上線,第30天上線

SETBIT user001 1 1

SETBIT user001 30 1

BITCOUNT user001

代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,db=2,password='123456')# user1,一年之中第1天和第5天登錄 r.setbit('user001',1,1) r.setbit('user001',5,1) # user2,一年之中第100天和第200天登錄 r.setbit('user002',100,1) r.setbit('user002',200,1) # user3,一年之中好多天登錄 for i in range(0,365,2):r.setbit('user003',i,1) # user4,一年之中好多天登錄 for i in range(0,365,3):r.setbit('user004',i,1)user_list = r.keys('user*') print(user_list)# 活躍用戶 active_users = [] # 不活躍用戶 noactive_user = []for user in user_list:# 統計位圖中有多少個 1login_count = r.bitcount(user)if login_count >= 100:active_users.append((user,login_count))else:noactive_user.append((user,login_count))# 打印活躍用戶 for active in active_users:print('活躍用戶:',active)

list案例: 一個進程負責生產url,一個進程負責消費url

進程1: 生產者

import redis import random import timeurls_list = ['01_baidu.com','02_sina.com','03_taobao.com','04_tmall.com','05_jd.com' ] r = redis.Redis(host='192.168.43.49',db=0,password='123456') while True:url = random.choice(urls_list)r.lpush('spider::urls',url)time.sleep(random.randint(1,5))

進程2: 消費者

import redisr = redis.Redis(host='192.168.43.49',db=0,password='123456')while True:# 結果為元組try:url = r.blpop('spider::urls',3)print(url[1])r.lrem('spider::urls',count=0,value=url[1])except:print('爬取結束')break

redis_day01回顧

Redis的特點

1、基于key-value的非關系型數據庫 2、基于內存存儲,速度很快 3、基于內存存儲,經常當作緩存型數據庫使用,常用信息存儲在熱地是數據庫中

五大數據類型

1、字符串類型(string) 2、列表類型(list3、哈希類型(hash4、集合類型(set5、有序集合類型(sorted set

字符串類型

# 設置key相關操作 1set key value 2、setnx key value 3、mset k1 v1 k2 v2 k3 v3 4set key value ex seconds 5set key value 5、expire key 5 5、pexpire key 5 5、ttl key 5、persist key # 獲取key相關操作 6、get key 7、mget k1 k2 k3 8、strlen key # 數字相關操作 7、incrby key 步長 8、decrby key 步長 9、incr key 10、decr key 11、incrbyfloat key number

列表類型

# 插入元素相關操作 1、LPUSH key value1 value2 2、RPUSH key value1 value2 3、RPOPLPUSH source destination 4、LINSERT key after|before value newvalue # 查詢相關操作 5、LRANGE key start stop 6、LLEN key # 刪除相關操作 7、LPOP key 8、RPOP key 9、BLPOP key timeout 10、BRPOP key timeout 11、LREM key count value 12、LTRIM key start stop # 修改指定元素相關操作 13、LSET key index newvalue

思考:

Redis列表如何當做共享隊列來使用???

# 同學你好,你還記得小米應用商店爬取URL地址的案例嗎? 1、生產者消費者模型 2、生產者進程在列表中 LPUSH | RPUSH 數據,消費者進程在列表中 RPOP | LPOP 數據

redis_day02筆記

Python操作字符串類型

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)r.set('mystring','python') # b'python' print(r.get('mystring')) # False print(r.setnx('mystring','socket')) # mset:參數為字典 r.mset({'mystring2':'mysql','mystring3':'mongodb'}) # mget:結果為一個列表 print(r.mget('mystring','mystring2','mystring3')) # mystring長度:6 print(r.strlen('mystring')) # 數字類型操作 r.set('number',10) r.incrby('number',5) r.decrby('number',5) r.incr('number') r.decr('number') r.incrbyfloat('number',6.66) r.incrbyfloat('number',-6.66) # b'10' print(r.get('number'))

位圖操作bitmap

定義

1、位圖不是真正的數據類型,它是定義在字符串類型中 2、一個字符串類型的值最多能存儲512M字節的內容,位上限:2^32 # 1MB = 1024KB # 1KB = 1024Byte(字節) # 1Byte = 8bit(位)

強勢點

可以實時的進行統計,極其節省空間。官方在模擬1億2千8百萬用戶的模擬環境下,在一臺MacBookPro上,典型的統計如“日用戶數”的時間消耗小于50ms, 占用16MB內存

設置某一位上的值(setbit)

# 設置某一位上的值(offset是偏移量,從0開始) setbit key offset value # 獲取某一位上的值 GETBIT key offset # 統計鍵所對應的值中有多少個 1 BITCOUNT key

示例

# 默認擴展位以0填充 127.0.0.1:6379> set mykey ab OK 127.0.0.1:6379> get mykey "ab" 127.0.0.1:6379> SETBIT mykey 0 1 (integer) 0 127.0.0.1:6379> get mykey "\xe1b" 127.0.0.1:6379>

獲取某一位上的值

GETBIT key offset

127.0.0.1:6379> GETBIT mykey 3 (integer) 0 127.0.0.1:6379> GETBIT mykey 0 (integer) 1 127.0.0.1:6379>

bitcount

統計鍵所對應的值中有多少個 1

127.0.0.1:6379> SETBIT user001 1 1 (integer) 0 127.0.0.1:6379> SETBIT user001 30 1 (integer) 0 127.0.0.1:6379> bitcount user001 (integer) 2 127.0.0.1:6379>

應用場景案例

網站用戶的上線次數統計(尋找活躍用戶)

用戶名為key,上線的天作為offset,上線設置為1

示例: 用戶名為 user001 的用戶,今年第1天上線,第30天上線

SETBIT user001 1 1

SETBIT user001 30 1

BITCOUNT user001

代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,db=0)# user1,一年之中第1天和第5天登錄 r.setbit('user001',1,1) r.setbit('user001',5,1) # user2,一年之中第100天和第200天登錄 r.setbit('user002',100,1) r.setbit('user002',200,1) # user3,一年之中好多天登錄 for i in range(0,365,2):r.setbit('user003',i,1) # user4,一年之中好多天登錄 for i in range(0,365,3):r.setbit('user004',i,1)user_list = r.keys('user*') print(user_list)# 活躍用戶 active_users = [] # 不活躍用戶 noactive_user = []for user in user_list:# 統計位圖中有多少個 1login_count = r.bitcount(user)if login_count >= 100:active_users.append((user,login_count))else:noactive_user.append((user,login_count))# 打印活躍用戶 for active in active_users:print('活躍用戶:',active)

Hash散列數據類型

  • 定義

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cVs8X0e3-1573565054414)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562834840173.png)]

1、由field和關聯的value組成的鍵值對 2、field和value是字符串類型 3、一個hash中最多包含2^32-1個鍵值對
  • 優點
1、節約內存空間 2、每創建一個鍵,它都會為這個鍵儲存一些附加的管理信息(比如這個鍵的類型,這個鍵最后一次被訪問的時間等) 3、鍵越多,redis數據庫在儲存附件管理信息方面耗費內存越多,花在管理數據庫鍵上的CPU也會越多
  • 缺點(不適合hash情況)
1、使用二進制位操作命令:SETBIT、GETBIT、BITCOUNT等,如果想使用這些操作,只能用字符串鍵 2、使用過期鍵功能:鍵過期功能只能對鍵進行過期操作,而不能對散列的字段進行過期操作

基本命令操作

# 1、設置單個字段 HSET key field value HSETNX key field value # 2、設置多個字段 HMSET key field value field value # 3、返回字段個數 HLEN key # 4、判斷字段是否存在(不存在返回0) HEXISTS key field # 5、返回字段值 HGET key field # 6、返回多個字段值 HMGET key field filed # 7、返回所有的鍵值對 HGETALL key # 8、返回所有字段名 HKEYS key # 9、返回所有值 HVALS key # 10、刪除指定字段 HDEL key field # 11、在字段對應值上進行整數增量運算 HINCRBY key filed increment # 12、在字段對應值上進行浮點數增量運算 HINCRBYFLOAT key field increment

python基本方法

# 1、更新一條數據的屬性,沒有則新建 hset(name, key, value) # 2、讀取這條數據的指定屬性, 返回字符串類型 hget(name, key) # 3、批量更新數據(沒有則新建)屬性 hmset(name, mapping) # 4、批量讀取數據(沒有則新建)屬性 hmget(name, keys, *args) # 5、獲取這條數據的所有屬性和對應的值,返回字典類型 hgetall(name) # 6、獲取這條數據的所有屬性名,返回列表類型 hkeys(name) # 7、刪除這條數據的指定屬性 hdel(name, *keys)

Python代碼hash散列

import redisr = redis.Redis(host="192.168.43.49", port=6379, db=0,password='123456') # 新建一條鍵名為"userinfo"的數據, 包含屬性username r.hset("userinfo", "username", 'zhanshen001') # 更改鍵名為"userinfo"的數據, 更改屬性username的值 r.hset("userinfo", "username", 'zhanshen002')# 取出屬性username的值 username = r.hget("userinfo", "username")# 輸出看一下(發現屬性值已經為str) print('username',username)# 屬性集合 user_dict = {"password": "123456","name": "Wang Success","sex": "male","height": '178',"Tel": '13838383888', } # 批量添加屬性 r.hmset("userinfo", user_dict) # 取出所有數據(返回值為字典) h_data = r.hgetall("userinfo") print('all:', h_data) # 刪除屬性(可以批量刪除) r.hdel("userinfo", "Tel") # 取出所有屬性名 h_keys = r.hkeys("userinfo") print('all_key_name:',h_keys) # 取出所有屬性值 h_values = r.hvals('userinfo') print('all_values:',h_values)

應用場景:微博好友關注

1、用戶ID為key,Field為好友ID,Value為關注時間user:10000 user:606 20190520user:10000 user:605 20190521 2、用戶維度統計統計數包括:關注數、粉絲數、喜歡商品數、發帖數用戶為key,不同維度為field,value為統計數比如關注了5人HSET user:10000 fans 5HINCRBY user:10000 fans 1

應用場景: redis+mysql+hash組合使用

  • 原理

    用戶想要查詢個人信息 1、到redis緩存中查詢個人信息 2、redis中查詢不到,到mysql查詢,并緩存到redis 3、再次查詢個人信息
  • 代碼實現

    import redis import pymysql# 1、到redis中查詢個人信息 # 2、redis中查詢不到,到mysql查詢,并緩存到redis # 3、再次查詢個人信息username = input('請輸入用戶名:')# 到redis緩存中查詢 r = redis.Redis(host='192.168.153.128',port=6379,password='123456',db=0)# 如果redis中沒有緩存,則返回空字典{} result = r.hgetall(username) print('redis中找到:',result)if not result:db = pymysql.connect('192.168.153.128','tiger','123456','spider',charset='utf8')cursor = db.cursor()cursor.execute('select gender,age from user where username=%s',[username])# (('zhanshen001','m',30),)userinfo = cursor.fetchall()if not userinfo:print('MySQL中用戶信息不存在')else:dict = {'gender':userinfo[0][0],'age':userinfo[0][1]}# hmset第二個參數為字典r.hmset(username,dict)# 設置過期時間為5分鐘r.expire(username,60*5)print('redis緩存成功')

mysql數據庫中數據更新信息后同步到redis緩存

用戶修改個人信息時,要將數據同步到redis緩存

import redis import pymysql# 當用戶修改個人信息時,要同步更新到redis緩存中username = input('請輸入用戶名:') new_age = input('請輸入新年齡:')# 連接redis準備更新 r = redis.Redis(host='192.168.153.128',port=6379,password='123456',db=0) # 連接MySQL db = pymysql.connect('192.168.153.128','tiger','123456','spider',charset='utf8') cursor = db.cursor() cursor.execute('update user set age=%s where username=%s',[new_age,username]) db.commit()# 同步更新redis緩存 r.hset(username,'age',new_age) print('已同步到redis緩存') # 設置過期時間為5分鐘 r.expire(username,60*5)

集合數據類型(set)

  • 特點
1、無序、去重 2、元素是字符串類型 3、最多包含2^32-1個元素
  • 基本命令
# 1、增加一個或者多個元素,自動去重 SADD key member1 member2 # 2、查看集合中所有元素 SMEMBERS key # 3、刪除一個或者多個元素,元素不存在自動忽略 SREM key member1 member2 # 4、元素是否存在 SISMEMBER key member # 5、隨機返回集合中指定個數的元素,默認為1個 SRANDOMMEMBER key count # 6、返回集合中元素的個數,不會遍歷整個集合,只是存儲在鍵當中了 SCARD key # 7、把元素從源集合移動到目標集合 SMOVE source destination member # 8、差集(number1 1 2 3 number2 1 2 4) SDIFF key1 key2 # 9、差集保存到另一個集合中 SDIFFSTORE destination key1 key2 # 10、交集 SINTER key1 key2 SINTERSTORE destination key1 key2 # 11、并集 SUNION key1 key2 SUNIONSTORE destination key1 key2

案例: 新浪微博的共同關注

需求: 當用戶訪問另一個用戶的時候,會顯示出兩個用戶共同關注過哪些相同的用戶

設計: 將每個用戶關注的用戶放在集合中,求交集即可

實現:

user001 = {‘peiqi’,‘qiaozhi’,‘danni’}

user002 = {‘peiqi’,‘qiaozhi’,‘lingyang’}

user001和user002的共同關注為:

SINTER user001 user002

結果為: {‘peiqi’,‘qiaozhi’}

python操作set

# 1、給name對應的集合中添加元素 sadd(name,values) r.sadd("set_name","tom") r.sadd("set_name","tom","jim")# 2、獲取name對應的集合的所有成員 smembers(name)# 3、獲取name對應的集合中的元素個數 scard(name) r.scard("set_name")# 4、檢查value是否是name對應的集合內的元素 sismember(name, value)# 5、隨機刪除并返回指定集合的一個元素 spop(name)# 6、刪除集合中的某個元素 srem(name, value) r.srem("set_name", "tom")# 7、獲取多個name對應集合的交集 sinter(keys, *args)r.sadd("set_name","a","b") r.sadd("set_name1","b","c") r.sadd("set_name2","b","c","d")print(r.sinter("set_name","set_name1","set_name2")) #輸出:{b'b'}# 8、獲取多個name對應的集合的并集 sunion(keys, *args) r.sunion("set_name","set_name1","set_name2")

python代碼實現微博關注

import redisr = redis.Redis(host='192.168.153.128',port=6379,password='123456')# 用戶1關注的人 r.sadd('user_one','peiqi','qiaozhi','danni') # 用戶2關注的人 r.sadd('user_two','peiqi','qiaozhi','lingyang')# user001和user002的共同關注的人為??求差集 result = r.sinter('user_one','user_two') # 把集合中的每個元素轉為string數據類型 focus_on_set = set() for r in result:focus_on_set.add(r.decode())print(focus_on_set)

有序集合sortedset

  • 特點
1、有序、去重 2、元素是字符串類型 3、每個元素都關聯著一個浮點數分值(score),并按照分支從小到大的順序排列集合中的元素(分值可以相同) 4、最多包含2^32-1元素
  • 示例

    一個保存了水果價格的有序集合

分值2.04.06.08.010.0
元素西瓜葡萄芒果香蕉蘋果

? 一個保存了員工薪水的有序集合

分值600080001000012000
元素lucytomjimjack

? 一個保存了正在閱讀某些技術書的人數

分值300400555666777
元素核心編程阿凡提本拉登阿姆斯特朗比爾蓋茨
  • 增加

zadd key score member

# 在有序集合中添加一個成員 zadd key score member # 查看指定區間元素(升序) zrange key start stop [withscores] # 查看指定區間元素(降序) ZREVRANGE key start stop [withscores] # 查看指定元素的分值 ZSCORE key member # 返回指定區間元素 # offset : 跳過多少個元素 # count : 返回幾個 # 小括號 : 開區間 zrangebyscore fruits (2.0 8.0 zrangebyscore key min max [withscores] [limit offset count] # 刪除成員 zrem key member # 增加或者減少分值 zincrby key increment member # 返回元素排名 zrank key member # 返回元素逆序排名 zrevrank key member # 刪除指定區間內的元素 zremrangebyscore key min max # 返回集合中元素個數 zcard key # 返回指定范圍中元素的個數 zcount key min max zcount fruits 4 7 zcount fruits (4 7 # 并集 zunionstore destination numkeys key [weights 權重值] [AGGREGATE SUM|MIN|MAX] # 交集:和并集類似,只取相同的元素 ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX
  • 查看: 指定索引區間元素(升序)

zrange key start stop [withscores]

127.0.0.1:6379> ZRANGE salary 0 -1 1) "lucy" 2) "tom" 3) "jim" 4) "jack" 127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "lucy" 2) "6000" 3) "tom" 4) "8000" 5) "jim" 6) "10000" 7) "jack" 8) "12000" 127.0.0.1:6379>
  • 查看: 指定索引區間元素(降序)

    ZREVRANGE key start stop [withscores]

  • 顯示指定元素的分值

    ZSCORE key member

127.0.0.1:6379> zscore salary jack "14000" 127.0.0.1:6379>
  • 返回指定區間元素

    zrangebyscore key min max [withscores] [limit offset count]

    offset : 跳過多少個元素

    count : 返回幾個

    小括號 : 開區間 zrangebyscore fruits (2.0 8.0

127.0.0.1:6379> ZRANGEBYSCORE salary (8000 12000 1) "jim" 2) "jack" 127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "lucy" 2) "6000" 3) "tom" 4) "8000" 5) "jim" 6) "10000" 7) "jack" 8) "12000"
  • 刪除

zrem key member

127.0.0.1:6379> ZREM salary jim (integer) 1 127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "lucy" 2) "6000" 3) "tom" 4) "8000" 5) "jack" 6) "12000" 127.0.0.1:6379>
  • 增加或者減少分值

    zincrby key increment member

127.0.0.1:6379> ZINCRBY salary 2000 jack "14000" 127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "lucy" 2) "6000" 3) "tom" 4) "8000" 5) "jack" 6) "14000" 127.0.0.1:6379>
  • 返回元素的排名(索引)

zrank key member

127.0.0.1:6379> zrank salary jack (integer) 2 127.0.0.1:6379>
  • 返回元素逆序排名

zrevrank key member

127.0.0.1:6379> ZREVRANK salary jack (integer) 0 127.0.0.1:6379> ZREVRANK salary lucy (integer) 2 127.0.0.1:6379>
  • 刪除指定區間內的元素

zremrangebyscore key min max

127.0.0.1:6379> ZREMRANGEBYSCORE salary 4000 6000 (integer) 1 127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "tom" 2) "8000" 3) "jack" 4) "14000" 127.0.0.1:6379>
  • 返回集合中元素個數

    zcard key

127.0.0.1:6379> ZCARD salary (integer) 2 127.0.0.1:6379>
  • 返回指定范圍中元素的個數

    zcount key min max

    zcount fruits 4 7

    zcount fruits (4 7

    127.0.0.1:6379> ZRANGE salary 0 -1 withscores 1) "tom" 2) "8000" 3) "jack" 4) "14000" 127.0.0.1:6379> zcount salary 8000 14000 (integer) 2 # 不包含8000,包含14000 127.0.0.1:6379> zcount salary (8000 14000 (integer) 1 127.0.0.1:6379>
  • 并集

    zunionstore destination numkeys key [weights ] [AGGREGATE SUM|MIN|MAX]

    127.0.0.1:6379> zadd stu_score1 60 tom 70 jim (integer) 2 127.0.0.1:6379> zadd stu_score2 80 tom 90 lucy (integer) 2 # 默認為SUM 127.0.0.1:6379> ZUNIONSTORE stu_score3 2 stu_score1 stu_score2 (integer) 3 127.0.0.1:6379> ZRANGE stu_score3 0 -1 withscores 1) "jim" 2) "70" 3) "lucy" 4) "90" 5) "tom" 6) "140" 127.0.0.1:6379> # WEIGHTS 和 AGGREGATE 127.0.0.1:6379> ZRANGE stu_score1 0 -1 withscores 1) "tom" 2) "60" 3) "jim" 4) "70" 127.0.0.1:6379> ZRANGE stu_score2 0 -1 withscores 1) "tom" 2) "80" 3) "lucy" 4) "90" # 權重1給stu_score1,權重0.5給stu_score2,算完權重之后求和SUM 127.0.0.1:6379> ZUNIONSTORE stu_score8 2 stu_score1 stu_score2 weights 1 0.5 AGGREGATE SUM (integer) 3 127.0.0.1:6379> ZRANGE stu_score8 0 -1 withscores 1) "lucy" 2) "45" 3) "jim" 4) "70" 5) "tom" 6) "100" 127.0.0.1:6379>
  • 交集

    ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX

    和并集類似,只取相同的元素

python操作sorted set

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0) # 注意第二個參數為字典 r.zadd('salary',{'tom':6000,'jim':8000,'jack':12000}) # 結果為列表中存放元組[(),(),()] print(r.zrange('salary',0,-1,withscores=True)) print(r.zrevrange('salary',0,-1,withscores=True)) # start:起始值,num:顯示條數 print(r.zrangebyscore('salary',6000,12000,start=1,num=2,withscores=True)) # 刪除 r.zrem('salary','tom') print(r.zrange('salary',0,-1,withscores=True)) # 增加分值 r.zincrby('salary',5000,'jack') print(r.zrange('salary',0,-1,withscores=True)) # 返回元素排名 print(r.zrank('salary','jack')) print(r.zrevrank('salary','jack')) # 刪除指定區間內的元素 r.zremrangebyscore('salary',6000,8000) print(r.zrange('salary',0,-1,withscores=True)) # 統計元素個數 print(r.zcard('salary')) # 返回指定范圍內元素個數 print(r.zcount('salary',6000,20000)) # 并集 r.zadd('salary2',{'jack':17000,'lucy':8000}) r.zunionstore('salary3',('salary','salary2'),aggregate='max') print(r.zrange('salary3',0,-1,withscores=True)) # 交集 r.zinterstore('salary4',('salary','salary2'),aggregate='max') print(r.zrange('salary4',0,-1,withscores=True))

案例1:網易音樂排行榜

1、每首歌的歌名作為元素(先不考慮重復) 2、每首歌的播放次數作為分值 3、使用ZREVRANGE來獲取播放次數最多的歌曲

代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)r.zadd('ranking',{'song1':1,'song2':1,'song3':1,'song4':1}) r.zadd('ranking',{'song5':1,'song6':1,'song7':1}) r.zadd('ranking',{'song8':1,'song9':1})r.zincrby('ranking',50,'song3') r.zincrby('ranking',60,'song5') r.zincrby('ranking',80,'song7') # 獲取前10名 rlist = r.zrevrange('ranking',0,2,withscores=True)i = 1 for r in rlist:print('第%d名:%s' % (i,r[0].decode()))i += 1

案例2: 京東商品暢銷榜

# 第1天 ZADD mobile-001 5000 'huawei' 4000 'oppo' 3000 'iphone' # 第2天 ZADD mobile-002 5200 'huawei' 4300 'oppo' 3230 'iphone' # 第3天 ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone' 問題:如何獲取三款收集的銷量排名? ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 # 可否? # 正確 1、ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone' 2、ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 AGGREGATE MAX

python代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)# 第1天 day01_dict = {'huawei' : 5000,'oppo' : 4000,'iphone' : 3000 } # 第2天 day02_dict = {'huawei' : 5200,'oppo' : 4300,'iphone' : 3230 } # 第3天 day03_dict = {'huawei' : 5500,'oppo' : 4660,'iphone' : 3580 } r.zadd('mobile-day01',day01_dict) r.zadd('mobile-day02',day02_dict) r.zadd('mobile-day03',day03_dict)r.zunionstore('mobile-day01:03',('mobile-day01','mobile-day02','mobile-day03'),aggregate='max') rlist = r.zrevrange('mobile-day01:03',0,-1,withscores=True)i = 1 for r in rlist:print('第{}名:{}'.format(i,r[0].decode()) )

redis_day02回顧

五大數據類型

1、字符串類型(string) 2、列表類型(list3、哈希類型(hash4、集合類型(set5、有序集合類型(sorted set

位圖操作(bitmap)

# 應用場景 1、可以實時的進行數據統計(網站用戶的上線次數統計) # 常用命令 1、setbit key offset value 2、BITCOUNT key

哈希(散列)類型

# 應用場景 1、很適合存儲對象類型,比如說用戶ID作為key,用戶的所有屬性及值作為key對應的value (用戶維度統計-各種數據統計-發帖數、粉絲數等) # 常用命令 HSET key field value HSETNX key field value HMSET key field value field valueHGET key field HMGET key field filed HGETALL key HKEYS key HVALS keyHLEN key HEXISTS key fieldHINCRBY key filed increment HINCRBYFLOAT key field incrementHDEL key field

集合類型

# 應用場景 1、共同關注、共同好友 # 常用命令SADD key member1 member2SMEMBERS key SCARD keySREM key member1 member2 SRANDOMMEMBER key [count]SISMEMBER key memberSDIFF key1 key2 SDIFFSTORE destination key1 key2SINTER key1 key2 SINTERSTORE destination key1 key2SUNION key1 key2 SUNIONSTORE destination key1 key2

有序集合

# 應用場景 1、各種排行榜1、游戲:列出前100名高分選手2、列出某用戶當前的全球排名3、各種日排行榜、周排行榜、月排行榜 # 常用命令 zadd key score memberZRANGE key start stop [withscores] ZREVRANGE key start stop [withscores] ZRANGEBYSCORE key min max [withscores] [limit offset count] ZSCORE key member ZCOUNT key min max ZCARD keyZRANK key member ZREVRANK key memberZINCRBY key increment memberZREM key member ZREMRANGEBYSCORE key min maxzunionstore destination numkeys key [weights 權重值] [AGGREGATE SUM|MIN|MAX] ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX

redis_day03筆記

有序集合sortedset

有序集合的交集與并集

# 交集(weights代表權重值,aggregate代表聚合方式 - 先計算權重值,然后再聚合) ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX # 并集(weights代表權重值,aggregate代表聚合方式 - 先計算權重值,然后再聚合) ZUNIONSTORE destination numkeys key [weights 權重值] [AGGREGATE SUM|MIN|MAX]

案例1:網易音樂排行榜

1、每首歌的歌名作為元素(先不考慮重復) 2、每首歌的播放次數作為分值 3、使用ZREVRANGE來獲取播放次數最多的歌曲

代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)r.zadd('ranking',{'song1':1,'song2':1,'song3':1,'song4':1}) r.zadd('ranking',{'song5':1,'song6':1,'song7':1}) r.zadd('ranking',{'song8':1,'song9':1})r.zincrby('ranking',50,'song3') r.zincrby('ranking',60,'song5') r.zincrby('ranking',80,'song7') # 獲取前10名 rlist = r.zrevrange('ranking',0,2,withscores=True)i = 1 for r in rlist:print('第%d名:%s' % (i,r[0].decode()))i += 1

案例2: 京東商品暢銷榜

# 第1天 ZADD mobile-001 5000 'huawei' 4000 'oppo' 3000 'iphone' # 第2天 ZADD mobile-002 5200 'huawei' 4300 'oppo' 3230 'iphone' # 第3天 ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone' 問題:如何獲取三款手機的銷量排名? ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 # 可否? # 正確 1、ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone' 2、ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 AGGREGATE MAX

python代碼實現

import redisr = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)# 第1天 day01_dict = {'huawei' : 5000,'oppo' : 4000,'iphone' : 3000 } # 第2天 day02_dict = {'huawei' : 5200,'oppo' : 4300,'iphone' : 3230 } # 第3天 day03_dict = {'huawei' : 5500,'oppo' : 4660,'iphone' : 3580 } r.zadd('mobile-day01',day01_dict) r.zadd('mobile-day02',day02_dict) r.zadd('mobile-day03',day03_dict)r.zunionstore('mobile-day01:03',('mobile-day01','mobile-day02','mobile-day03'),aggregate='max') rlist = r.zrevrange('mobile-day01:03',0,-1,withscores=True)i = 1 for r in rlist:print('第{}名:{}'.format(i,r[0].decode()) )

數據持久化

持久化定義

將數據從掉電易失的內存放到永久存儲的設備上

為什么需要持久化

因為所有的數據都在內存上,所以必須得持久化
  • 數據持久化分類之 - RDB模式(默認開啟)

默認模式

1、保存真實的數據 2、將服務器包含的所有數據庫數據以二進制文件的形式保存到硬盤里面 3、默認文件名 :/var/lib/redis/dump.rdb

創建rdb文件的兩種方式

**方式一:**服務器執行客戶端發送的SAVE或者BGSAVE命令

127.0.0.1:6379> SAVE OK # 特點 1、執行SAVE命令過程中,redis服務器將被阻塞,無法處理客戶端發送的命令請求,在SAVE命令執行完畢后,服務器才會重新開始處理客戶端發送的命令請求 2、如果RDB文件已經存在,那么服務器將自動使用新的RDB文件代替舊的RDB文件 # 工作中定時持久化保存一個文件127.0.0.1:6379> BGSAVE Background saving started # 執行過程如下 1、客戶端 發送 BGSAVE 給服務器 2、服務器馬上返回 Background saving started 給客戶端 3、服務器 fork() 子進程做這件事情 4、服務器繼續提供服務 5、子進程創建完RDB文件后再告知Redis服務器# 配置文件相關操作 /etc/redis/redis.conf dir /var/lib/redis # 表示rdb文件存放路徑 dbfilename dump.rdb # 文件名# 兩個命令比較 SAVE比BGSAVE快,因為需要創建子進程,消耗額外的內存# 補充:可以通過查看日志文件來查看redis都做了哪些操作 # 日志文件:配置文件中搜索 logfile logfile /var/log/redis/redis-server.log

方式二:設置配置文件條件滿足時自動保存(使用最多)

# 命令行示例 redis>save 300 10表示如果距離上一次創建RDB文件已經過去了300秒,并且服務器的所有數據庫總共已經發生了不少于10次修改,那么執行BGSAVE命令 redis>save 60 10000表示'如果距離上一次創建rdb文件已經過去60秒,并且服務器所有數據庫總共已經發生了不少于10000次修改,那么執行bgsave命令'# redis配置文件默認 save 900 1 save 300 10 save 60 100001、只要三個條件中的任意一個被滿足時,服務器就會自動執行BGSAVE2、每次創建RDB文件之后,服務器為實現自動持久化而設置的時間計數器和次數計數器就會被清零,并重新開始計數,所以多個保存條件的效果不會疊加
  • 數據持久化分類之 - AOF(AppendOnlyFile,默認未開啟)

特點

1、存儲的是命令,而不是真實數據 2、默認不開啟 # 開啟方式(修改配置文件) 1/etc/redis/redis.confappendonly yes # 把 no 改為 yesappendfilename "appendonly.aof" 2、重啟服務sudo /etc/init.d/redis-server restart

RDB缺點

1、創建RDB文件需要將服務器所有的數據庫的數據都保存起來,這是一個非常消耗資源和時間的操作,所以服務器需要隔一段時間才創建一個新的RDB文件,也就是說,創建RDB文件不能執行的過于頻繁,否則會嚴重影響服務器的性能 2、可能丟失數據

AOF持久化原理及優點

# 原理1、每當有修改數據庫的命令被執行時,服務器就會將執行的命令寫入到AOF文件的末尾2、因為AOF文件里面存儲了服務器執行過的所有數據庫修改的命令,所以給定一個AOF文件,服務器只要重新執行一遍AOF文件里面包含的所有命令,就可以達到還原數據庫的目的# 優點用戶可以根據自己的需要對AOF持久化進行調整,讓Redis在遭遇意外停機時不丟失任何數據,或者只丟失一秒鐘的數據,這比RDB持久化丟失的數據要少的多

安全性問題考慮

# 因為雖然服務器執行一個修改數據庫的命令,就會把執行的命令寫入到AOF文件,但這并不意味著AOF文件持久化不會丟失任何數據,在目前常見的操作系統中,執行系統調用write函數,將一些內容寫入到某個文件里面時,為了提高效率,系統通常不會直接將內容寫入硬盤里面,而是將內容放入一個內存緩存區(buffer)里面,等到緩沖區被填滿時才將存儲在緩沖區里面的內容真正寫入到硬盤里# 所以1、AOF持久化:當一條命令真正的被寫入到硬盤里面時,這條命令才不會因為停機而意外丟失2、AOF持久化在遭遇停機時丟失命令的數量,取決于命令被寫入到硬盤的時間3、越早將命令寫入到硬盤,發生意外停機時丟失的數據就越少,反之亦然

策略 - 配置文件

# 打開配置文件:/etc/redis/redis.conf,找到相關策略如下 1、alwarys服務器每寫入一條命令,就將緩沖區里面的命令寫入到硬盤里面,服務器就算意外停機,也不會丟失任何已經成功執行的命令數據 2、everysec(# 默認)服務器每一秒將緩沖區里面的命令寫入到硬盤里面,這種模式下,服務器即使遭遇意外停機,最多只丟失1秒的數據 3、no服務器不主動將命令寫入硬盤,由操作系統決定何時將緩沖區里面的命令寫入到硬盤里面,丟失命令數量不確定# 運行速度比較 always:速度慢 everysec和no都很快,默認值為everysec

AOF文件中是否會產生很多的冗余命令?

為了讓AOF文件的大小控制在合理范圍,避免胡亂總長,redis提供了AOF重寫功能,通過這個功能,服務器可以產生一個新的AOF文件-- 新的AOF文件記錄的數據庫數據和原由的AOF文件記錄的數據庫數據完全一樣-- 新的AOF文件會使用盡可能少的命令來記錄數據庫數據,因此新的AOF文件的提及通常會小很多-- AOF重寫期間,服務器不會被阻塞,可以正常處理客戶端發送的命令請求

示例

原有AOF文件重寫后的AOF文件
select 0SELECT 0
sadd myset peiqiSADD myset peiqi qiaozhi danni
sadd myset qiaozhiSET msg ‘hello tarena’
sadd myset danniRPUSH mylist 2 3 5
sadd myset lingyang
INCR number
INCR number
DEL number
SET message ‘hello world’
SET message ‘hello tarena’
RPUSH mylist 1 2 3
RPUSH mylist 5
LPOP mylist

AOF文件重寫方法觸發

1、客戶端向服務器發送BGREWRITEAOF命令127.0.0.1:6379> BGREWRITEAOFBackground append only file rewriting started2、修改配置文件讓服務器自動執行BGREWRITEAOF命令auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb# 解釋1、只有當AOF文件的增量大于100%時才進行重寫,也就是大一倍的時候才觸發# 第一次重寫新增:64M# 第二次重寫新增:128M# 第三次重寫新增:256M(新增128M)

RDB和AOF持久化對比

RDB持久化AOF持久化
全量備份,一次保存整個數據庫增量備份,一次保存一個修改數據庫的命令
保存的間隔較長保存的間隔默認為一秒鐘
數據還原速度快數據還原速度一般,冗余命令多,還原速度慢
執行SAVE命令時會阻塞服務器,但手動或者自動觸發的BGSAVE不會阻塞服務器無論是平時還是進行AOF重寫時,都不會阻塞服務器
更適合數據備份更適合用來保存數據,通常意義上的數據持久化,在appendfsync always模式下運行時
# 用redis用來存儲真正數據,每一條都不能丟失,都要用always,有的做緩存,有的保存真數據,我可以開多個redis服務,不同業務使用不同的持久化,新浪每個服務器上有4個redis服務,整個業務中有上千個redis服務,分不同的業務,每個持久化的級別都是不一樣的。

Redis主從復制

  • 定義
1、一個Redis服務可以有多個該服務的復制品,這個Redis服務成為master,其他復制品成為slaves 2、網絡正常,master會一直將自己的數據更新同步給slaves,保持主從同步 3、只有master可以執行寫命令,slave只能執行讀命令
  • 作用
分擔了讀的壓力(高并發)
  • 原理
從服務器執行客戶端發送的讀命令,比如GET、LRANGE、SMEMMBERS、HGET、ZRANGE等等,客戶端可以連接slaves執行讀請求,來降低master的讀壓力
  • 兩種實現方式

    方式一(命令行實現1)

    redis-server --slaveof

# 從服務端 redis-server --port 6300 --slaveof 127.0.0.1 6379 # 從客戶端 redis-cli -p 6300 127.0.0.1:6300> keys * # 發現是復制了原6379端口的redis中數據 127.0.0.1:6380> set mykey 123 (error) READONLY You can't write against a read only slave. 127.0.0.1:6380> # 從服務器只能讀數據,不能寫數據

? 方式一(命令行實現2)

# 服務端啟動 redis-server --port 6380 # 客戶端連接 tarena@tedu:~$ redis-cli -p 6300 127.0.0.1:6300> keys * 1) "myset" 2) "mylist" 127.0.0.1:6300> set mykey 123 OK # 切換為從 127.0.0.1:6300> slaveof 127.0.0.1 6379 OK 127.0.0.1:6300> set newkey 456 (error) READONLY You can't write against a read only slave. 127.0.0.1:6300> keys * 1) "myset" 2) "mylist" # 再切換為主 127.0.0.1:6300> slaveof no one OK 127.0.0.1:6300> set name hello OK

方式二(修改配置文件)

# 修改配置文件 vi redis_6300.conf slaveof 127.0.0.1 6379 port 6300 # 啟動redis服務 redis-server redis_6300.conf # 客戶端連接測試 redis-cli -p 6300 127.0.0.1:6300> hset user_001 username guods (error) READONLY You can't write against a read only slave.

問題總結

1、一個Master可以有多個Slaves 2、Slave下線,只是讀請求的處理性能下降 3、Master下線,寫請求無法執行 4、其中一臺Slave使用SLAVEOF no one命令成為Master,其他Slaves執行SLAVEOF命令指向這個新的Master,從它這里同步數據 # 以上過程是手動的,能夠實現自動,這就需要Sentine哨兵,實現故障轉移Failover操作

演示

1、啟動端口6400redis,設置為6379的slaveredis-server --port 6400redis-cli -p 6400redis>slaveof 127.0.0.1 6379 2、啟動端口6401redis,設置為6379的slaveredis-server --port 6401redis-cli -p 6401redis>slaveof 127.0.0.1 6379 3、關閉6379redissudo /etc/init.d/redis-server stop 4、把6400redis設置為masterredis-cli -p 6401redis>slaveof no one 5、把6401的redis設置為6400redis的salveredis-cli -p 6401redis>slaveof 127.0.0.1 6400 # 這是手動操作,效率低,而且需要時間,有沒有自動的???

官方高可用方案Sentinel

Redis之哨兵 - sentinel

1、Sentinel會不斷檢查Master和Slaves是否正常 2、每一個Sentinel可以監控任意多個Master和該Master下的Slaves

案例演示

? **1、**環境搭建

# 共3臺redis的服務器,如果是不同機器端口號可以是一樣的 1、啟動6379的redis服務器sudo /etc/init.d/redis-server start 2、啟動6380的redis服務器,設置為6379的從redis-server --port 6380tarena@tedu:~$ redis-cli -p 6380127.0.0.1:6380> slaveof 127.0.0.1 6379OK 3、啟動6381的redis服務器,設置為6379的從redis-server --port 6381tarena@tedu:~$ redis-cli -p 6381127.0.0.1:6381> slaveof 127.0.0.1 6379

? **2、**安裝并搭建sentinel哨兵

# 1、安裝redis-sentinel sudo apt install redis-sentinel# 2、新建配置文件sentinel.conf port 26379 Sentinel monitor tedu 127.0.0.1 6379 1# 3、啟動sentinel 方式一: redis-sentinel sentinel.conf 方式二: redis-server sentinel.conf --sentinel# 將master的redis服務終止,查看從是否會提升為主 sudo /etc/init.d/redis-server stop # 發現提升6381為master,其他兩個為從 # 在6381上設置新值,6380查看 127.0.0.1:6381> set name tedu OK# 啟動6379,觀察日志,發現變為了6381的從 主從+哨兵基本就夠用了

sentinel.conf解釋

# sentinel監聽端口,默認是26379,可以修改 port 26379 # 告訴sentinel去監聽地址為ip:port的一個master,這里的master-name可以自定義,quorum是一個數字,指明當有多少個sentinel認為一個master失效時,master才算真正失效 sentinel monitor <master-name> <ip> <redis-port> <quorum>

博客項目解決高并發問題

1、在數據庫中創建庫 blog_server,指定字符編碼utf8

mysql -uroot -p123456 mysql>create database blog_server charset utf8;

2、同步數據庫,并在user_profile中插入表記錄

1、python3 manage.py makemigrations 2、python3 manage.py migrate 3、insert into user_profile values ('guoxiaonao','guoxiaonao','guoxiaonao@tedu.cn','123456','aaaaaaaa','bbbbbbbb','cccccccc');

3、啟動django項目,并找到django路由測試 test_api函數

1、python3 manage.py runserver 2、查看項目的 urls.py 路由,打開firefox瀏覽器輸入地址:http://127.0.0.1:8000/test_api # 返回結果: code 200

4、在數據庫表中創建測試字段score

1、user/models.py添加:score = models.IntegerField(verbose_name=u'分數',null=True,default=0) 2、同步到數據庫python3 manage.py makemigrations userpython3 manage.py migrate user 3、到數據庫中確認查看

3、在blog_server/views.py中補充 test_api 函數,對數據庫中score字段進行 +1 操作

from user.models import UserProfile def test_api(request):#JsonResponse 1,將返回內容序列化成json#2,response中添加 content-type: application/json# return JsonResponse({'code':200})u = UserProfile.objects.get(username='guoxiaonao')u.score += 1u.save()return JsonResponse({'msg': 'test is ok'})

4、啟多個服務端,模擬30個并發請求

(1)在tools中新建py文件 test_api.py,模擬30個并發請求

import threading import requests import randomdef getRequest():url='http://127.0.0.1:8000/test_api'url2='http://127.0.0.1:8001/test_api'get_url = random.choice([url, url2])requests.get(get_url)ts = [] for i in range(30):t=threading.Thread(target=getRequest,args=())ts.append(t)if __name__ == '__main__':for t in ts:t.start()for t in ts:t.join()

(2) python3 test_api.py

(3) 在數據庫中查看 score 字段的值

并沒有+30,而且沒有規律,每次加的次數都不同,如何解決???

解決方案:redis分布式鎖

def test_api(request):# 解決方法二:redis分布式鎖import redispool = redis.ConnectionPool(host='localhost', port=6379, db=0)r = redis.Redis(connection_pool=pool)try:with r.lock('guoxiaonao', blocking_timeout=3) as lock:u = UserProfile.objects.get(username='guoxiaonao')u.score += 1u.save()except Exception as e:print('lock is failed')

day04筆記

Redis事務

特點

1. 單獨的隔離操作:事務中的所有命令會被序列化、按順序執行,在執行的過程中不會被其他客戶端發送來的命令打斷 2. 不保證原子性:redis中的一個事務中如果存在命令執行失敗,那么其他命令依然會被執行,沒有回滾機制

事務命令

1、MULTI # 開啟事務 2、命令1 # 執行命令 3、命令2 ... ... 4、EXEC # 提交到數據庫執行 4、DISCARD # 取消事務

使用步驟

# 開啟事務 127.0.0.1:6379> MULTI OK # 命令1入隊列 127.0.0.1:6379> INCR n1 QUEUED # 命令2入隊列 127.0.0.1:6379> INCR n2 QUEUED # 提交到數據庫執行 127.0.0.1:6379> EXEC 1) (integer) 1 2) (integer) 1

事務中命令錯誤處理

# 1、命令語法錯誤,命令入隊失敗,直接自動discard退出這個事務這個命令在執行調用之前會發生錯誤。例如,這個命令可能有語法錯誤(錯誤的參數數量,錯誤的命令名),或者其他某些緊急的狀態,如內存溢出處理方案:客戶端發生了第一個錯誤情況,在exec執行之前發生的。通過檢查隊列命令返回值:如果這個命令回答這個隊列的命令是正確的,否者redis會返回一個錯誤。如果那里發生了一個隊列命令錯誤,大部分客戶端將會退出并丟棄這個事務# 2、命令語法沒錯,但類型操作有誤,則事務執行調用之后失敗,無法進行事務回滾從我們施行了一個由于錯誤的value的key操作(例如對著String類型的value施行了List命令操作)處理方案:發生在EXEC之后的是沒有特殊方式去處理的:即使某些命令在事務中失敗,所有的其他命令都將會被執行。 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set num 10 QUEUED 127.0.0.1:6379> LPOP num QUEUED 127.0.0.1:6379> exec 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> get num "10" 127.0.0.1:6379>

為什么redis不支持事務回滾

  • 觀點
1、Redis的內部極其簡單和快速,來源于它不需要回滾功能 2、在生產環境中,通常回滾并不能解決來自編程的錯誤。舉個例子,你本來想+1,卻+2了,又或者+在錯誤的類型上。回滾并不能解決。由于無法提供一個避免程序員自己的錯誤,而這種錯誤在產品中并不會出現,所以選擇一個簡單和快速的方法去支持回滾這個事務

pipeline補充

python使用pipeline()與execute()批量進行批量操作

作用:減少數據庫的IO來提升數據庫的性能

pipe = r.pipeline() pipe.REDIS命令 pipe.REDIS命令 pipe.execute()

示例

import redis# 創建連接池并連接到redis pool = redis.ConnectionPool(host = '192.168.153.130',db=0,port=6379) r = redis.Redis(connection_pool=pool)# 第一組 pipe = r.pipeline() pipe.set('fans',50) pipe.incr('fans') pipe.incrby('fans',100) pipe.execute()# 第二組 pipe.get('fans') pipe.get('pwd') # [b'151', b'123'] result = pipe.execute() print(result)

Redis常見問題匯總

  • Redis優點
1、讀寫速度快. 數據存放在內存中 2、支持數據類型豐富,string,hash,list,set,sorted 3、支持事務,watch 4、可以用于緩存,消息隊列,按key設置過期時間,到期后自動刪除 5、支持數據持久化(將內存數據持久化到磁盤),支持AOF和RDB兩種持久化方式,從而進行數據恢復操作,可以有效地防止數據丟失 5、支持主從(master-slave)復制來實現數據備份,主機會自動將數據同步到從機
  • 來介紹一下redis中的數據類型

    類型特點使用場景
    string簡單key-value類型,value可為字符串和數字常規計數(微博數, 粉絲數等功能)
    hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象存儲部分可能需要變更的數據(比如用戶信息)
    list有序可重復列表關注列表,粉絲列表,消息隊列等
    set無序不可重復列表存儲并計算關系(如微博,關注人或粉絲存放在集合,可通過交集、并集、差集等操作實現如共同關注、共同喜好等功能)
    sorted set每個元素帶有分值的集合各種排行榜
  • redis中的持久化方案

# RDB 快照形式,定期把內存中的數據保存到磁盤。Redis默認支持的持久化方案。速度快但是服務器斷電的時候會丟失部分數據# AOF 把所有對redis數據庫增刪改操作的命令保存到文件中。數據庫恢復時把所有的命令執行一遍即可。 # 兩種持久化方案同時開啟使用AOF文件來恢復數據庫.能保證數據的完整性,但是速度慢。默認使用AOF恢復數據
  • 使用過Redis分布式鎖么,它是什么回事?

    從redis2.8開始,set命令集成了兩個參數,nx和ex,先拿nx來爭搶鎖,搶到之后,再用ex參數給鎖加一個過期時間防止鎖忘記了釋放,造成死鎖 應用場景:秒殺活動進程1:set miaosha aaa nx ex 3 獲取鎖秒殺記錄 -1del miaosha進程2:set miaosha 111 nx ex 3 無法獲取鎖# 2.8以前是兩條命令,這樣容易造成死鎖 # setnx key value # 獲取鎖 # expier key 5 # 釋放鎖# 解決方法:redis分布式鎖import redispool = redis.ConnectionPool(host='localhost', port=6379, db=0)r = redis.Redis(connection_pool=pool)try:with r.lock('guoxiaonao', blocking_timeout=3) as lock:u = UserProfile.objects.get(username='yanxu')u.score += 1u.save()except Exception as e:print('lock is failed')return JsonResponse({"msg": 'test is ok'})
  • 緩存穿透

# 原理 緩存和數據庫都沒有的數據,而用戶反復發起請求, 如 假的用戶ID# 場景 比如發起為id為“-1”的數據或id為特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大# 解決方案:1、請求校驗,接口層增加校驗,如對id做基礎校驗,id<=0的直接攔截2、都無法取到數據時也可以將key-value對寫為key-null,緩存有效時間比如30秒左右,這樣可以防止攻擊用戶反復用同一個id暴力攻擊
  • 緩存擊穿

    # 原理 緩存沒有,數據庫有,一般是緩存時間到期, 順勢并發太大#解決方案 1、熱點數據不過期 2、上鎖: 重新設計緩存的使用方式,當我們通過key去查詢數據時,首先查詢緩存,如果沒有,就通過分布式鎖進行加鎖,取得鎖的進程查DB并設置緩存,然后解鎖;其他進程如果發現有鎖就等待,然后等解鎖后返回緩存數據或者再次查詢DB
  • 緩存雪崩

    # 原理 緩存中大批量數據過期,導致瞬時大批量不同請求注入DB# 解決方案 解決方案 1、緩存設置隨機時間(避免緩存設置相近的有效期;為有效期增加隨機值) 2、熱點數據不過期
  • 哈希碰撞

    # 在位置處發生哈希碰撞 name --> 哈希處理 --> 哈希值 --> 哈希函數算值找位置(比如是30) age --> 哈希處理 --> 哈希值 --> 哈希函數算值如果算出來的也是30 則發生了哈希碰撞

總結

以上是生活随笔為你收集整理的redis学习笔记,常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

欧美精品在线观看一区 | 久久成人高清视频 | 操少妇视频 | 久久精品国产99国产 | 久久久综合色 | 丁香婷婷激情国产高清秒播 | 二区三区毛片 | 亚洲精品高清一区二区三区四区 | 国产成人精品一区二区在线 | 国产伦理久久精品久久久久_ | 日韩一区在线播放 | 五月天六月婷婷 | 国产一二三四在线视频 | 久草热久草视频 | 伊在线视频| 91麻豆精品 | 成人毛片在线观看 | 在线天堂中文在线资源网 | 五月天亚洲婷婷 | 久久精品欧美日韩精品 | 久久与婷婷 | 欧美黑人性猛交 | 国产精品久久久久久久妇 | 黄污视频网站 | 久草视频在线资源 | 丁香色婷| 日本中文字幕电影在线免费观看 | 亚洲婷婷在线视频 | 中文字幕成人网 | 欧美久久九九 | 午夜色场 | 中文一区二区三区在线观看 | 五月婷网站| 精品国产乱码久久久久久天美 | 久久精品日产第一区二区三区乱码 | 午夜精品久久久久久久99婷婷 | 青青草华人在线视频 | 国产亚洲精品女人久久久久久 | 国产午夜精品一区二区三区嫩草 | 黄色片网站大全 | 亚洲一区视频在线播放 | 欧美日韩精品免费观看视频 | 深夜免费网站 | 人人爽人人爽人人爽 | 麻豆视频大全 | 成人 国产 在线 | 91中文字幕视频 | 一级免费看视频 | 中文网丁香综合网 | 亚洲精品网址在线观看 | 成年人免费av网站 | 激情在线网 | 免费av一级电影 | 91精品一 | 国产亚洲精品久久久久久网站 | 精品国产乱码久久久久久三级人 | 蜜臀av夜夜澡人人爽人人桃色 | 免费裸体视频网 | 在线亚洲天堂网 | 久久成人国产精品入口 | 日日操网 | 天天插天天射 | 日韩精品免费一区二区三区 | 日韩精品在线免费观看 | 日韩欧美在线观看一区二区三区 | 狠狠干中文字幕 | 成人污视频在线观看 | 精品视频一区在线 | 亚洲精品高清在线 | 午夜av不卡| 成人小视频免费在线观看 | 97在线观看免费 | 日韩精品视频免费看 | 亚洲成人av片在线观看 | 欧美乱码精品一区 | 久久艹欧美 | 亚洲午夜久久久久 | www.亚洲在线 | 亚洲免费av在线 | 麻豆国产精品永久免费视频 | 精品国产欧美一区二区 | 日韩一区二区三区高清免费看看 | 成年人免费在线观看 | 香蕉网在线 | 国产精品乱码一区二区视频 | 婷婷爱五月天 | 国产精品区免费视频 | 国产精品亚洲精品 | 欧美va天堂va视频va在线 | 成年人在线免费看片 | 国产成人高清在线 | 开心丁香婷婷深爱五月 | 国产精品久久久一区二区三区网站 | 91粉色视频 | 国产在线一卡 | 国产又粗又猛又色又黄网站 | 亚洲另类视频 | 午夜性福利 | 丁香视频全集免费观看 | 在线播放视频一区 | 波多在线视频 | 天天干天天操天天拍 | 黄色在线免费观看网站 | 色综合久久久久综合99 | 国产精品成| 久久国产一二区 | 国产69精品久久久久99尤 | 最近日本韩国中文字幕 | 91精品办公室少妇高潮对白 | 久久综合欧美精品亚洲一区 | 日韩电影久久 | 亚洲一区二区三区精品在线观看 | www黄色com | 一区二区三区影院 | 日韩av免费网站 | 超碰在线1 | 亚洲欧美视频在线播放 | 日韩成人精品一区二区三区 | 国产日产欧美在线观看 | 日韩在线观看视频网站 | 中文字幕色婷婷在线视频 | 夜夜操网站 | 国产高清视频在线免费观看 | 久久一区二区三区超碰国产精品 | 精品久久91 | 久久成人免费电影 | 在线视频黄 | 久艹在线观看视频 | 97视频在线免费观看 | 天天草天天色 | 久久午夜电影院 | 国产精品欧美精品 | 91香蕉视频好色先生 | 国产麻豆果冻传媒在线观看 | 91精品欧美 | 草久在线观看视频 | 亚洲国产网站 | 国产视频一二三 | 亚洲最新av在线网站 | 99性视频 | 天天干天天做天天操 | 欧美日韩一区二区三区视频 | 草草草影院 | 一区二区三区四区精品视频 | 国产精品色婷婷视频 | 中文字幕 国产精品 | 中文字幕久久网 | 91视频免费视频 | 成人综合婷婷国产精品久久免费 | 欧美一级久久久 | 欧美 日韩 视频 | 91大神电影 | 色综久久 | 国产色资源 | 久久99久久99免费视频 | 国产成人一区二 | 久久久久久久影院 | 久久美女免费视频 | 午夜国产福利在线观看 | 国产精品理论片 | 国产精品久久久久毛片大屁完整版 | 中文字幕免费一区 | 天天操天天拍 | 久久久久国产精品视频 | 五月天天色 | av大全免费在线观看 | 黄色a大片| 在线观看成人小视频 | 五月婷婷中文 | 亚洲人片在线观看 | 91久久在线观看 | 中文字幕a∨在线乱码免费看 | 人人干人人艹 | 日本在线观看视频一区 | 久久久久久久久电影 | 亚洲视频播放 | a在线免费 | 91视频3p | 91在线文字幕 | 一区二区三区免费在线观看视频 | 人人爽人人射 | 天天玩天天干 | 在线亚洲天堂网 | 在线视频观看国产 | 91福利影院在线观看 | 久久精品福利视频 | 精品久久久久久久久中文字幕 | 久久九九免费视频 | av免费观看在线 | 亚洲欧美国产日韩在线观看 | 911在线| 99r精品视频在线观看 | av免费观看高清 | 免费看黄在线看 | 亚洲午夜小视频 | 久久夜夜夜 | 国产日韩在线播放 | 亚洲精品视频免费 | 在线观看视频你懂 | 亚洲国产成人精品在线 | 国产亚洲在 | 日韩免费一区二区在线观看 | www在线免费观看 | 丁香av | 成+人+色综合 | 精品国产一区二区三区日日嗨 | 中文字幕在线观看av | 中文字幕在线播放视频 | 婷婷六月天丁香 | 欧美夫妻性生活电影 | 日日干天天爽 | a色视频| 91麻豆操 | 99国产在线| 国产视频欧美视频 | 99视频在线精品免费观看2 | 亚洲日本va在线观看 | 国产一区二区在线播放 | 狠狠综合久久av | 中文字幕在线观看免费观看 | 99免费看片 | 国产一级二级三级在线观看 | 国产成人精品一区二区三区网站观看 | 欧美综合色在线图区 | 国产精品国产亚洲精品看不卡15 | 久久久久久久久久亚洲精品 | 开心激情综合网 | 日韩在线不卡 | 综合激情网 | 国产一线二线三线在线观看 | 日本免费一二三区 | 亚洲一级特黄 | 成人av电影在线播放 | 日韩h在线观看 | 成人作爱视频 | 久久精品国产精品亚洲精品 | 婷婷激情网站 | 日本性生活免费看 | 国产拍揄自揄精品视频麻豆 | 人人干人人搞 | 99久久精品久久久久久动态片 | 亚洲精品动漫在线 | 狠狠色狠狠色合久久伊人 | 日韩电影中文字幕在线 | 久爱精品在线 | 欧美日韩高清在线 | 美腿丝袜一区二区三区 | 亚洲国产丝袜在线观看 | 91亚洲精品久久久蜜桃网站 | 狠狠操综合 | 高清不卡一区二区在线 | 国产99久久久国产精品成人免费 | 亚州欧美视频 | 久久艹艹 | 成人午夜影视 | 成人免费网站视频 | 久久综合中文字幕 | 日韩av在线看 | 国产精美视频 | 黄色在线看网站 | 综合网伊人 | 91人人爽人人爽人人精88v | 久久免费视频网站 | 国产色一区 | 日韩美女免费线视频 | 亚洲影视九九影院在线观看 | 日韩精品网址 | 亚洲专区路线二 | 激情视频国产 | 国产亚洲观看 | 天天综合网~永久入口 | 国产成人91 | 日韩在线电影一区二区 | 香蕉在线影院 | 色婷婷激情电影 | 玖玖视频网 | 欧美日韩裸体免费视频 | 在线中文字幕播放 | 99情趣网视频 | 国产免费成人 | 美女黄色网在线播放 | 亚洲精品美女久久久 | 亚洲欧美乱综合图片区小说区 | 四虎8848免费高清在线观看 | 久久久网页 | av先锋影音少妇 | 最近日韩免费视频 | 久久久久久久久久伊人 | 91精品国产入口 | 午夜精品久久久久久久久久久久久久 | 午夜精品久久久久久中宇69 | 制服丝袜一区二区 | 国产尤物一区二区三区 | 国产精品视频免费 | 国产亚洲婷婷免费 | 免费人成在线观看 | 日本久久久久久久久久久 | 中文字幕精品一区二区三区电影 | 97在线视频免费观看 | 精品亚洲视频在线 | 精品一区精品二区 | 国产精品麻豆视频 | 久久久久久久久影视 | 伊人午夜| 超碰在线日本 | 亚洲日本欧美在线 | 亚洲国产天堂av | 天天色天天干天天 | 激情五月婷婷 | 国产精品久久久久久久妇 | 激情网站网址 | 国产一级特黄毛片在线毛片 | 国产最新在线观看 | 免费高清国产 | 99精品国产一区二区三区不卡 | 久久兔费看a级 | 奇米影视777四色米奇影院 | 天天色综合天天 | 久草久| 国产 中文 日韩 欧美 | 精品国产乱码久久久久久天美 | 久久老司机精品视频 | 最近中文字幕在线播放 | 国产精品久久av | 欧美一级日韩三级 | 97综合在线| 天堂久色 | 91麻豆网站 | 国产精品一区二区中文字幕 | 日本h视频在线观看 | 五月开心六月伊人色婷婷 | 亚洲激情综合 | 国产精品18久久久久vr手机版特色 | 久久在线观看视频 | 亚洲精品国产精品国自产 | 国产精品久久久久久久久久新婚 | 黄色av观看 | 久久字幕网 | 国产精品一区二区三区四 | av中文字幕免费在线观看 | 天天爱天天射 | 亚洲理论视频 | 久久亚洲私人国产精品 | 天天干人人 | 久久久精品 一区二区三区 国产99视频在线观看 | 黄色小说免费观看 | 国产一二区免费视频 | 一级黄色av| 免费黄色看片 | 在线国产一区二区 | 久久免费视频在线观看 | 又黄又刺激又爽的视频 | 国产99久久精品一区二区永久免费 | 天天干天天拍天天操 | 国产精品久久电影观看 | 天天干天天操天天射 | 色999视频| 中文字幕在线日本 | 深夜激情影院 | 国产精品久久久久久久久久免费看 | 久久久九九 | 玖玖玖在线 | 91中文字幕在线播放 | 午夜影视一区 | 中文字幕一区二区三区四区久久 | 国产99久久久精品视频 | 日韩免费小视频 | 黄色大片网 | 免费进去里的视频 | 婷婷伊人综合亚洲综合网 | 成人va在线观看 | www.干| 九九热免费视频在线观看 | 夜色资源站国产www在线视频 | 99999精品视频 | 99精品在线看 | 九九久久久久久久久激情 | 美女又爽又黄 | 久久久久久久99精品免费观看 | 亚洲精品国产区 | 天天干天天干天天色 | 天天色天 | 美女黄色网在线播放 | 911免费视频 | 日韩中文在线播放 | 91精品免费看 | 日本精品视频在线观看 | 国产一区国产精品 | 青春草免费在线视频 | 国产一区麻豆 | 激情图片久久 | 豆豆色资源网xfplay | 久久久久高清 | 黄色精品久久久 | 97国产在线| 开心激情五月网 | 九九精品毛片 | 99资源网 | 四虎影视成人 | 成人免费观看网站 | 69av久久| 国产美女精品人人做人人爽 | 国产乱码精品一区二区三区介绍 | 在线观看成年人 | 亚洲免费不卡 | 五月花婷婷 | 成人91免费视频 | 欧美日韩亚洲在线观看 | 五月婷婷综合久久 | 91传媒91久久久 | 一级片免费在线 | 欧美日韩在线视频一区二区 | 成人在线观看日韩 | 亚洲精品资源在线 | 国产亚洲va综合人人澡精品 | 国产玖玖在线 | 久久a国产 | av免费看电影 | 狠狠狠色丁香综合久久天下网 | 亚洲精品乱码久久久久久9色 | 国产黄色在线网站 | 玖玖爱免费视频 | 黄色一级免费 | 日韩系列在线 | 91麻豆精品91久久久久同性 | 免费看毛片网站 | 国产亚洲片 | 91精品视频在线看 | 91尤物国产尤物福利在线播放 | 成人av片在线观看 | 国产黄色片免费 | 亚洲 综合 激情 | 国产在线欧美在线 | 亚洲另类视频在线观看 | 久久久国产精品一区二区中文 | 日韩精品视频在线观看网址 | 免费进去里的视频 | 亚洲一区视频免费观看 | 成人av网站在线观看 | 日韩午夜在线观看 | 久久久999免费视频 日韩网站在线 | 久久综合视频网 | 国产色视频网站 | 色网站黄 | 久草国产在线观看 | 亚洲aaa级 | 国产视频在线观看一区 | 国产麻豆视频 | 免费国产视频 | 四虎成人精品在永久免费 | 日日干美女| 黄色av一级片 | 亚洲视频六区 | 在线免费亚洲 | 国产精品va最新国产精品视频 | 免费看的黄色 | 久久久精品欧美 | 国产成人精品国内自产拍免费看 | 免费午夜在线视频 | 狠狠躁夜夜躁人人爽超碰91 | 精品91久久久久 | 精品国产一区二区三区久久久久久 | 亚洲精品福利在线观看 | aa级黄色大片 | 久久亚洲私人国产精品va | 91在线精品视频 | 久99久精品视频免费观看 | 波多野结衣在线播放视频 | 欧美色婷 | 五月综合在线观看 | 在线观看岛国片 | 久久久久亚洲精品男人的天堂 | 欧美aaa一级 | 天天干天天弄 | 日日干av| 中文亚洲欧美日韩 | 91精品久久久久久久久久入口 | 中文字幕免费高清在线观看 | 九九视频精品在线 | 成年人免费在线 | 男女免费av | 在线观看日韩国产 | 久久a v视频 | 狠狠色丁香婷婷综合久小说久 | 欧美日韩精品免费观看视频 | 夜添久久精品亚洲国产精品 | 91污在线 | 女人高潮特级毛片 | 亚洲精品国产精品99久久 | 亚洲视频 在线观看 | 国产精品第二十页 | 色在线最新 | 免费97视频 | 中文在线字幕免费观 | 天天射天天搞 | 亚洲自拍av在线 | 最近2019中文免费高清视频观看www99 | 一本一本久久a久久精品综合妖精 | 国产视频久久 | 中文字幕一区二区三区久久 | 亚洲欧美日韩精品一区二区 | 国产 日韩 在线 亚洲 字幕 中文 | 在线看国产日韩 | www178ccom视频在线| 人人搞人人爽 | 国产最新在线视频 | 久久久久久久久电影 | 欧美污污网站 | 日韩精品一区二区三区免费视频观看 | 欧美日本一区 | 黄色av成人在线观看 | 国产精品美女久久久久久2018 | 久久99久久99免费视频 | 亚洲女人天堂成人av在线 | 五月婷婷中文网 | 91九色网站| av成人动漫在线观看 | 91最新在线 | 又黄又爽又色无遮挡免费 | 日韩成片 | 亚洲天堂网在线视频 | 日本不卡一区二区 | a视频在线观看免费 | 91麻豆免费版| 欧美性精品 | 欧美a级片免费看 | 日韩精品一区二区免费 | 中文在线字幕免费观 | av三级在线免费观看 | 国产小视频福利在线 | 国产真实精品久久二三区 | 区一区二区三在线观看 | 2000xxx影视 | 日本黄网站 | 久草成人在线 | 色在线免费 | 午夜影院先 | 国产一级精品在线观看 | 日韩中文字幕免费视频 | 国产亚洲精品久久久久动 | 99久久精品无码一区二区毛片 | 国产亚洲综合性久久久影院 | 97色狠狠 | 国产精品破处视频 | 中文字幕一区二区三区四区久久 | 欧美激情视频一区二区三区 | 国产在线观看你懂得 | 视频精品一区二区三区 | 成人综合婷婷国产精品久久免费 | 亚洲91精品在线观看 | 午夜少妇一区二区三区 | 国产香蕉视频在线播放 | 91亚洲精品乱码久久久久久蜜桃 | 日韩av中文字幕在线免费观看 | 91mv.cool在线观看| 一级黄色电影网站 | 午夜视频在线观看欧美 | 在线看av的网址 | 91秒拍国产福利一区 | 国产区免费 | 日本三级吹潮在线 | 日韩午夜大片 | 久草在线欧美 | 国产91亚洲 | 毛片在线播放网址 | 激情综合色播五月 | 超碰97人 | 日日爱av| 丝袜制服综合网 | 中文字幕中文中文字幕 | 精品欧美一区二区精品久久 | 国内久久精品视频 | 另类老妇性bbwbbw高清 | 激情五月婷婷丁香 | 免费看成年人 | 狠狠躁日日躁狂躁夜夜躁av | av看片在线观看 | 99中文字幕在线观看 | 久草在线一免费新视频 | 日韩色在线观看 | 国产拍揄自揄精品视频麻豆 | 麻豆果冻剧传媒在线播放 | 青春草视频 | 一区二区三区 中文字幕 | 久久玖 | 精品久久国产精品 | 日本中文一级片 | 久久99免费视频 | 亚洲视频 一区 | 黄色a级片在线观看 | 91精品在线免费 | 天天草天天爽 | 黄色a三级| 国产在线观看国语版免费 | 亚洲精品在线一区二区三区 | 久久99精品国产麻豆宅宅 | 91免费观看国产 | 99亚洲国产精品 | 91在线日本 | 欧洲视频一区 | 免费av电影网站 | 在线观看视频国产一区 | 国产a网站 | 91成人免费看片 | 欧美另类sm图片 | 国产女人40精品一区毛片视频 | 九草视频在线观看 | 国产精品久久久久四虎 | 91麻豆产精品久久久久久 | 91高清免费看 | 99情趣网视频 | 久久国产热视频 | 91超级碰 | 国产精品入口麻豆www | 精品主播网红福利资源观看 | 天天综合五月天 | 中文字幕国产精品一区二区 | 中文字幕一区二区三区视频 | 日本久久久精品视频 | 国内精品视频一区二区三区八戒 | 欧美xxxxx在线视频 | 久久黄色免费观看 | 一区二区欧美在线观看 | 天天超碰 | 亚洲影院国产 | 精品日韩中文字幕 | av电影在线观看 | 婷婷在线播放 | 国产精品一区二 | 国产精品1区2区3区在线观看 | 日本激情中文字幕 | 欧美最爽乱淫视频播放 | 在线91av | 五月天激情视频在线观看 | 精品美女久久久久久免费 | 亚州五月 | 在线日本看片免费人成视久网 | 亚洲精品成人免费 | 色婷婷九月| 97操碰| 在线视频18在线视频4k | 久操操 | 毛片精品免费在线观看 | 久久久国产毛片 | 极品久久久久久久 | av 一区二区三区 | 欧美日韩精品二区第二页 | av电影在线观看 | 亚洲黄色一级大片 | 亚洲一区在线看 | 成人资源在线播放 | 色综合天天爱 | 一区在线电影 | 美女网站色在线观看 | 91探花系列在线播放 | 人人艹视频 | www.亚洲精品在线 | 免费久久精品视频 | 免费精品视频在线 | 91在线日韩 | 五月天电影免费在线观看一区 | 就要干b | 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久久久久久久久久久av | 在线免费观看羞羞视频 | 久久久免费毛片 | 久草色在线观看 | 绯色av一区 | 欧美在线观看视频 | 天天操天天干天天操天天干 | 久久国产免 | 女人18片毛片90分钟 | 麻豆视频入口 | 亚洲精品777| 久久久国产高清 | 国产欧美精品在线观看 | 国产精品久久久久婷婷二区次 | 综合久久一本 | 国产精品久久久久久久久久直播 | 亚洲视频免费在线观看 | 99精品视频免费看 | 久久国产精品一区二区 | 日本激情中文字幕 | 激情视频一区二区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久99国产综合精品免费 | 亚洲狠狠婷婷综合久久久 | 午夜精品一区二区三区免费视频 | 国产精品一区二区三区99 | 免费三级av | 欧美日韩精品在线免费观看 | 国产精品视频大全 | 99精品美女| 国产亚洲婷婷 | 最新婷婷色 | 99视频免费观看 | 国产成人精品一区二区 | 国产偷在线 | 亚洲精品免费视频 | 丁香电影小说免费视频观看 | 狠狠亚洲 | www久久久 | 中文字幕av在线电影 | 黄网站免费看 | 亚洲国产影院av久久久久 | 精品av网站 | 久久久久久久久毛片精品 | 婷婷丁香在线观看 | 亚洲高清视频一区二区三区 | 在线看国产日韩 | 国产精品精品国产婷婷这里av | 在线观看免费一级片 | 黄色免费大片 | 日韩电影久久 | 美女网站视频免费都是黄 | 成人精品影视 | 亚洲黄色免费观看 | 日韩一区二区久久 | 中文字幕欧美日韩va免费视频 | 91免费的视频在线播放 | 亚洲一区二区三区四区在线视频 | 久久国产午夜精品理论片最新版本 | 日日爽日日操 | 在线免费黄网站 | 国产一区精品在线观看 | 久草精品视频在线播放 | 亚洲精品一区二区在线观看 | 中文字幕中文字幕在线中文字幕三区 | 久久久久久国产精品 | 国产精品9999 | 激情欧美一区二区三区免费看 | 99在线免费视频 | 国产精品免费不卡 | 亚洲激情 欧美激情 | 久久久久久久久久久国产精品 | 91久色蝌蚪| 天天拍天天爽 | 国产精品k频道 | 最近高清中文在线字幕在线观看 | 亚洲精品乱码久久久久 | 一性一交视频 | 激情五月播播久久久精品 | 97超碰在线人人 | 国产亚洲精品久久久久久移动网络 | 狠狠操.com | 国产视频精品网 | 欧美午夜久久久 | 国产视频不卡一区 | 伊人成人久久 | 久久三级毛片 | 中文字幕在线高清 | 亚洲黄色片一级 | 香蕉日日 | 偷拍区另类综合在线 | 国产精品18p | 天堂av高清 | 一区二区三区免费网站 | 九九热免费精品视频 | 亚洲精品午夜久久久久久久久久久 | 91九色精品国产 | 人人插人人艹 | 又黄又爽又色无遮挡免费 | 国产伦理精品一区二区 | 亚洲国产高清在线观看视频 | 狠狠88综合久久久久综合网 | 日韩天天综合 | 国产成人一区二区三区免费看 | 欧美一区影院 | 韩国av免费 | 中文在线字幕免费观 | 色99导航 | 久久久免费精品视频 | 国产一线在线 | 狠狠色狠狠色综合日日92 | 久久综合狠狠 | 天海翼一区二区三区免费 | 精品视频专区 | 1024在线看片 | 国产网站在线免费观看 | 美女视频黄是免费的 | 天天天天色综合 | 欧美粗又大 | 日韩av一区二区三区在线观看 | 婷婷激情五月综合 | 亚洲免费av网站 | 亚洲国产成人高清精品 | 亚洲一区二区黄色 | 五月婷婷色综合 | 久久久久久久久久久网 | 国产精品第二十页 | 亚洲经典中文字幕 | 深爱激情综合网 | 日韩欧美在线视频一区二区三区 | 亚洲特级片 | 夜夜爽88888免费视频4848 | 亚洲一区二区视频 | 日韩欧美亚州 | 日日夜夜中文字幕 | 国产精品视频在线观看 | av大片网址 | 久久精品理论 | 99精品视频免费 | 天天插狠狠干 | 天天色天 | 国产精品一区二区在线播放 | 亚洲精品天天 | 久久成人国产精品一区二区 | 国产高清视频免费在线观看 | 涩五月婷婷 | 最近2019中文免费高清视频观看www99 | 婷婷网在线| 午夜久久久久久久久久影院 | 国产成人精品久 | aav在线| 色综合久久五月天 | 亚洲精品美女久久久久 | 少妇bbb搡bbbb搡bbbb | 狠狠狠狠狠狠狠狠干 | 日本三级中文字幕在线观看 | 激情久久综合 | 美女网站在线观看 | 91综合视频在线观看 | 日韩资源在线观看 | 久久久精品 | 久久在线免费观看视频 | 日本三级国产 | 亚洲黄色免费在线 | 97在线成人| 精品国产乱码久久久久久1区二区 | 日日日网| 狠狠色丁香婷婷综合 | 国产精品久久久久久久久搜平片 | 岛国精品一区二区 | 亚洲成人蜜桃 | 久久激情视频 久久 | 国产理伦在线 | 黄色一级网 | 婷婷日| 成人久久18免费网站图片 | 九七视频在线观看 | 欧美激情视频一区 | 午夜av在线电影 | 日韩精品久久久免费观看夜色 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 又黄又刺激又爽的视频 | 亚洲黄网站 | 一区二区三区四区五区在线 | 日韩久久久久久久久 | 欧美成人亚洲 | 久久精品毛片 | 狠狠干狠狠色 | 成片免费 | 91久草视频| 国产高清 不卡 | 免费人做人爱www的视 | www国产亚洲精品久久麻豆 | 日韩高清www | 国产在线观看不卡 | 亚洲精品视频第一页 | 免费在线国产黄色 | 亚洲成av人电影 | 一区二区三区免费在线观看 | 综合中文字幕 | 999成人网 | 91精品播放| 日韩在线观看网站 | 五月婷在线观看 | 天天操夜夜操 | 日韩一区精品 | 久久午夜视频 | 91九色老| 亚洲视频免费视频 | 日韩一区正在播放 | 98久久| 免费福利视频导航 | 九九热免费精品视频 | 天堂av观看 | 99热.com | 久操视频在线观看 | 国产日韩精品一区二区在线观看播放 | 高清av网站 | 久色免费视频 | 不卡国产在线 | 精品视频不卡 | 就色干综合 | 亚洲日本韩国一区二区 | 婷婷丁香在线视频 | 久久不射电影院 | 亚洲视频一区二区三区在线观看 | 狠狠色伊人亚洲综合成人 | 97视频在线观看网址 | 91精品啪在线观看国产 | 91在线看视频免费 | 中文字幕在线观看一区二区 | 天天干天天插伊人网 | 美女网站视频色 | 一区二区三区在线影院 | 国精产品999国精产品岳 | 亚洲h在线播放在线观看h | 日本性视频 | 免费在线观看国产精品 | 欧美久久久一区二区三区 | 成人免费在线播放 | 99精品视频免费看 | 久久综合久久鬼 | 亚洲精品在线观看不卡 | 97色免费视频 | 精品91视频 | 欧美日产一区 | 国产精品18久久久 | 久久综合久久八八 | 欧美激情第一区 | av电影 一区二区 | 91超在线| 免费试看一区 | 九九热国产 | 久久在线免费视频 | 深夜成人av | 精品国模一区二区三区 | 久久精品欧美视频 | 99中文字幕在线观看 | 久艹视频免费观看 | 午夜婷婷综合 | 东方av在 | 精品夜夜嗨av一区二区三区 | 日韩av电影中文字幕在线观看 | 国产精品高清在线 | 国产成人一区二区三区 | 久久精品成人 | 国内精品久久久久影院男同志 | 美女网站免费福利视频 | 最新成人av| 日本中文在线 | 国产五月色婷婷六月丁香视频 | 在线观看日本高清mv视频 | 成年人黄色大片在线 | 国产九九热 | 在线国产小视频 | 欧美一区二区三区在线 | 国产片网站 | 欧美特一级 | 欧美日韩在线精品一区二区 | 日韩中文字幕91 | 亚洲免费观看在线视频 | 在线看v片 | 99久久精品日本一区二区免费 | 成人欧美日韩国产 | 日韩在线三区 | 天天射网 | 国产亚洲资源 | 天天操天天谢 | 国产免费又爽又刺激在线观看 | 欧美精品久久久久久久久久 | 日本精品久久久久影院 | 日韩精品一区二区免费 | 色狠狠干 | 美女久久 | 婷婷色在线 | 国产精品日韩在线观看 | 国产视频一区二区在线播放 | 欧美日韩裸体免费视频 | 国产三级精品在线 | 高清有码中文字幕 | 天天干天天干天天 | 国产成人久| 日韩电影中文,亚洲精品乱码 | 欧美午夜久久 | 午夜精品一区二区国产 | 国产高清在线免费视频 | 久久久久久久国产精品影院 | 亚在线播放中文视频 | 最新久久免费视频 | 久久免费成人精品视频 | 日韩一区二区三区免费视频 | 天天插一插 | 91亚洲国产成人久久精品网站 | 99热在线观看免费 | 免费av看片 | 国产一级特黄毛片在线毛片 | 日韩欧美在线视频一区二区 | 日韩欧美高清 | 国产精品黄色在线观看 | 97视频入口免费观看 | 亚洲国产免费网站 | 欧美在线一二区 | 在线观看中文字幕一区二区 | 欧美综合在线观看 | 精品久久久久久久久中文字幕 | 97看片吧 | 国产精品乱码久久久久久1区2区 | 99国产精品免费网站 | 亚洲精品乱码久久久久久高潮 | 国产精品美女免费看 | 丝袜美腿在线播放 | 欧美一级视频在线观看 | 免费亚洲视频在线观看 | 国产高清一区二区 | 激情深爱五月 |