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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

發布時間:2023/12/31 数据库 32 豆豆

文章目錄

  • 一、要求:
  • 二、知識總結
    • 緩存雪崩
      • 解決方案
    • docker中redis分片集群搭建
      • 配置好配置文件
        • redis-6380.conf
        • redis-6381.conf
        • redis-6382.conf
        • redis-6383.conf
        • redis-6384.conf
        • redis-6385.conf
      • 將conf_cluster文件夾移動到對應位置
      • docker中運行對應的redis容器
      • docker中創建分片集群
    • springboot項目訪問redis分片集群
    • 緩存擊穿
      • 什么是緩存擊穿
      • 解決方案
      • 互斥鎖機制
        • 互斥鎖原理
          • (1) 利用互斥鎖處理緩存擊穿問題的邏輯流程
          • (2) 使用redis 的setnx 命令來實現
        • 互斥鎖代碼實現
    • docker中redis哨兵結構搭建
      • 關于哨兵結構
      • 配置配置文件
        • redis_6390.conf
        • redis_6391.conf
        • redis_6392.conf
        • redis_26390.conf
        • redis_26391.conf
        • redis_26392.conf
      • 把配置文件文件夾移動到對應位置
      • docker中創建主從結構對應容器
        • 啟動主節點(redis_master_6390)
        • 啟動從節點1(redis_slave1_6391)
        • 啟動從節點2(redis_slave2_6392)
        • 查詢主從結構是否成功
      • docker中創建哨兵結構對應容器
        • 啟動哨兵節點1(redis_sentinel1_26390)
        • 啟動哨兵節點2(redis_sentinel2_26391)
        • 啟動哨兵節點3(redis_sentinel3_26392)
        • 查詢哨兵結構是否搭建成功
    • springboot項目訪問redis哨兵集群
      • 配置文件配置
      • 配置主從讀寫分離(可選)
  • 三、經驗總結和報錯處理
    • 關于docker啟動容器后秒退問題處理
    • 關于云服務器端口開放問題
    • 關于哨兵結構與分片集群
  • 四、相關代碼
    • application.yml
      • 訪問分片集群版
      • 訪問哨兵結構版:
    • com.example.service.impl.StudentServiceImpl
  • 五、運行結果
    • 1.搭建redis分片集群,并實現springboot對集群的訪問
    • 2.搭建redis哨兵集群,并實現springboot對哨兵集群的訪問

一、要求:

  • 搭建redis分片集群,并實現springboot對分片集群的訪問;
  • 搭建redis哨兵模式,并實現springboot對哨兵集群的訪問;

二、知識總結

緩存雪崩

解決方案

常用的緩存雪崩的解決方案包括:

  • 給不同的 Key 的 TTL 添加隨機值
  • 利用 Redis 集群提高服務的可用性
  • 給緩存業務添加降級限流策略
  • 給業務添加多級緩存

上一講(非關系型數據庫技術課程 第十一周作業(SpringBoot項目中使用Redis作為數據緩存,Redis的緩存機制,數據一致性、緩存穿透和緩存雪崩等問題的處理))中
提供了 給不同的 Key 的 TTL 添加隨機值 方案解決緩存雪崩問題的實現,本講中將實現搭建redis分片集群來解決緩存雪崩問題。

docker中redis分片集群搭建

配置好配置文件

將配置文件和data文件夾都放在一個"conf_cluster"文件夾中,如圖:

data文件夾中要先新建6380-6385對應的空文件夾:

開始配置文件的配置:

注意
配置文件內容中cluster-announce-ip要根據自己主機的實際ip地址進行配置(下面的配置文件中類似120.25.223.26都要改為自己對應主機的ip)

windows系統電腦作為主機可以在cmd命令行窗口中輸入ipconfig查看ip地址
云服務器中搭建則需要設置服務器外網ip

redis-6380.conf

port 6380cluster-enabled yes cluster-config-file nodes-6380.confcluster-node-timeout 5000cluster-announce-ip 120.25.223.26 cluster-announce-port 6380 cluster-announce-bus-port 16380 appendonly yes

redis-6381.conf

port 6381cluster-enabled yes cluster-config-file nodes-6381.confcluster-node-timeout 5000 appendonly yes cluster-announce-ip 120.25.223.26 cluster-announce-port 6381 cluster-announce-bus-port 16381

redis-6382.conf

port 6382cluster-enabled yes cluster-config-file nodes-6382.confcluster-node-timeout 5000 appendonly yes cluster-announce-ip 120.25.223.26 cluster-announce-port 6382 cluster-announce-bus-port 16382

redis-6383.conf

port 6383cluster-enabled yes cluster-config-file nodes-6383.confcluster-node-timeout 5000 appendonly yes cluster-announce-ip 120.25.223.26 cluster-announce-port 6383 cluster-announce-bus-port 16383

redis-6384.conf

port 6384cluster-enabled yes cluster-config-file nodes-6384.confcluster-node-timeout 5000 appendonly yes cluster-announce-ip 120.25.223.26 cluster-announce-port 6384 cluster-announce-bus-port 16384

redis-6385.conf

port 6385cluster-enabled yes cluster-config-file nodes-6385.confcluster-node-timeout 5000 appendonly yes cluster-announce-ip 120.25.223.26 cluster-announce-port 6385 cluster-announce-bus-port 16385

將conf_cluster文件夾移動到對應位置

這里要把conf_cluster文件夾移動到待會docker運行容器時對應的掛載目錄,比如我將該文件夾移動到主機(即“宿主機”)的/mydata/路徑中,則后面運行docker容器時的掛載目錄就如下配置:

-v /mydata/conf_cluster/data/6380:/data -v /mydata/conf_cluster/redis-6380.conf:/etc/redis/redis-6380.conf

這里的掛載目錄要按自己實際路徑進行配置

docker中運行對應的redis容器

創建各redis容器的命令
redis_6380:

docker run -id --name redis_6380 -p 6380:6380 -p 16380:16380 --privileged=true -v /mydata/conf_cluster/data/6380:/data -v /mydata/conf_cluster/redis-6380.conf:/etc/redis/redis-6380.conf redis redis-server /etc/redis/redis-6380.conf

redis_6381:

docker run -id --name redis_6381 -p 6381:6381 -p 16381:16381 --privileged=true -v /mydata/conf_cluster/data/6381:/data -v /mydata/conf_cluster/redis-6381.conf:/etc/redis/redis-6381.conf redis redis-server /etc/redis/redis-6381.conf

redis_6382:

docker run -id --name redis_6382 -p 6382:6382 -p 16382:16382 --privileged=true -v /mydata/conf_cluster/data/6382:/data -v /mydata/conf_cluster/redis-6382.conf:/etc/redis/redis-6382.conf redis redis-server /etc/redis/redis-6382.conf

redis_6383:

docker run -id --name redis_6383 -p 6383:6383 -p 16383:16383 --privileged=true -v /mydata/conf_cluster/data/6383:/data -v /mydata/conf_cluster/redis-6383.conf:/etc/redis/redis-6383.conf redis redis-server /etc/redis/redis-6383.conf

redis_6384:

docker run -id --name redis_6384 -p 6384:6384 -p 16384:16384 --privileged=true -v /mydata/conf_cluster/data/6384:/data -v /mydata/conf_cluster/redis-6384.conf:/etc/redis/redis-6384.conf redis redis-server /etc/redis/redis-6384.conf

redis_6385:

docker run -id --name redis_6385 -p 6385:6385 -p 16385:16385 --privileged=true -v /mydata/conf_cluster/data/6385:/data -v /mydata/conf_cluster/redis-6385.conf:/etc/redis/redis-6385.conf redis redis-server /etc/redis/redis-6385.conf

docker中創建分片集群

先加入到某個容器中:

docker exec -it redis_6380 /bin/bash

運行以下命令創建集群:

注意:
這里的“120.25.223.26”也要根據自己主機的ip進行修改

redis-cli --cluster create 120.25.223.26:6380 120.25.223.26:6381 120.25.223.26:6382 120.25.223.26:6383 120.25.223.26:6384 120.25.223.26:6385 --cluster-replicas 1

創建好集群后開啟一個redis客戶端查看集群狀態:
注意要以加“-c”進入到集群中

redis-cli -c -p 6380

查看集群狀態:

cluster info

cluster_state顯示ok則證明集群正常運行

查看節點信息:

cluster nodes


可以看到該分片集群為三主三從結構

也可以進行一些redis操作查看分片集群是否搭建成功

springboot項目訪問redis分片集群

項目在上一講的代碼基礎上進行修改
配置文件application.yml中關于訪問redis分片集群的配置:
注意nodes中對應的主機名要根據自己實際主機ip修改

spring:redis:# 分片集群配置cluster:nodes:- 120.25.223.26:6380- 120.25.223.26:6381- 120.25.223.26:6382- 120.25.223.26:6383- 120.25.223.26:6384- 120.25.223.26:6385max-redirects: 5lettuce:pool:max-active: 10max-idle: 10min-idle: 0max-wait: 1000

緩存擊穿

什么是緩存擊穿

緩存擊穿問題也叫 熱點 Key 問題,就是一個被高并發訪問并且緩存重建業務較復雜的 key 突然失效了,無數的請求訪問會在 瞬間給數據庫帶來巨大的沖擊。
緩存擊穿問題的特點包括:

  • redis 服務正常,沒有出現大量 key 過期現象
  • 熱點 key 過期,并且緩存重建較復雜
  • 高并發訪問熱點 key
  • 數據庫訪問壓力瞬時劇增
    具體如下圖所示:

解決方案

常用緩存擊穿問題的解決方案包括:

  • 預先設置熱門數據:在 redis 高峰訪問之前,把一些熱門數據提前存入到 redis里面,加大這些熱門數據 key 的時長
  • 實時調整:現場監控哪些數據熱門,實時調整 key 的過期時長
  • 使用 互斥鎖:類似于悲觀鎖
  • 邏輯過期:類似于樂觀鎖

互斥鎖機制

互斥鎖原理

(1) 利用互斥鎖處理緩存擊穿問題的邏輯流程

(2) 使用redis 的setnx 命令來實現
  • 命令格式:setnx key value
  • 作用:Setnx( SET if Not eXists) 命令在指定的 key 不存在時,為 key設置指定的值;
  • 返回值:設置成功,返回 1 。 設置失敗,返回 0 。

  • 加鎖:該命令執行返回 1 表示申請鎖成功,返回 0 表示申請鎖失敗;
  • 釋放鎖:del key ,刪除 key 就表示釋放了鎖。

互斥鎖代碼實現

package com.example.service.impl;import cn.hutool.core.util.BooleanUtil; import com.example.mapper.UserMapper; import com.example.pojo.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.io.IOException; import java.util.List; import java.util.concurrent.TimeUnit;/*** description:出來緩存擊穿問題,需用的方法*方法 1:queryWithLock()--處理緩存擊穿問題*方法 2: addlock()--申請鎖*方法 3:unlock()--釋放鎖* author :hj* date: 2022/11/10*/ @Service public class UserServiceImpl implements UserService {@Resource// @Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisTemplate redisTemplate;//根據id查詢user,調用queryWithLock()public User findUserById(Long id) throws IOException {//熱點數據,使用queryWithLock方法User user =queryWithLock(id);return user;}//1.處理緩存擊穿問題public User queryWithLock(Long id) throws IOException {String key="user:"+id;//1.首先查看Redis緩存中是否有數據User user =getUserByRedis(id);//2.如果 Redis 中有該用戶,則直接返回if (user !=null){System.out.println("Redis緩存中查詢到此用戶");return user;}System.out.println("Redis緩存中沒有此用戶");String lockKey = "lock:user:"+id;// 3.Redis中沒有,表示查詢未命中,則需進行加鎖和緩存重建(查詢mysql)try {//3.1獲取鎖boolean isLock = addlock(lockKey);//3.2 判斷鎖是否獲取成功. 這里判斷加鎖失敗,則休眠,再次執行該方法if(!isLock){Thread.sleep(50);//休眠20毫秒后,再次執行該方法,遞歸調用,重新查詢redisreturn queryWithLock(id);}System.out.println("Redis申請鎖成功!");//3.3 如果成功加上了鎖,要再次查詢 redis 緩存是否有該數據,// 因為可能其他應用已重建了該數據的緩存if (getUserByRedis(id)!= null){System.out.println("再次查詢時,Redis緩存中查詢到此用戶");return user;}// 4. 這里表示,兩次查詢 Redis,都沒有查詢到數據未命中,則要到mysql中查詢,// 如果mysql中也沒有,則將空對象寫入redisuser=userMapper.findUserById(id);//模擬緩存重建延遲了Thread.sleep(200);//數據庫里也沒有,redis中也沒有if(user==null){System.out.println("Mysql中也沒有此用戶");User u=new User();u.setId(id);saveToRedis(u);}else{System.out.println("Mysql中查詢到此用戶");saveToRedis(user);}} catch (InterruptedException e) {e.printStackTrace();}finally {unlock(lockKey);}return user;}//2.加鎖private boolean addlock(String key){Boolean flag= redisTemplate.opsForValue().setIfAbsent(key,"1",10,TimeUnit.SECONDS);return BooleanUtil.isTrue(flag) ;}//3.釋放鎖private void unlock(String key){redisTemplate.delete(key);}//處理:緩存穿透問題public User queryWithPassThrough(Long id) throws IOException {//1.查看Redis緩存中是否有數據User user =getUserByRedis(id);//2.如果Redis中有該用戶,則返回if (user !=null){System.out.println("Redis緩存中查詢到此用戶");return user;}// 3.Redis中沒有,則到mysql中查詢,// 如果mysql中也沒有,則將空對象寫入redisSystem.out.println("Redis緩存中沒有此用戶");user=userMapper.findUserById(id);if(user==null){System.out.println("Mysql中也沒有此用戶");User u=new User();u.setId(id);saveToRedis(u);}else{System.out.println("Mysql中查詢到此用戶");saveToRedis(user);}return user;}//從redis中查詢Userpublic User getUserByRedis(Long id){String key="user:"+id;if (redisTemplate.hasKey(key)){String name=(String) redisTemplate.opsForHash().get(key,"name");String pwd= (String) redisTemplate.opsForHash().get(key,"pwd");User user=new User();user.setId(id);user.setUsername(name);user.setPassword(pwd);// System.out.print(user);return user;}return null;}//保存User信息到Redis,使用hash類型public void saveToRedis(User user) {//設置key: user:IDString key="user:"+user.getId();//各字段的值都存入RedisredisTemplate.opsForHash().put(key,"name",user.getUsername());redisTemplate.opsForHash().put(key,"pwd",user.getPassword());//修改 1:設置key的過期時間為6分鐘redisTemplate.expire(key,360, TimeUnit.SECONDS);}//根據id修改用戶信息@Transactional //修改3:開啟事務public String updateUserById(User user) {Long id = user.getId();if (id == null) {return "用戶id不能為空";}//修改2. 先更新mysql數據庫userMapper.updateUserById(user);//修改2. 后刪除緩存String key="user:"+id;redisTemplate.delete(key);return "更新成功";}//查詢用戶public List<User> getAllUser() {return userMapper.getAllUserMap();}public int addUser(User user) {return userMapper.addUser(user);}}

docker中redis哨兵結構搭建

關于哨兵結構

要注意分片集群是自帶故障處理機制的,因此分片集群是不需要配置哨兵集群的,因此以下在搭建哨兵集群之前先搭建了一個一主二從的主從結構
而搭建的三個哨兵節點構成哨兵集群監視主從結構的主節點
哨兵結構如圖:

配置配置文件

以下配置的哨兵結構為:

6390 主節點 6391 從節點 6392 從節點26390 哨兵節點1 26391 哨兵節點2 26392 哨兵節點3

同樣可以先把配置文件都放在同一個文件夾中

redis_6390.conf

port 6390

redis_6391.conf

注意以下配置文件的“120.25.223.26”要根據自己主機ip進行修改

port 6391 slaveof 120.25.223.26 6390

redis_6392.conf

port 6392 slaveof 120.25.223.26 6390

redis_26390.conf

port 26390# 讓sentinel服務后臺運行(docker的話需要設置為no,非docker運行設置為yes, 因為docker有個-d屬性就是讓在后臺運行的) daemonize no #Sentinel去監視一個名為mymaster的主redis實例 # 投票數設置為2代表哨兵集群中兩個或以上哨兵節點判定主節點主觀下線則判定該節點下線 sentinel monitor mymaster 120.25.223.26 6390 2

redis_26391.conf

port 26391# 讓sentinel服務后臺運行(docker的話需要設置為no,非docker運行設置為yes, 因為docker有個-d屬性就是讓在后臺運行的) daemonize no #Sentinel去監視一個名為mymaster的主redis實例 sentinel monitor mymaster 120.25.223.26 6390 2

redis_26392.conf

port 26392# 讓sentinel服務后臺運行(docker的話需要設置為no,非docker運行設置為yes, 因為docker有個-d屬性就是讓在后臺運行的) daemonize no #Sentinel去監視一個名為mymaster的主redis實例 sentinel monitor mymaster 120.25.223.26 6390 2

把配置文件文件夾移動到對應位置

注意文件夾中要先創建一個data空目錄用于docker運行主節點容器時data目錄的掛載,如圖所示:

conf_sentinel文件夾用于存放相關的配置文件:

docker中創建主從結構對應容器

啟動主節點(redis_master_6390)

注意這里掛載目錄要根據實際路徑修改

docker run -id --name redis_master_6390 -p 6390:6390 --privileged=true -v /mydata/redis_master_slave/data:/data -v /mydata/redis_master_slave/conf_sentinel/redis_6390.conf:/etc/redis/redis_6390.conf redis redis-server /etc/redis/redis_6390.conf

啟動從節點1(redis_slave1_6391)

docker run -id --name redis_slave1_6391 -p 6391:6391 --privileged=true -v /mydata/redis_master_slave/conf_sentinel/redis_6391.conf:/etc/redis/redis_6391.conf redis redis-server /etc/redis/redis_6391.conf

啟動從節點2(redis_slave2_6392)

docker run -id --name redis_slave2_6392 -p 6392:6392 --privileged=true -v /mydata/redis_master_slave/conf_sentinel/redis_6392.conf:/etc/redis/redis_6392.conf redis redis-server /etc/redis/redis_6392.conf

查詢主從結構是否成功

進入到主節點容器中:

docker exec -it redis_master_6390 /bin/bash

redis-cli連接:

redis-cli -p 6390

查看主從結構信息:

info replication

docker中創建哨兵結構對應容器

docker創建哨兵結構時若遇到容器閃退問題可以參考下面“三、經驗總結和報錯處理”中的解決方法

啟動哨兵節點1(redis_sentinel1_26390)

docker run --privileged=true -d --name redis_sentinel1_26390 -p 26390:26390 -v /mydata/redis_master_slave/conf_sentinel/redis_26390.conf:/etc/redis/redis_26390.conf redis redis-sentinel /etc/redis/redis_26390.conf

啟動哨兵節點2(redis_sentinel2_26391)

docker run --privileged=true -d --name redis_sentinel2_26391 -p 26391:26391 -v /mydata/redis_master_slave/conf_sentinel/redis_26391.conf:/etc/redis/redis_26391.conf redis redis-sentinel /etc/redis/redis_26391.conf

啟動哨兵節點3(redis_sentinel3_26392)

docker run --privileged=true -d --name redis_sentinel3_26392 -p 26392:26392 -v /mydata/redis_master_slave/conf_sentinel/redis_26392.conf:/etc/redis/redis_26392.conf redis redis-sentinel /etc/redis/redis_26392.conf

查詢哨兵結構是否搭建成功

進入哨兵結點容器

docker exec -it redis_sentinel1_26390 /bin/bash

redis-cli客戶端連接

redis-cli -p 26390

查看哨兵結點信息:

info sentinel

springboot項目訪問redis哨兵集群

配置文件配置

在配置文件application.yml中做以下配置:
注意配置中的“master”對應為在哨兵結點配置文件中配置的主節點名稱

# 哨兵結構配置(一主二從 3 哨兵結點)# 結構# 6390 主結點# 6391 從結點# 6392 從結點# 26390 哨兵1# 26391 哨兵2# 26392 哨兵3 spring:redis:sentinel:master: mymasternodes:- 120.25.223.26:26390- 120.25.223.26:26391- 120.25.223.26:26392

要注意springboot項目application.yml中不能同時配置分片集群與哨兵結構,不然項目運行時會報錯

配置主從讀寫分離(可選)

這個貌似不配也能正常使用

在springboot啟動類中配置以下內容:

// 主從讀寫分離配置@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}

三、經驗總結和報錯處理

關于docker啟動容器后秒退問題處理

在docker運行哨兵節點過程中,一輸入完docker run命令后查看docker ps -a發現容器已經下線,為什么會秒退呢?
使用docker logs 容器名查看秒退容器的日志,發現日志中為如下內容:

“1:X 18 Nov 2022 15:22:49.036 # Sentinel config file /etc/redis/redis_26390.conf is not writable: Permission denied. Exiting...”

從日志內容可以看到顯示的是conf文件is not writable,Permission denied,于是就上網搜了一下,但網上各種方法都沒用,還是閃退,我不李姐
但最后搞了挺久還是搞好了
可以從以下幾個方面排查錯誤:
1、網上有的說是權限問題,需要在run命令中使用--privileged=true
已經加了還是閃退…
2、有的說要在哨兵結點配置文件(如redis_26390.conf)中加入以下內容

# 讓sentinel服務后臺運行(docker的話需要設置為no,非docker運行設置為yes, 因為docker有個-d屬性就是讓在后臺運行的) daemonize no

加了還是沒用…
3、有的說是selinux的問題
使用getenforce查看selinux狀態

狀態是disabled證明沒開啟,也不是這個原因

以上三種方法都沒法解決
以下兩種方法對我的閃退管用
4、docker run命令中使用redis redis-sentinel 配置文件代替redis redis-server 配置文件 --sentinel
如在運行哨兵結點26390時命令為:

docker run --privileged=true -d --name redis_sentinel1_26390 -p 26390:26390 -v /mydata/redis_master_slave/conf_sentinel/redis_26390.conf:/etc/redis/redis_26390.conf redis redis-sentinel /etc/redis/redis_26390.conf

而不是

docker run --privileged=true -d --name redis_sentinel1_26390 -p 26390:26390 -v /mydata/redis_master_slave/conf_sentinel/redis_26390.conf:/etc/redis/redis_26390.conf redis redis-server /etc/redis/redis_26390.conf --sentinel

5、要注意docker run命令中端口映射要與配置文件中配置相對應!!
老師命令參考里的docker run命令和對應的配置文件中端口配置是不一樣的!!
例如
哨兵結點26390的配置文件(.conf)中配置的端口為port 26390,代表該節點會在docker容器中26390端口啟動,而docker run命令中-p端口映射左邊的端口代表宿主機的端口,右邊的端口代表docker容器里面的端口,因此右邊的端口要與配置文件(.conf)中配置的端口(如:port 26390)一致!!
如:
哨兵結點26390配置文件中配置的端口為port 26390,則對應的docker run命令中的端口映射就要為docker run -p 26390:26390左邊的端口不一定的26390,但右邊的一定要與配置文件中配置的端口(即26390)對應!!

關于云服務器端口開放問題

當使用客戶端遠程連接云服務器主機端口時,要注意對應的端口應開放,不然會連接不上
關于端口開放參考:阿里云輕量應用服務器配置安裝運行時的端口開放問題

關于哨兵結構與分片集群

注意分片集群自帶故障處理機制,因此不需要在分片集群中再配置哨兵集群
而且springboot中配置文件關于哨兵結構的配置貌似只能配一個master
因此配置哨兵集群前配置了一主二從的主從結構

四、相關代碼

項目功能代碼與上一講中代碼(傳送門)相同
只有配置文件application.yml中有所修改

application.yml

訪問分片集群版

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/myschool?serverTimezone=Hongkong?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: pwdredis:# 分片集群配置cluster:nodes:- 120.25.223.26:6380- 120.25.223.26:6381- 120.25.223.26:6382- 120.25.223.26:6383- 120.25.223.26:6384- 120.25.223.26:6385max-redirects: 5lettuce:pool:max-active: 10max-idle: 10min-idle: 0max-wait: 1000# 哨兵結構配置(一主二從 3 哨兵結點)# 結構# 6390 主結點# 6391 從結點# 6392 從結點# 26390 哨兵1# 26391 哨兵2# 26392 哨兵3# sentinel: # master: mymaster # nodes: # - 120.25.223.26:26390 # - 120.25.223.26:26391 # - 120.25.223.26:26392mybatis:mapper-locations: classpath:com/exmaple/mapper/*.xml #指定sql配置文件的位置type-aliases-package: com.example.pojo #指定實體類所在的包名configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #輸出SQL命令

訪問哨兵結構版:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/myschool?serverTimezone=Hongkong?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: pwdredis:# 分片集群配置 # cluster: # nodes: # - 120.25.223.26:6380 # - 120.25.223.26:6381 # - 120.25.223.26:6382 # - 120.25.223.26:6383 # - 120.25.223.26:6384 # - 120.25.223.26:6385 # max-redirects: 5 # lettuce: # pool: # max-active: 10 # max-idle: 10 # min-idle: 0 # max-wait: 1000# 哨兵結構配置(一主二從 3 哨兵結點)# 結構# 6390 主結點# 6391 從結點# 6392 從結點# 26390 哨兵1# 26391 哨兵2# 26392 哨兵3sentinel:master: mymasternodes:- 120.25.223.26:26390- 120.25.223.26:26391- 120.25.223.26:26392mybatis:mapper-locations: classpath:com/exmaple/mapper/*.xml #指定sql配置文件的位置type-aliases-package: com.example.pojo #指定實體類所在的包名configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #輸出SQL命令

com.example.service.impl.StudentServiceImpl

添加對緩存擊穿問題的處理

package com.example.service.impl;import cn.hutool.core.util.BooleanUtil; import com.example.mapper.StudentMapper; import com.example.pojo.Student; import com.example.pojo.User; import com.example.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit;/*** @projectName: week11_redis_ * @package: com.example.service.impl* @className: StudentServiceImpl* @author: GCT* @description:* 數據一致性處理:* 1.數據寫入redis時,設置key的超時時間,* 2.修改數據時,先修改mysql,再刪除redis緩存* 3.開啟事務:保證正確事務的提交** 緩存穿透和緩存雪崩處理方案:* 緩存穿透處理:如果mysql中也沒有,則將空對象寫入redis進行緩存* 緩存雪崩處理 :為存入Redis數據庫進行緩存的鍵值對創建一個隨機的Key的有效期** * description:處理緩存擊穿問題,需用的方法* *方法 1:queryWithLock()--處理緩存擊穿問題* *方法 2: addlock()--申請鎖* *方法 3:unlock()--釋放鎖* @date: 2022/11/11 20:39* @version: 1.0*/ @Service public class StudentServiceImpl implements StudentService { // @Resource@Autowiredprivate StudentMapper studentMapper;@Autowiredprivate RedisTemplate redisTemplate;//根據id查詢user,調用queryWithLock()public Student findStudentById(Long id) { // 處理緩存擊穿問題//熱點數據,使用queryWithLock方法Student student =queryWithLock(id);return student;}//1.處理緩存擊穿問題public Student queryWithLock(Long id){String key="student:"+id;//1.首先查看Redis緩存中是否有數據Student student =getStudentByRedis(id);//2.如果 Redis 中有該用戶,則直接返回if (student !=null){System.out.println("Redis緩存中查詢到此學生");return student;}System.out.println("Redis緩存中沒有此學生");String lockKey = "lock:student:"+id;// 3.Redis中沒有,表示查詢未命中,則需進行加鎖和緩存重建(查詢mysql)try {//3.1獲取鎖boolean isLock = addlock(lockKey);//3.2 判斷鎖是否獲取成功. 這里判斷加鎖失敗,則休眠,再次執行該方法if(!isLock){Thread.sleep(50);//休眠20毫秒后,再次執行該方法,遞歸調用,重新查詢redisreturn queryWithLock(id);}System.out.println("Redis申請鎖成功!");//3.3 如果成功加上了鎖,要再次查詢 redis 緩存是否有該數據,// 因為可能其他應用已重建了該數據的緩存if (getStudentByRedis(id)!= null){System.out.println("再次查詢時,Redis緩存中查詢到此學生");return student;}// 4. 這里表示,兩次查詢 Redis,都沒有查詢到數據未命中,則要到mysql中查詢,// 如果mysql中也沒有,則將空對象寫入redisstudent=studentMapper.findStudentById(id);//模擬緩存重建延遲了Thread.sleep(200);//數據庫里也沒有,redis中也沒有if(student==null){System.out.println("Mysql中也沒有此學生");Student s=new Student();s.setId(id);saveToRedis(s);}else{System.out.println("Mysql中查詢到此學生");saveToRedis(student);}} catch (InterruptedException e) {e.printStackTrace();}finally {unlock(lockKey);}return student;}//2.加鎖private boolean addlock(String key){Boolean flag= redisTemplate.opsForValue().setIfAbsent(key,"1",10,TimeUnit.SECONDS);return BooleanUtil.isTrue(flag) ;}//3.釋放鎖private void unlock(String key){redisTemplate.delete(key);}//根據id查詢學生信息//處理:緩存穿透問題public Student queryWithPassThrough(Long id){//1.查看Redis緩存中是否有數據Student student =getStudentByRedis(id);//2.如果Redis中有該學生,則返回if (student !=null){System.out.println("Redis緩存中查詢到此學生");return student;}// 3.Redis中沒有,則到mysql中查詢,// 緩存穿透處理:如果mysql中也沒有,則將空對象寫入redisSystem.out.println("Redis緩存中沒有此學生");student = studentMapper.findStudentById(id);if(student==null){System.out.println("Mysql中也沒有此學生");Student s = new Student();s.setId(id);saveToRedis(s);}else{System.out.println("Mysql中查詢到此學生");saveToRedis(student);}return student;}// 根據傳入的id數據查找出一個或多個學生信息/*** @param ids:* @return List<Student>* @author GCT* @description 根據傳入的id數據查找出一個或多個學生信息* @date 2022/11/12 11:30*/public List<Student> findStudentByIds(Long[] ids){List<Student> studentList = new ArrayList<Student>();for (Long id:ids){ // 遍歷ids數組,使用findStudentById(id)將 // 返回的Student類型數據添加到studentList集合中studentList.add(findStudentById(id));}return studentList;}//根據id修改用戶信息@Transactional //修改3:開啟事務public String updateStudentById(Student student) {Long id = student.getId();if (id == null) {return "學生id不能為空";}//修改2. 先更新mysql數據庫studentMapper.updateStudentById(student);//修改2. 后刪除緩存String key="student:"+id;redisTemplate.delete(key);return "更新成功";}//保存Student信息到Redis,使用hash類型public void saveToRedis(Student student) {//設置key: student:IDString key="student:"+student.getId();//各字段的值都存入RedisredisTemplate.opsForHash().put(key,"sname",student.getSname()+"");redisTemplate.opsForHash().put(key,"dept",student.getDept()+"");redisTemplate.opsForHash().put(key,"age",student.getAge()); //!!! Age為Int類型不用+“”//修改 1:設置key的過期時間為6分鐘 // redisTemplate.expire(key,360, TimeUnit.SECONDS);//緩存雪崩修改 :創建一個隨機的KEY 的有效期int expiredTime=360+new Random().nextInt(100);System.out.println("過期時間: "+expiredTime);redisTemplate.expire(key,expiredTime, TimeUnit.SECONDS);}//從redis中查詢Studentpublic Student getStudentByRedis(Long id){String key="student:"+id;if (redisTemplate.hasKey(key)){String sname=(String) redisTemplate.opsForHash().get(key,"sname");String dept= (String) redisTemplate.opsForHash().get(key,"dept");int age = (Integer)redisTemplate.opsForHash().get(key,"age");Student student = new Student();student.setId(id);student.setSname(sname);student.setDept(dept);student.setAge(age);return student;}return null;}//查詢用戶public List<Student> getAllStudent() {return studentMapper.getAllStudentMap();}/*** @param student:* @return int* @author GCT* @description* 緩存穿透處理時對不存在的學生創建了* 對應id的空對象存入緩存,因此在新增學生信息時加個判斷,* 判斷新增的學生id是否存在于Redis緩存中,若存在,則刪去對應緩存* @date 2022/11/12 11:45*/@Transactional //開啟事務public int addStudent(Student student) {//先在mysql數據庫新增數據int i = studentMapper.addStudent(student);Long studentId = student.getId();Student studentByRedis = getStudentByRedis(studentId);//后判斷,若在緩存中存在對應信息則刪除緩存if (studentByRedis!=null){String key="student:"+studentId;redisTemplate.delete(key);//若存在對應的對象,則刪除緩存}System.out.println("id: "+studentId);return i;}// 根據id刪除學生/*** @param id:* @return int* @author GCT* @description 根據id刪除學生* 使用事務* 先刪除Mysql數據庫內信息* 再刪除redis數據庫內信息* @date 2022/11/11 21:30*/@Transactional //開啟事務public String deleteStudentById(Long id){if (id == null) {return "學生id不能為空!";}//先更新mysql數據庫studentMapper.deleteStudentById(id);//后刪除緩存String key="student:"+id;redisTemplate.delete(key);return "成功刪除id為"+id+"的學生!";}}

五、運行結果

1.搭建redis分片集群,并實現springboot對集群的訪問

(1)驗證redis分片集群搭建成功的截圖:

cluster info查看集群狀態:

可見集群運行正常

cluster nodes查看各節點信息:

可見redis分片集群搭建成功,集群中有三個主節點,三個從節點,其中6380、6383、6385端口對應節點為分片集群的主節點,6381、6382、6384端口對應節點為分片集群的從節點

(2)SpringBoot訪問redis分片集群的application.yml的修改代碼截圖:
SpringBoot項目配置文件application.yml中對于訪問redis分片集群的配置:

(3)SpringBoot成功訪問redis分片集群的結果截圖:
使用接口調試工具調用根據id查詢學生信息接口前查看集群中鍵值對信息可見此時在
redis中沒有相關的鍵值對

啟動springboot項目,使用接口調試工具調用根據id查詢學生信息接口:

可見成功查詢到了id為108的學生信息,此時查看redis集群中鍵值對信息可以看到對應的學生信息
成功保存到redis分片集群中

后臺打印輸出:

2.搭建redis哨兵集群,并實現springboot對哨兵集群的訪問

(1)驗證redis哨兵集群搭建成功的截圖:
哨兵集群結構:
先搭建了一主二從的主從結構,并搭建了有三個哨兵結點的哨兵集群監視主從結構中的主節點
其中,主從結構中6390端口對應的結點為主節點,6391,6392端口對應的節點為主節點6390
的從節點,哨兵集群中有26390,26391,26392端口對應的三個節點作為哨兵結點,監視主從
結構中6390端口對應的主節點
在主節點6390中執行info replication查詢主從結構是否構建成功:

可見主從結構搭建成功。

在哨兵節點26390中執行 info sentinel查詢哨兵結構是否搭建成功:

可見哨兵結構搭建成功

(2)SpringBoot訪問redis哨兵集群的application.yml的修改代碼截圖:
SpringBoot項目配置文件application.yml中對于訪問redis哨兵結構的配置:

(3)SpringBoot成功訪問redis哨兵集群的結果截圖:
使用接口調試工具調用根據id查詢學生信息接口前查看集群中鍵值對信息可見此時在
redis中沒有相關的鍵值對


啟動springboot項目,使用接口調試工具調用根據id查詢學生信息接口:

可見成功查詢到了id為2的學生信息,此時查看redis6390結點中鍵值對信息可以看到對應的學生信息
成功保存到redis中

此時進入到從節點6391中,可見從節點中也成功保存了id為2的學生信息:

后臺打印輸出:

總結

以上是生活随笔為你收集整理的Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

香蕉色综合| 黄a在线观看| 九九免费观看视频 | 久久久久美女 | 久久久精品国产免费观看一区二区 | 亚洲视频精选 | 夜夜高潮夜夜爽国产伦精品 | 国产视频日韩 | 国产黄色片一级 | 国产成人亚洲在线电影 | 精品国产电影一区 | 麻花传媒mv免费观看 | 欧美性生交大片免网 | 成人av在线播放网站 | 人人干人人添 | 国产一卡久久电影永久 | 婷婷九月激情 | 99久精品| 91av小视频| 国产999精品久久久久久绿帽 | 久久伊人免费视频 | 国产免码va在线观看免费 | 久久精品一区二区三区四区 | 国产精品99久久久精品免费观看 | av片在线观看 | 久久免费公开视频 | 久久精品屋 | 最新极品jizzhd欧美 | 97超碰在线播放 | 在线观看中文字幕 | 国产精品观看在线亚洲人成网 | 青草视频在线免费 | 91网页版在线观看 | 色视频在线免费 | 狠狠色丁香婷婷综合最新地址 | 在线天堂亚洲 | 天天操天天干天天操天天干 | 国产一区二区在线观看视频 | www.五月天 | 黄色av网站在线观看免费 | 免费日韩视 | 免费观看第二部31集 | 精品国产伦一区二区三区观看体验 | 久久精品亚洲一区二区三区观看模式 | 国产无遮挡又黄又爽馒头漫画 | 成人日批视频 | 天天射天天搞 | 黄色aaa级片 | 九九视频在线 | www久草| 天天色天天草天天射 | 免费三级av| 亚洲精品视频免费观看 | 黄色精品久久 | 99 久久久久 | 免费99| 国产三级av在线 | 91豆花在线 | 91香蕉国产在线观看软件 | 亚洲精品视频在线免费播放 | 国产在线色视频 | 精品久久久久久亚洲 | 亚洲干 | 在线超碰av| 337p日本欧洲亚洲大胆裸体艺术 | 日日干干 | 在线免费观看麻豆视频 | 成年人看片 | 超碰电影在线观看 | 国产黄色精品在线观看 | 9999精品免费视频 | 狠狠色丁香九九婷婷综合五月 | 亚洲成色777777在线观看影院 | 日本少妇久久久 | 国产精品video爽爽爽爽 | 在线观看中文字幕第一页 | 五月婷婷黄色网 | 99精品国产在热久久下载 | 国产精品一区二区三区电影 | 97电影在线看视频 | 欧美aaa视频 | 欧美日韩中文在线观看 | 九九热久久免费视频 | 婷婷激情综合五月天 | 久久精品久久精品 | 色多多视频在线观看 | 日韩中文字| 91麻豆免费视频 | 国产精品中文字幕在线观看 | 国产成人精品一区二区在线观看 | 手机av网站| 欧美综合在线视频 | 在线观看电影av | 韩国中文三级 | 天天爽天天摸 | 国产免费二区 | 超碰电影在线观看 | 天天插伊人 | 成人av高清| 天天操天天爱天天干 | 国产中年夫妇高潮精品视频 | 黄色免费电影网站 | 日韩欧美视频免费看 | 国产区精品在线观看 | 在线免费看片 | 一区二区三区高清在线观看 | 午夜久久久久 | 日韩av一区在线观看 | 亚州国产精品视频 | 在线香蕉视频 | 国产99久久久国产精品成人免费 | 日本视频精品 | 成人h电影在线观看 | 成人中文字幕av | 2024国产在线 | 青青河边草观看完整版高清 | 中文字幕在线观看网址 | 大型av综合网站 | 欧美性猛片, | 久久久影院一区二区三区 | 精品国产成人在线 | 激情av在线资源 | 天天色天天操天天爽 | 97在线视频免费播放 | 97天天干 | 69国产精品成人在线播放 | 日韩簧片在线观看 | 中文成人字幕 | 色网站视频 | 欧美性生活小视频 | av片在线看 | 日韩国产欧美在线视频 | 中文字幕刺激在线 | 香蕉视频在线观看免费 | 在线观看av大片 | 国产黄色大片免费看 | 九九久久国产精品 | 色综合久久99 | 欧美午夜精品久久久久久孕妇 | 黄色a在线 | 日韩精品观看 | 免费黄色特级片 | 永久免费看av| 免费视频你懂得 | 亚洲精品在线播放视频 | 日韩啪啪小视频 | 日韩激情中文字幕 | 国产视频在线看 | 欧美亚洲一级片 | 久久久久国产一区二区 | 一区二区三区在线免费播放 | 国产在线观看免费 | 中文字幕在线观看一区 | 久久99婷婷 | 蜜桃传媒一区二区 | 亚洲小视频在线观看 | 国产资源av| 亚洲精品视频在线看 | 成人免费看电影 | 中文字幕频道 | 国产精品高潮呻吟久久久久 | 亚洲精品国偷自产在线99热 | 国产精品网红直播 | 免费色视频 | 欧美日韩国产在线精品 | 国产日韩欧美在线免费观看 | 国产不卡一二三区 | 国产精品一区二区三区久久 | 狠狠干网| 色香网| 成人片在线播放 | 欧美日韩在线观看一区 | 91一区啪爱嗯打偷拍欧美 | 欧美日韩免费一区二区 | 99精品一级欧美片免费播放 | 91成人在线视频观看 | 伊人网站 | 免费网站黄 | 久久精品3 | 在线免费av电影 | 婷婷国产视频 | 91精品国产成人 | 欧美极品xxxxx | 国产福利av在线 | 天天做天天爱天天爽综合网 | 天天操天天爱天天干 | 欧美日韩在线视频观看 | 麻豆免费视频网站 | 精品视频123区在线观看 | 精品成人免费 | 热99久久精品 | 久久99精品国产麻豆宅宅 | 久久久久久免费视频 | 96国产精品| 99人久久精品视频最新地址 | av在线网站大全 | 91在线色| 波多野结衣在线播放视频 | 在线看日韩av| 日韩在线视频线视频免费网站 | 国产婷婷一区二区 | 一区二区三区四区五区六区 | 91完整版 | 日韩免费专区 | 911久久香蕉国产线看观看 | 国产视频久久久 | 一区二区三区在线播放 | 亚洲久草在线 | 精品国产午夜 | av在线看片 | 免费精品久久久 | 日本久久久久久 | 国产精品久久久久久久午夜片 | 国产精品福利久久久 | 午夜免费电影院 | 欧美激情亚洲综合 | 久久这里只有精品视频首页 | 综合色中文 | 五月天丁香视频 | 国产精品中文字幕在线播放 | 天天操天天干天天爽 | 国产免费一区二区三区最新 | 国产精品免费在线播放 | 亚洲少妇激情 | 午夜在线国产 | 中文字幕日韩电影 | 69亚洲视频| 99视频精品全国免费 | 国产精品美女久久久久久网站 | 91九色国产视频 | 国产免码va在线观看免费 | 午夜骚影| 国产色婷婷在线 | 国产成人免费网站 | 色婷婷色 | 久久九九视频 | 欧美成人xxxx | 91中文字幕在线视频 | 9ⅰ精品久久久久久久久中文字幕 | 日韩精品欧美视频 | 欧美在线观看视频一区二区 | 亚洲一区二区视频在线 | 91成人精品 | 少妇搡bbbb搡bbb搡69 | 亚洲综合狠狠干 | 97精品一区二区三区 | 91字幕| 激情网站五月天 | 最近中文字幕免费av | 成人91在线观看 | 成人av免费在线 | 日韩高清一 | 国产成人香蕉 | 国产区免费 | 亚洲播放一区 | 国产精品麻豆欧美日韩ww | 国产一级免费片 | 婷婷精品国产一区二区三区日韩 | 在线网址你懂得 | 欧美色图视频一区 | 日韩免费看 | 草久在线视频 | 日韩欧美综合 | 麻豆精品在线 | 日韩欧美在线观看一区二区 | 国产美女免费视频 | 天天色天天艹 | www.国产在线 | 一区二区精品在线视频 | 日韩高清精品免费观看 | 免费无遮挡动漫网站 | 91污污视频在线观看 | 国产xxxx做受性欧美88 | 久久综合色综合88 | 亚洲成a人片综合在线 | 久久免费精品一区二区三区 | 久久99最新地址 | 在线观看蜜桃视频 | 欧美成人精品欧美一级乱 | 亚洲精品国产精品久久99热 | 日韩精品免费在线观看 | 日韩精品一区二区在线观看视频 | 久草网免费 | 久久精品99国产国产精 | 国产精久久久久久久 | 国产69久久精品成人看 | 亚洲高清91| av看片网 | 狠狠操导航| 久久国产免费视频 | 亚洲视频在线看 | 欧美激情操 | 色狠狠综合天天综合综合 | 精品国产乱码久久久久久1区2匹 | 日韩理论片 | 免费网站在线观看成人 | 中文字幕激情 | 亚洲精品国产精品乱码在线观看 | 国产精品久久网站 | 国产黄免费看 | 粉嫩av一区二区三区入口 | 精品国产免费人成在线观看 | 91在线观看欧美日韩 | 久操中文字幕在线观看 | 免费电影一区二区三区 | 最新av在线播放 | av在线免费不卡 | 三级小视频在线观看 | 一级一片免费看 | 日韩免费视频播放 | 麻豆视频免费看 | 91黄视频在线 | 午夜精品电影一区二区在线 | 成人精品电影 | av中文字幕在线免费观看 | 色夜影院| 天天干夜夜操视频 | 久久久久国产免费免费 | 欧美性爽爽 | 国产123区在线观看 国产精品麻豆91 | 日韩xxx视频 | 国产精品一区二区av日韩在线 | 欧美精品首页 | 欧美一级日韩三级 | 亚洲va欧美va人人爽春色影视 | 色六月婷婷| 国内精品视频一区二区三区八戒 | 欧美成人亚洲成人 | 国产精品密入口果冻 | 在线黄色毛片 | 久久久免费看 | 天堂av在线免费观看 | 狠狠色丁香婷婷综合视频 | 日韩美女高潮 | av久久久| 热99在线视频 | 五月亚洲综合 | 国产 视频 高清 免费 | 91成人在线观看喷潮 | 日日夜夜操av | 国产手机在线精品 | 免费观看一级成人毛片 | 亚洲激情在线 | 91精品国产电影 | 国产精品视频线看 | 999色视频 | 日韩偷拍精品 | 久久久久人人 | 国产精品久久一 | 免费在线播放黄色 | 最新中文字幕视频 | 免费在线观看一区二区三区 | 久久久国产精品免费 | 久久久999 | 国产手机视频 | 久久精品国产亚洲精品2020 | 中文区中文字幕免费看 | 国产经典三级 | 久久久精品久久日韩一区综合 | 日韩无在线 | 日韩免费在线观看视频 | 久久精品国产一区 | 五月天中文字幕 | 国产精品久久久久9999吃药 | 久久免费播放 | 91久久国产精品 | 91黄色在线视频 | 国产大片黄色 | 国产黄在线观看 | 久久久久久久久久久久久国产精品 | 欧美激情精品久久久久久变态 | 91精品久久久久久综合乱菊 | 亚洲综合成人专区片 | 国产成人精品国内自产拍免费看 | 国内精品久久久久久久久久久久 | 日韩伦理片一区二区三区 | 免费看色的网站 | 久久国产精品久久精品 | 91精品国产麻豆国产自产影视 | 久久婷婷网| 天天操天天爽天天干 | 精品在线免费观看 | 又黄又刺激的网站 | 婷婷六月天综合 | 麻豆久久久久久久 | 亚洲一区精品人人爽人人躁 | 日韩av一区二区在线播放 | 天天干天天摸天天操 | 伊人久久国产 | 欧美一级片免费在线观看 | 精品亚洲免费视频 | 97超碰人人网| 白丝av免费观看 | 亚洲第一成网站 | 香蕉视频在线视频 | 亚洲毛片视频 | 久久av高清 | 狠狠狠色丁香婷婷综合久久五月 | 欧美一级性视频 | 国产免费激情久久 | 国产精品自产拍在线观看中文 | 久久综合精品国产一区二区三区 | 国产美女视频 | www.天天射 | 波多野结衣综合网 | 91中文在线观看 | 中文字幕一区二区三区久久蜜桃 | 久久亚洲私人国产精品va | 99热这里有 | 国产精品美女免费看 | 久草视频在线资源 | 国产专区视频在线 | 精品国产一区二区三区久久久久久 | 黄色av一级片| 成人毛片在线观看视频 | 天天色天 | 精品视频久久 | 中文理论片 | 国产亚洲午夜高清国产拍精品 | 黄色免费看片网站 | 91精品国产91久久久久 | 六月婷婷久香在线视频 | 久久精品视频播放 | 精品视频成人 | 香蕉视频免费在线播放 | 美女av免费 | 夜夜干夜夜 | 婷婷丁香花五月天 | 99精品国产99久久久久久福利 | 99婷婷| www黄色软件 | 西西www444| 欧美一级视频免费看 | 九九国产精品视频 | 亚洲区另类春色综合小说校园片 | 又黄又爽又刺激视频 | 欧美成人在线免费 | 国产精品久久久久久久久久99 | 日本免费久久高清视频 | 二区三区在线观看 | 91资源在线视频 | 日韩中文幕 | 久久99热久久99精品 | 狠狠色丁香久久婷婷综合丁香 | 97精品久久人人爽人人爽 | 九九视频免费观看视频精品 | 欧洲一区精品 | 成年人国产在线观看 | 伊人成人久久 | 一区二区不卡在线观看 | 亚洲精品中文在线资源 | 四虎影视av | 精品在线观看一区二区 | 欧美在线视频一区二区三区 | 色多视频在线观看 | 国产精品原创 | 超碰在线91 | 丁香花在线视频观看免费 | 日韩综合视频在线观看 | 毛片视频网址 | 美女视频黄在线观看 | 一区二区三区在线影院 | 久久久久视 | 天堂视频中文在线 | 精品在线视频观看 | 国内精自线一二区永久 | 中文在线字幕免 | 97超碰人人澡人人爱学生 | 99热国产精品 | www.伊人网.com| 亚洲精品456在线播放 | 九九国产视频 | 亚洲一级片 | 亚洲最新av在线网站 | 亚洲精品高清视频在线观看 | 天天天天天操 | 涩涩伊人| 在线观看国产一区二区 | av网站有哪些 | 久久国产麻豆 | 亚洲aⅴ一区二区三区 | 狠狠色噜噜狠狠狠狠2021天天 | 国模精品一区二区三区 | 国产在线观看99 | 久久久久久综合 | 91福利视频一区 | 精品国产亚洲在线 | 最近字幕在线观看第一季 | 亚洲国产视频在线 | 精品人妖videos欧美人妖 | 日韩在线视频看看 | 色多视频在线观看 | 国产美女精品视频 | 三级av中文字幕 | 国产1区在线观看 | 精品超碰 | 国产精品免费视频网站 | 人人草在线视频 | 国产精品视频永久免费播放 | 久久久国产精品一区二区三区 | 日韩成人高清在线 | 日韩在线播放欧美字幕 | 久久久精品电影 | 欧美日韩国产在线观看 | 日本 在线 视频 中文 有码 | 日韩欧美区 | 国产一区免费看 | 欧美视频在线观看免费网址 | 色婷婷激情电影 | 中文字幕在线日亚洲9 | 麻豆系列在线观看 | 99热精品国产一区二区在线观看 | 日本黄区免费视频观看 | a视频免费看 | 天堂网av 在线 | 欧美成人一区二区 | 中文字幕在线播放第一页 | 婷婷丁香花| 99精品福利 | 中文字幕在线看视频 | 国色天香在线 | 99精品久久久久久久久久综合 | 欧美国产日韩一区二区三区 | 丁香婷婷亚洲 | 91九色网站| 高清有码中文字幕 | 日韩色一区二区三区 | 美女精品国产 | 在线观看亚洲 | 中文字幕在线观看一区二区 | 国产精品18久久久久久久网站 | 亚洲精品综合一二三区在线观看 | 天天色天天草天天射 | 午夜婷婷网 | 中文字幕精品www乱入免费视频 | 伊人手机在线 | 视频一区二区免费 | 久久久午夜精品理论片中文字幕 | 免费下载高清毛片 | 精品欧美一区二区在线观看 | 美女久久精品 | 激情开心站 | 国产青草视频在线观看 | 国产精品 国内视频 | 久久99视频| 黄色小视频在线观看免费 | 免费福利视频网 | 亚州黄色一级 | 在线观看视频色 | 久草影视在线观看 | 日本性xxxxx 亚洲精品午夜久久久 | www国产亚洲精品久久网站 | 天天干一干 | 亚洲日日日 | 成人资源在线观看 | 成人免费大片黄在线播放 | 911久久| 在线观看播放av | 欧美一级专区免费大片 | 国产一区二区不卡在线 | 亚洲综合视频网 | 日本中文字幕网站 | 亚洲一级黄色大片 | 欧美一级看片 | www.av免费观看 | 久久国产精品久久久 | 日日躁夜夜躁xxxxaaaa | 国产最新视频在线观看 | 99精品欧美一区二区蜜桃免费 | 天天干夜夜爽 | 久久欧美精品 | 精品亚洲男同gayvideo网站 | 91精品在线观看视频 | 黄色的视频网站 | 在线观看亚洲电影 | 精品国产一区二区三区四 | 国产精品一区二区三区在线播放 | 国产在线久久久 | 在线视频观看亚洲 | 日韩精品久久久久久中文字幕8 | 天天干,天天操,天天射 | 99视频在线精品国自产拍免费观看 | 国产高清精品在线 | 极品美女被弄高潮视频网站 | 国产美女主播精品一区二区三区 | 久久成人午夜 | 中文字幕日韩精品有码视频 | 91久久精品一区二区三区 | 特级毛片在线观看 | 香蕉日日 | 天天干天天操av | 国产h在线播放 | 九色精品免费永久在线 | 在线精品视频在线观看高清 | 久久精品网站视频 | 欧美激情视频一二三区 | 国产丝袜 | 成年人精品 | 日韩高清在线一区 | 午夜精品久久久久久中宇69 | 99精品在线看 | 国产在线不卡 | 成人一区二区三区中文字幕 | 超碰人人国产 | 国产精品三级视频 | 韩日三级在线 | 中文字幕精品一区二区三区电影 | 97超碰人人澡人人爱 | 麻豆免费精品视频 | 婷色| 国产亚洲亚洲 | 国产在线精品一区二区不卡了 | 久久亚洲欧美日韩精品专区 | 玖玖在线免费视频 | av超碰在线观看 | 亚洲激情精品 | 人人爽人人爽人人爽学生一级 | 中文字幕在线视频第一页 | 99热在线国产精品 | 国产成人精品午夜在线播放 | 成人av网站在线观看 | 国产精品夜夜夜一区二区三区尤 | 久久综合影视 | av在线激情 | 一区二区精品国产 | 天天操天天透 | 97电影手机版 | 视频一区二区精品 | 日本韩国在线不卡 | 在线观看精品国产 | 99热都是精品 | 国产又粗又猛又黄视频 | 亚洲国产日韩在线 | 中文永久免费观看 | 免费碰碰 | 808电影 | 国产专区视频 | 91成人精品在线 | 综合精品久久 | 亚洲三级在线播放 | 久青草国产在线 | 视频二区在线 | 午夜天使 | 成人网中文字幕 | 午夜久操 | 国产亚洲永久域名 | 激情视频二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 99久热在线精品视频 | 免费网站在线观看人 | www最近高清中文国语在线观看 | 在线天堂中文www视软件 | 国产精品美女久久 | 99久久99精品 | 亚洲综合国产精品 | 黄污在线看 | 国产精品一区二区av日韩在线 | 91在线看视频免费 | 亚洲综合射 | 日日操日日干 | 黄色大片日本 | 免费成人在线视频网站 | 欧美日韩视频在线观看一区二区 | 午夜精品久久久久久久99水蜜桃 | 国产综合精品一区二区三区 | 蜜臀av免费一区二区三区 | 亚洲国产日韩精品 | www国产一区 | 欧美男同视频网站 | 久久久久久久久久久久久久免费看 | 成年美女黄网站色大片免费看 | 最近最新mv字幕免费观看 | 国产男女无遮挡猛进猛出在线观看 | 欧美另类老妇 | 精品免费一区 | 国产高清免费 | 三级视频日韩 | 99精品在线看| 国产高清第一页 | 久草视频免费 | 最近日本韩国中文字幕 | 亚洲国产精品一区二区久久,亚洲午夜 | 69av国产| 久久午夜免费观看 | 亚洲欧美综合精品久久成人 | av线上看 | 免费在线观看不卡av | 久久久国产电影 | 美女一二三区 | 又黄又爽又无遮挡免费的网站 | 麻豆系列在线观看 | 亚洲一区久久久 | 成人午夜电影久久影院 | 中文字幕av在线 | 亚洲国产人午在线一二区 | 日韩mv欧美mv国产精品 | 国产在线视频一区二区三区 | 99精品国产高清在线观看 | 色吊丝在线永久观看最新版本 | 一个色综合网站 | 日韩黄色免费电影 | 色在线最新 | 人人艹人人 | 精品一二三区视频 | 最近中文字幕久久 | 日韩欧美xx | 日韩在线视频免费看 | 久久精品爱视频 | 国产一级在线观看视频 | www91在线观看 | 久久高清国产 | 久久99热精品这里久久精品 | 深爱综合网 | 91欧美日韩国产 | 久久亚洲免费 | 久久99国产精品久久 | 亚洲精品美女久久久久网站 | 天天射天天色天天干 | 91视频在线观看免费 | 日韩理论片在线 | 亚洲区另类春色综合小说 | 亚洲 中文 在线 精品 | 精品国产伦一区二区三区观看说明 | 久久精品国亚洲 | 麻豆视频免费入口 | 91精品久久久久久久久久入口 | 国产免费国产 | 婷婷久久五月天 | 日本韩国中文字幕 | 国产精品久久久久久久久久久久久久 | 亚洲精品国产麻豆 | 五月天com| 中文字幕一区三区 | 亚洲欧美成人综合 | 在线国产小视频 | 91人人爱 | 在线国产精品视频 | 久久综合五月天婷婷伊人 | 在线看国产一区 | 91麻豆精品国产91久久久久 | 国产成人久久av977小说 | 欧美激情综合五月 | 国产99久久久久 | 日韩精品资源 | 日韩在线资源 | 青春草视频 | 97视频在线观看网址 | 欧美性极品xxxx娇小 | 天天综合网入口 | 欧美日韩国内在线 | 国产精品视频永久免费播放 | 日韩精品免费在线播放 | 亚洲精品久久久久中文字幕m男 | 小草av在线播放 | 亚洲免费婷婷 | 不卡av在线免费观看 | 天堂av免费观看 | 99视频精品在线 | 超碰97在线看 | 中文字幕高清免费日韩视频在线 | 500部大龄熟乱视频 欧美日本三级 | 精品国产精品一区二区夜夜嗨 | 久久香蕉电影网 | 久香蕉| 日韩视频一区二区在线观看 | 伊人婷婷| 97福利在线 | 日韩一区正在播放 | 久草精品资源 | 色偷偷97| 一区二区三区三区在线 | 在线视频app | 国产a国产 | 黄色毛片一级片 | 五月香视频在线观看 | 五月天婷婷在线播放 | 成人免费观看a | 在线观看蜜桃视频 | 国产 日韩 欧美 中文 在线播放 | 亚洲高清在线精品 | av福利在线看 | 国产99在线 | 超碰免费久久 | 夜夜摸夜夜爽 | 精品女同一区二区三区在线观看 | 在线观看黄网 | 在线亚洲成人 | 成人精品影视 | 一本到在线 | 亚洲撸撸 | 99激情网| 伊人五月天婷婷 | 亚洲高清av | av在线8| 精品亚洲男同gayvideo网站 | 久久久久久久久久久高潮一区二区 | 日韩欧美精品免费 | 日韩高清一二三区 | 国产精品女同一区二区三区久久夜 | 可以免费看av | 视频直播国产精品 | 91亚洲狠狠婷婷综合久久久 | 蜜臀av一区二区 | 国产91成人在在线播放 | 日韩av高清 | av黄色影院| 亚洲免费av一区二区 | 国产精品美女久久久久久2018 | 欧美精品久久久久a | 狠狠操操网 | 国产探花视频在线播放 | 激情xxxx| 国产精品区免费视频 | 九色琪琪久久综合网天天 | 久久成人精品视频 | 91成人在线视频观看 | 久久精选| 国产超碰在线观看 | 91在线成人 | 丁香久久五月 | 香蕉久草 | 日韩免费网站 | 日韩在线 | 蜜臀久久99静品久久久久久 | 国产精品99久久久精品免费观看 | 97日日碰人人模人人澡分享吧 | 久久综合激情 | 四虎影视4hu4虎成人 | 欧美日韩视频 | 久久成人免费电影 | 久久一区二区三区国产精品 | 亚洲精品tv久久久久久久久久 | 国产xvideos免费视频播放 | 97成人在线观看视频 | 伊人久久av | 欧美精品乱码久久久久久按摩 | 免费看毛片网站 | 欧美一级片在线播放 | 欧美另类一二三四区 | 成人av片在线观看 | 最近中文字幕视频完整版 | 亚洲色图激情文学 | 久草视频2| 日韩欧美亚州 | 国产99久久九九精品免费 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 又黄又爽的免费高潮视频 | 一区二区三区免费在线观看 | 中文字幕在线观看网 | 在线激情av电影 | 国色天香在线 | 在线观看视频91 | 中文字幕免费高清av | av免费网站在线观看 | 伊色综合久久之综合久久 | 日韩欧美电影在线观看 | 国产三级精品三级在线观看 | 国产视频久| 久久精品亚洲国产 | 亚洲精品久久久久中文字幕二区 | 天天干,夜夜爽 | 久久精品99国产精品酒店日本 | 色欲综合视频天天天 | 色婷婷激情 | 青青河边草免费观看 | 人人舔人人射 | 久久久久久久毛片 | 日韩av一区二区在线播放 | 欧美久久久 | 在线电影中文字幕 | 日本三级不卡视频 | 国产精品福利小视频 | 在线观看中文字幕2021 | 日韩视频一区二区三区在线播放免费观看 | 91视频在线观看下载 | 天堂av在线网 | 国产免费黄视频在线观看 | 日本在线观看一区二区三区 | 中文字幕在线观看免费高清完整版 | 久久亚洲综合国产精品99麻豆的功能介绍 | 在线观看岛国片 | 日韩视频中文字幕 | 香蕉视频亚洲 | 国产丝袜 | 手机av片 | 久久综合久久鬼 | 久草在线免费资源站 | 欧美 激情在线 | 免费看国产曰批40分钟 | 日韩av片无码一区二区不卡电影 | 亚洲欧洲国产精品 | 国产精品无av码在线观看 | 91视频免费看网站 | 精品久久久久久久久久国产 | 在线视频18在线视频4k | 免费能看的av | 五月婷av | 中文字幕丝袜一区二区 | 久久久一本精品99久久精品66 | 五月婷网站 | 成人免费观看av | 狠狠操天天干 | 粉嫩av一区二区三区四区五区 | 国产女人免费看a级丨片 | 四川bbb搡bbb爽爽视频 | www日| 国产精品久久久久久久免费大片 | 久草在在线视频 | 99视频这里只有 | 国产精品99久久久久久武松影视 | 激情xxxx| 狠狠色狠狠色综合系列 | 1000部国产精品成人观看 | 人人爽人人爽人人片 | 国产精品av在线 | 欧美一级黄色视屏 | 91片在线观看| 在线精品视频免费播放 | 国产91在线观 | 国产精品入口久久 | av中文在线播放 | 欧美三级在线播放 | 欧美成人精品欧美一级乱 | 91免费的视频在线播放 | 69精品人人人人 | 日韩在线精品 | 国产精品剧情在线亚洲 | 一本一道久久a久久综合蜜桃 | 在线观看免费黄色 | 波多野结衣久久精品 | 久久五月精品 | 成人午夜在线观看 | 亚洲国产精品视频在线观看 | www.天天射 | 国内一级片在线观看 | 日韩69视频| 911国产精品 | 亚洲欧美在线综合 | 亚洲精品久久久蜜桃直播 | 国产精品欧美久久久久无广告 | 精品产品国产在线不卡 | 欧美在线一二 | 国产精品美女免费 | 色婷婷狠狠操 | 激情欧美一区二区免费视频 | www.eeuss影院av撸 | 色97在线 | 久久久久久久久久久免费视频 | 国产一二三四在线视频 | 99在线热播 | 中文字幕永久在线 | 麻豆果冻剧传媒在线播放 | 中文字幕 国产专区 | 欧美精品乱码久久久久久按摩 | 免费福利视频网站 | 国产精品乱码高清在线看 | 综合久久久久久久 | 国产小视频免费观看 | 天天干天天干天天 | 精品一区二区av | 成年人在线观看 | 久久国产亚洲视频 | 在线午夜电影神马影院 | 亚洲三级在线播放 | 99精品一级欧美片免费播放 | 国产黄色免费观看 | 正在播放五月婷婷狠狠干 | 亚州国产视频 | 99热最新网址 | 国产精品久久久久久久久久久杏吧 | 国产婷婷在线观看 | 婷香五月 | 人人爽久久涩噜噜噜网站 | 欧美伦理一区 | 在线国产91| 一级免费看视频 | 精品999久久久 | 91成人精品视频 | 久久久久久久久久电影 | 在线播放 日韩专区 | 一级α片免费看 | 亚洲日本激情 | 波多野结衣在线播放视频 | 久久高清国产视频 | 亚洲男女精品 | 激情一区二区三区欧美 | 精品一区二区三区电影 | 久久久亚洲影院 | x99av成人免费| 国产成人黄色在线 | 国产精品视频在线观看 | 91手机在线看片 | 久草视频免费 | 国产精品久久久 | 国产精品久久久久久久久久ktv | 日韩videos | 中文字幕视频免费观看 | 精品美女国产在线 |