久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

分布式會(huì)話共享方案:Redis+Spring Session實(shí)戰(zhàn)解析

分布式會(huì)話共享方案:Redis+Spring Session實(shí)戰(zhàn)解析 說實(shí)話寫這篇東西的起因很直接我接手過一個(gè)訪問量正在往上走的項(xiàng)目系統(tǒng)之前一直是單機(jī)部署內(nèi)網(wǎng)壓測(cè)、外網(wǎng)訪問都挺正常可一旦把應(yīng)用從1個(gè)實(shí)例擴(kuò)到3個(gè)實(shí)例線上立刻出問題。用戶前一個(gè)請(qǐng)求還在正常操作下一個(gè)請(qǐng)求回來就被引導(dǎo)去重新登錄客服那邊一天能收到幾十條“為什么老讓我重新登錄”的反饋。我排查了整整兩天中間試過調(diào)負(fù)載均衡策略、改Tomcat配置效果都不徹底最后拍板換成了標(biāo)題里這套組合Redis Spring Session。這不是網(wǎng)上常說的“臨時(shí)繞過”而是把Session的存儲(chǔ)位置從根本上搬到了應(yīng)用之外讓每一個(gè)實(shí)例都變成無狀態(tài)節(jié)點(diǎn)。如果你正在做微服務(wù)拆分、多實(shí)例部署或者只是單純想把單機(jī)應(yīng)用水平擴(kuò)容這套思路應(yīng)該能給你一個(gè)比較徹底、能直接落地的解決路徑。下面我把整個(gè)問題的來龍去脈、原理、實(shí)操步驟和上線后踩過的坑都梳理一遍內(nèi)容會(huì)偏“實(shí)戰(zhàn)記錄”風(fēng)格你可以邊看邊在本地復(fù)現(xiàn)。1. 單機(jī)Session的局限性多實(shí)例部署后為什么用戶被瘋狂踢下線1.1 一個(gè)真實(shí)故障輪詢策略導(dǎo)致用戶批量掉線先說當(dāng)時(shí)的現(xiàn)象。系統(tǒng)從單機(jī)擴(kuò)到3個(gè)實(shí)例前面掛了負(fù)載均衡策略是最常用的“輪詢”。邏輯上沒什么問題3臺(tái)機(jī)器平均分擔(dān)流量哪臺(tái)都能處理請(qǐng)求。結(jié)果用戶一登錄請(qǐng)求被分到實(shí)例A登錄成功JSESSIONID寫進(jìn)瀏覽器Cookie刷新頁(yè)面后下一個(gè)請(qǐng)求被輪詢到實(shí)例B實(shí)例B在自己的本地內(nèi)存里根本找不到這個(gè)Session于是判定用戶未登錄直接重定向到登錄頁(yè)。最迷惑人的是這個(gè)問題不是100%必現(xiàn)。同一個(gè)用戶點(diǎn)幾次有時(shí)能保持登錄有時(shí)被踢出來完全取決于當(dāng)前請(qǐng)求被分發(fā)到哪臺(tái)機(jī)器。我在本地復(fù)現(xiàn)的時(shí)候開著開發(fā)者工具看Network面板清一色的302跳轉(zhuǎn)Cookie明明沒丟服務(wù)器就是不認(rèn)。后來往日志里加了節(jié)點(diǎn)信息才發(fā)現(xiàn)所有“登錄無效”的請(qǐng)求都落在非登錄節(jié)點(diǎn)上。到這一步問題的定位已經(jīng)很明確HttpSession默認(rèn)只存在于單個(gè)JVM進(jìn)程內(nèi)實(shí)例之間互相不知道對(duì)方手里的Session。1.2 理解HttpSession的“本地宿命”狀態(tài)為什么只在單個(gè)實(shí)例里Java Web開發(fā)里HttpSession的默認(rèn)實(shí)現(xiàn)類是存在應(yīng)用服務(wù)器內(nèi)存里的也就是Tomcat、Jetty這類容器的JVM堆。當(dāng)你在代碼里執(zhí)行request.getSession().setAttribute(user, user)底層就是在當(dāng)前實(shí)例的堆內(nèi)存里維護(hù)一個(gè)Map結(jié)構(gòu)key是Session IDvalue是屬性集合。這個(gè)Map的生命周期被死死綁定在單個(gè)JVM上。單機(jī)部署時(shí)沒有問題因?yàn)樗姓?qǐng)求都打到同一個(gè)JVMSession數(shù)據(jù)天然可見。但一旦拆成多個(gè)實(shí)例每個(gè)實(shí)例都有自己獨(dú)立的內(nèi)存A實(shí)例保存的Session對(duì)B實(shí)例來說就是“不存在的數(shù)據(jù)”。負(fù)載均衡把請(qǐng)求撒到不同實(shí)例上時(shí)用戶會(huì)話自然就“丟”了。本質(zhì)是會(huì)話狀態(tài)Session State和計(jì)算節(jié)點(diǎn)Application Instance被綁死在一起橫向擴(kuò)容時(shí)狀態(tài)沒有跟著擴(kuò)容。1.3 ip_hash和Session復(fù)制為什么只是“緩解”而不是“修復(fù)”我第一反應(yīng)是改負(fù)載均衡策略把輪詢改成ip_hash讓同一IP的請(qǐng)求固定打到同一臺(tái)實(shí)例。這個(gè)方案在內(nèi)部辦公網(wǎng)絡(luò)環(huán)境下驗(yàn)證是有效的但放到公網(wǎng)環(huán)境就露餡了。移動(dòng)網(wǎng)絡(luò)下用戶經(jīng)常切換基站出口IP會(huì)變化公司、家庭、4G/5G網(wǎng)絡(luò)來回切換時(shí)IP也不固定還有一些代理和NAT場(chǎng)景同一個(gè)用戶每次請(qǐng)求的源IP根本不是同一個(gè)。IP一變化ip_hash就把請(qǐng)求分到另一臺(tái)實(shí)例用戶一樣被踢。更麻煩的是即使IP一直穩(wěn)定如果某臺(tái)實(shí)例要做滾動(dòng)發(fā)布或重啟固定在這臺(tái)實(shí)例上的所有在線用戶會(huì)在重啟期間集體掉線。ip_hash本質(zhì)上是在“請(qǐng)求入口”層面想辦法把用戶留在同一個(gè)節(jié)點(diǎn)上它沒有解決“Session狀態(tài)不共享”的根因只是降低了狀態(tài)串臺(tái)的概率。我也看過Session復(fù)制方案。Tomcat支持把Session變更廣播到集群中的其他節(jié)點(diǎn)這樣每個(gè)實(shí)例都復(fù)制一份全量Session。但復(fù)制帶來的問題同樣明顯隨著在線用戶增多集群內(nèi)需要同步的數(shù)據(jù)量成倍增長(zhǎng)廣播風(fēng)暴、網(wǎng)絡(luò)開銷、延遲抖動(dòng)很快會(huì)出現(xiàn)。而且這個(gè)方案強(qiáng)依賴具體應(yīng)用服務(wù)器廠商的實(shí)現(xiàn)換容器、換云平臺(tái)時(shí)兼容成本很高。Session復(fù)制把狀態(tài)從一個(gè)節(jié)點(diǎn)復(fù)制到所有節(jié)點(diǎn)本質(zhì)上還是在“單機(jī)Session”的框架里打轉(zhuǎn)治標(biāo)不治本。2. Redis Spring Session的組合原理這為什么算“最終方案”2.1 Spring Session接管了Session的生命周期而不是存?zhèn)€key那么簡(jiǎn)單要理解為什么這套組合能解決問題先搞清楚Spring Session干了什么。Spring Session不是一個(gè)簡(jiǎn)單的“Session工具類”它的核心是通過一個(gè)Servlet過濾器——SessionRepositoryFilter——把應(yīng)用原本使用的HttpSession實(shí)現(xiàn)整個(gè)替換掉。具體流程是這樣的請(qǐng)求進(jìn)入Servlet容器后SessionRepositoryFilter會(huì)先把原始的HttpServletRequest包裝成一個(gè)SessionRepositoryRequestWrapper。當(dāng)你調(diào)用request.getSession()時(shí)它不再?gòu)娜萜鞅镜氐腟essionManager里拿對(duì)象而是從Spring Session配置好的SessionRepository里去取。這個(gè)SessionRepository可以是基于Redis、JDBC、MongoDB等任意持久化存儲(chǔ)實(shí)現(xiàn)我們這里用的是RedisSessionRepository。整套機(jī)制對(duì)外暴露的接口仍然是標(biāo)準(zhǔn)的HttpSession所以業(yè)務(wù)代碼基本不用改動(dòng)以前怎么用session.setAttribute()現(xiàn)在還是怎么用。Spring Session在背后幫你完成了Session的創(chuàng)建、讀取、寫入、過期刪除并且把數(shù)據(jù)序列化后存到Redis。這里有一個(gè)關(guān)鍵點(diǎn)Session的狀態(tài)不再存放在應(yīng)用實(shí)例的本地內(nèi)存而是被抽離到一個(gè)獨(dú)立的、所有實(shí)例都能訪問的存儲(chǔ)層。2.2 Redis里到底存了哪些key一個(gè)登錄用戶的數(shù)據(jù)結(jié)構(gòu)長(zhǎng)什么樣光說“把Session存到Redis”有點(diǎn)抽象看完Redis里的實(shí)際數(shù)據(jù)結(jié)構(gòu)你會(huì)有更直觀的理解。Spring Session在Redis中主要維護(hù)以下幾類key。第一類是主數(shù)據(jù)key默認(rèn)前綴是spring:session:sessions:sessionId類型是Hash。這個(gè)Hash里存了Session的創(chuàng)建時(shí)間、最后訪問時(shí)間、最大不活躍間隔、以及你通過setAttribute寫入的每一個(gè)業(yè)務(wù)屬性。比如你用session.setAttribute(loginUser, userInfo)Redis里就會(huì)多出一個(gè)fieldfield名是sessionAttr:loginUservalue是序列化之后的用戶信息。第二類是過期索引key格式是spring:session:expirations:timestamp類型是Set。這里面保存了一批即將在指定時(shí)間點(diǎn)過期的Session ID供后臺(tái)任務(wù)定點(diǎn)掃描使用。Spring Session并不是完全依賴Redis的key過期機(jī)制來清理Session因?yàn)镽edis key過期事件并不可靠可能丟失、可能延遲。它的策略是每個(gè)被訪問的Session都會(huì)刷新自己的最后訪問時(shí)間同時(shí)由一個(gè)專門的維護(hù)任務(wù)在到達(dá)過期時(shí)間點(diǎn)時(shí)把還在集合里的Session ID找出來做顯式刪除。第三類是查詢索引key格式是spring:session:findByIndexName:索引名:索引值比如按用戶名建立索引之后可以快速查出某個(gè)用戶當(dāng)前對(duì)應(yīng)的Session列表。做強(qiáng)制下線、在線用戶列表這類功能時(shí)這個(gè)索引很有用。通過這幾種key的組合Spring Session把Session的讀寫、過期、查詢都安排得明明白白。Redis本身就是KV存儲(chǔ)Hash結(jié)構(gòu)天然適合存儲(chǔ)“屬性集合”這種數(shù)據(jù)形態(tài)TTL機(jī)制又和Session的過期時(shí)間能對(duì)應(yīng)上。選Redis的根本原因不是因?yàn)樗芫彺娑且驗(yàn)樗峁┝艘徽追植际江h(huán)境都能訪問的、帶超時(shí)能力的、結(jié)構(gòu)足夠靈活的數(shù)據(jù)存儲(chǔ)能力。2.3 這套組合帶來的三個(gè)直接收益收益是很直觀的。第一是實(shí)例徹底無狀態(tài)化。應(yīng)用節(jié)點(diǎn)不再持有用戶狀態(tài)新增機(jī)器、縮減機(jī)器、滾動(dòng)重啟對(duì)在線用戶沒有任何影響。用戶在某臺(tái)機(jī)器上登錄下一次請(qǐng)求被負(fù)載均衡分到另一臺(tái)機(jī)器依舊能從Redis里拿到同一個(gè)Session。擴(kuò)容從“有狀態(tài)擴(kuò)容”變成了“無狀態(tài)擴(kuò)容”技術(shù)上輕松了一個(gè)量級(jí)。第二是故障影響面大幅縮小。以前如果一臺(tái)實(shí)例宕機(jī)那臺(tái)機(jī)器上的所有在線用戶集體掉線?,F(xiàn)在實(shí)例宕機(jī)只要Redis集群還穩(wěn)著用戶根本感知不到后端少了一臺(tái)機(jī)器請(qǐng)求被自動(dòng)分發(fā)到其他健康實(shí)例Session照??捎?。第三是統(tǒng)一了會(huì)話管理能力。你可以通過Redis里的Session數(shù)據(jù)做全局的用戶登錄態(tài)清理比如后臺(tái)強(qiáng)制踢人下線、限制賬號(hào)同時(shí)在多端登錄、構(gòu)建實(shí)時(shí)在線用戶列表。這在單機(jī)Session時(shí)代幾乎不可想象但在多個(gè)微服務(wù)共享同一個(gè)Redis時(shí)這些功能實(shí)現(xiàn)起來非常順手。很多團(tuán)隊(duì)最后選這套方案不只是為了“解決掉線”而是為了把會(huì)話能力沉淀成一套基礎(chǔ)設(shè)施。3. 實(shí)操落地從依賴引入到雙實(shí)例驗(yàn)證3.1 依賴和版本選型Spring Boot 2.x/3.x別搞混直接給可用的依賴清單我用的是Maven。假設(shè)你的項(xiàng)目是標(biāo)準(zhǔn)的Spring Boot Web應(yīng)用需要引入三個(gè)starterdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.springframework.session/groupId artifactIdspring-session-data-redis/artifactId /dependency版本號(hào)我沒有手動(dòng)指定而是交給Spring Boot的依賴管理統(tǒng)一控制。這里要特別提醒spring-session-data-redis的版本必須和Spring Boot版本匹配最省心的做法就是讓Spring Boot BOM來管理它。自己?jiǎn)为?dú)指定版本很容易踩到API不兼容的坑尤其是Spring Boot 3.x和2.x之間包名、配置項(xiàng)差異很大。我這里本地驗(yàn)證用的是Spring Boot 2.7環(huán)境但下面的配置我會(huì)同時(shí)給出Spring Boot 3.x需要調(diào)整的地方。Spring Boot 3.x把Redis配置的前綴從spring.redis.*改成了spring.data.redis.*Session相關(guān)的配置不變。碰到3.x項(xiàng)目別慣性照著舊文檔抄否則配置項(xiàng)根本不會(huì)生效。3.2 關(guān)鍵配置Redis連接、Session存儲(chǔ)與命名空間配置文件是重頭戲。先說一個(gè)最容易出錯(cuò)的點(diǎn)Spring Boot 2.x和3.x的Redis連接配置前綴不一樣。Spring Boot 2.x的配置spring: redis: host: 127.0.0.1 port: 6379 password: abc123 database: 0 timeout: 3s lettuce: pool: max-active: 16 max-idle: 8 min-idle: 2 max-wait: 3sSpring Boot 3.x的配置spring: data: redis: host: 127.0.0.1 port: 6379 password: abc123 database: 0 timeout: 3s lettuce: pool: max-active: 16 max-idle: 8 min-idle: 2 max-wait: 3s兩段配置的內(nèi)容幾乎一樣唯獨(dú)嵌套層級(jí)從spring.redis變成了spring.data.redis。我用的是Lettuce客戶端“Lettuce連接池”需要單獨(dú)啟用spring.redis.lettuce.pool.*或3.x的spring.data.redis.lettuce.pool.*才會(huì)生效。如果不配連接池高并發(fā)下Lettuce很容易出現(xiàn)連接等待超時(shí)生產(chǎn)環(huán)境一定要配。Session本身的配置如下spring: session: store-type: redis timeout: 30m redis: namespace: demo-session flush-mode: on_save save-mode: on_set_attribute這里解釋幾個(gè)參數(shù)背后的含義。store-type: redis是明確告訴Spring Boot用Redis存儲(chǔ)Session不帶這個(gè)參數(shù)時(shí)Spring Boot可能會(huì)根據(jù)classpath自動(dòng)推斷但顯式寫出來更可控。timeout: 30m是Session最大不活躍間隔單位是m代表分鐘這個(gè)值最終會(huì)寫入Redis的TTL。生產(chǎn)環(huán)境要根據(jù)業(yè)務(wù)形態(tài)設(shè)置純管理后臺(tái)可以設(shè)短一點(diǎn)電商網(wǎng)站購(gòu)物車場(chǎng)景可能需要更長(zhǎng)。redis.namespace是給當(dāng)前應(yīng)用設(shè)置Redis key前綴如果多個(gè)應(yīng)用共用同一個(gè)Redis實(shí)例一定要設(shè)置不同的namespace否則不同應(yīng)用的Session數(shù)據(jù)會(huì)互相干擾。flush-mode: on_save表示Session每次請(qǐng)求處理結(jié)束時(shí)才把數(shù)據(jù)寫回Redis這是默認(rèn)模式。還有一個(gè)模式是immediate每次調(diào)用setAttribute時(shí)立刻寫Redis實(shí)時(shí)性高但性能差一般不建議生產(chǎn)環(huán)境使用。save-mode: on_set_attribute表示只要Session屬性發(fā)生變化就標(biāo)記為需要保存這是默認(rèn)行為通常不需要改動(dòng)。如果要通過Java配置類來開啟Redis Session存儲(chǔ)可以加上一個(gè)EnableRedisHttpSession注解Configuration EnableRedisHttpSession(maxInactiveIntervalInSeconds 1800) public class SessionConfig { }這個(gè)注解里可以配置最大不活躍間隔秒數(shù)和spring.session.timeout是等價(jià)的。我個(gè)人更推薦用配置文件來管理改參數(shù)時(shí)不用重新編譯打包。3.3 自定義Cookie序列化器Cookie名字、HttpOnly與SameSiteSpring Session默認(rèn)使用名為SESSION的Cookie來傳遞Session ID但很多老項(xiàng)目前端約定的是JSESSIONID。為了兼容業(yè)務(wù)系統(tǒng)通常要自定義一個(gè)CookieSerializerBean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer new DefaultCookieSerializer(); serializer.setCookieName(JSESSIONID); serializer.setCookiePath(/); serializer.setUseHttpOnlyCookie(true); serializer.setSameSite(Lax); return serializer; }setCookiePath(/)要特別注意。如果項(xiàng)目部署在/api這類子路徑下Cookie path設(shè)置不對(duì)瀏覽器會(huì)在跨路徑請(qǐng)求時(shí)不再攜帶Cookie導(dǎo)致Session丟失。setUseHttpOnlyCookie(true)能防止JavaScript讀取Cookie降低XSS攻擊后的信息泄露風(fēng)險(xiǎn)。setSameSite(Lax)用于控制Cookie在跨站請(qǐng)求時(shí)的發(fā)送策略對(duì)前后端分離的部署方式影響很大。如果你的系統(tǒng)還有HTTPS環(huán)境可以開啟serializer.setUseSecureCookie(true)確保Cookie只通過HTTPS傳輸。3.4 雙實(shí)例聯(lián)調(diào)腳本證明Session真的共享了配置全部搞定后驗(yàn)證邏輯很簡(jiǎn)單本地起兩個(gè)應(yīng)用實(shí)例端口分別設(shè)為8081和8082然后在8081上登錄獲取Cookie再用這個(gè)Cookie去訪問8082的接口。如果8082能返回當(dāng)前登錄用戶的信息說明Session已經(jīng)成功共享。第一步先在一個(gè)終端啟動(dòng)第一個(gè)實(shí)例mvn spring-boot:run -Dspring-boot.run.arguments--server.port8081第二個(gè)終端啟動(dòng)第二個(gè)實(shí)例mvn spring-boot:run -Dspring-boot.run.arguments--server.port8082假設(shè)項(xiàng)目里有一個(gè)登錄接口/api/login和一個(gè)獲取當(dāng)前用戶的接口/api/user/info。用curl先登錄curl -i -X POST http://localhost:8081/api/login \ -H Content-Type: application/json \ -d {username:admin,password:123456}響應(yīng)頭里能看到Set-Cookie: JSESSIONIDxxxxx; Path/; HttpOnly。把這個(gè)Cookie值記下來再去請(qǐng)求8082的接口curl -i http://localhost:8082/api/user/info \ -H Cookie: JSESSIONIDxxxxx正常返回用戶信息就是驗(yàn)證通過。這時(shí)再去Redis里檢查一下redis-cli keys demo-session:* hgetall demo-session:sessions:xxxxx能看到Session屬性已經(jīng)落在Redis里而且8082實(shí)例讀取的底層數(shù)據(jù)源是同一個(gè)Redis。這套驗(yàn)證在本地大概10分鐘就能跑完比純看理論踏實(shí)得多。4. 生產(chǎn)環(huán)境下踩過的坑亂碼、覆蓋、網(wǎng)關(guān)和內(nèi)存4.1 序列化亂碼與JSON反序列化失敗看懂根因比替換配置更重要上線運(yùn)行不到一周我就發(fā)現(xiàn)一個(gè)隱蔽問題Redis里存的Session屬性值有一大堆看不懂的字節(jié)。直接用hgetall查看某個(gè)Session時(shí)field的值長(zhǎng)這樣\xac\xed\x00\x05t\x00\x03com...這種以\xac\xed開頭的亂碼是Java標(biāo)準(zhǔn)JDK序列化機(jī)制的產(chǎn)物。Spring Session默認(rèn)使用JDK自帶的序列化器把對(duì)象轉(zhuǎn)成二進(jìn)制字節(jié)后再塞進(jìn)Redis。它的問題有兩個(gè)一是不可讀排查問題時(shí)瞪大了眼也看不出里面存的是什么二是兼容性差如果對(duì)象類的結(jié)構(gòu)發(fā)生變化比如新增字段、刪除字段舊數(shù)據(jù)反序列化時(shí)直接拋InvalidClassException。解決辦法是替換Redis序列化器。Spring Session默認(rèn)從springSessionDefaultRedisSerializer這個(gè)Bean獲取序列化器所以我只需要覆蓋這個(gè)Bean即可Bean public RedisSerializerObject springSessionDefaultRedisSerializer() { return new GenericJackson2JsonRedisSerializer(); }注意這里必須叫springSessionDefaultRedisSerializer不是隨便定義個(gè)RedisTemplate的序列化器。很多人在這里踩坑配置了RedisTemplateString,Object的序列化方式結(jié)果Session數(shù)據(jù)還是JDK序列化因?yàn)镾pring Session內(nèi)部根本不走RedisTemplate的默認(rèn)序列化邏輯。換JSON序列化之后還有一個(gè)更深的坑要提醒JSON串里默認(rèn)會(huì)帶上類信息class字段用來反序列化時(shí)確定目標(biāo)類型。一旦你的用戶類從User改名為Account或者在包里移動(dòng)了位置Redis里舊數(shù)據(jù)的類路徑已經(jīng)不存在了反序列化直接失敗。我后來定的規(guī)矩是涉及Session里保存對(duì)象的字段變更時(shí)要么提前清空線上Redis的Session前綴要么在代碼里寫一個(gè)兼容的轉(zhuǎn)換處理器。老數(shù)據(jù)有時(shí)候舍不得清但Session本來就是“丟了就讓用戶重新登錄”的臨時(shí)數(shù)據(jù)優(yōu)先保證系統(tǒng)可用比死守?cái)?shù)據(jù)更實(shí)際。4.2 用戶的并發(fā)請(qǐng)求導(dǎo)致Session覆蓋一個(gè)被低估的丟失更新問題這個(gè)坑不是馬上暴露的而是上線后功能越加越多才慢慢顯現(xiàn)?,F(xiàn)象是用戶同時(shí)打開多個(gè)瀏覽器標(biāo)簽頁(yè)在一個(gè)標(biāo)簽頁(yè)里更新了Session中的用戶資料隨后在另一個(gè)標(biāo)簽頁(yè)里操作時(shí)第一次更新“消失”了。根因要從Redis的讀寫模式說起。Spring Session在請(qǐng)求結(jié)束后把整個(gè)Session對(duì)象寫回Redis這個(gè)操作不是原子更新局部字段而是讀出Session、反序列化、修改屬性、整體寫回的過程。當(dāng)兩個(gè)請(qǐng)求分別落在兩個(gè)不同的實(shí)例上兩邊幾乎同時(shí)從Redis讀出同一個(gè)Session的同一個(gè)字段各自在本地做修改然后先后寫回Redis。后寫的那個(gè)會(huì)把先寫的覆蓋掉其中一個(gè)請(qǐng)求的修改就丟了。這種問題場(chǎng)景和并發(fā)寫數(shù)據(jù)庫(kù)記錄時(shí)的“丟失更新”完全一致只是很多人沒意識(shí)到Session也會(huì)遇到。我當(dāng)時(shí)的排查思路是確認(rèn)哪些數(shù)據(jù)會(huì)被高頻并發(fā)寫。比如用戶每次訪問時(shí)更新“最近訪問時(shí)間”這個(gè)字段就在并發(fā)時(shí)頻繁觸發(fā)覆蓋。解決辦法分兩路走一是把并發(fā)寫頻率最高的數(shù)據(jù)從Session里挪出去比如“最近訪問時(shí)間”這種數(shù)據(jù)完全可以通過Redis單獨(dú)記錄一個(gè)user:online:userId的key來管理不必塞進(jìn)Session二是盡量減少Session里的可變屬性總量Session只保留登錄憑證、用戶主鍵這類低頻變化的標(biāo)識(shí)性數(shù)據(jù)其余高頻業(yè)務(wù)數(shù)據(jù)走專門設(shè)計(jì)的Redis key。如果確實(shí)需要保留并發(fā)寫場(chǎng)景可以考慮把Session的存儲(chǔ)粒度做細(xì)或者引入分布式鎖來控制同一Session的寫并發(fā)。但我的真實(shí)感受是最佳策略不是“控制并發(fā)”而是“減少寫入”——Session的屬性越少、越穩(wěn)定這套方案就越穩(wěn)。它本質(zhì)上是一個(gè)定位標(biāo)識(shí)不是內(nèi)容倉(cāng)庫(kù)。4.3 網(wǎng)關(guān)轉(zhuǎn)發(fā)與前后端分離下的Cookie透?jìng)黜?xiàng)目改造到一定階段前端從服務(wù)端渲染換成了前后端分離請(qǐng)求統(tǒng)一走API網(wǎng)關(guān)。網(wǎng)關(guān)部署完之后又冒出一個(gè)新問題用戶明明登錄成功了緊接著請(qǐng)求業(yè)務(wù)接口卻返回401。瀏覽器里Cookie明明還在后端Session也存在Redis里但請(qǐng)求就是帶不到后端。排查下來發(fā)現(xiàn)是網(wǎng)關(guān)這一層把Cookie信息丟掉了。網(wǎng)關(guān)在轉(zhuǎn)發(fā)HTTP請(qǐng)求時(shí)如果配置里沒有顯式轉(zhuǎn)發(fā)Cookie頭后端拿到的請(qǐng)求里就不會(huì)包含JSESSIONID。后端的SessionRepository完全不知道該查找哪個(gè)Session自然判定未登錄。解決方式是在網(wǎng)關(guān)的轉(zhuǎn)發(fā)配置里把Cookie頭原樣透?jìng)?。以常見的網(wǎng)關(guān)配置為例在路由規(guī)則里加一行轉(zhuǎn)發(fā)Headerfilters: - PreserveHostHeader - RewritePath/api/(?segment.*), /$\{segment} default-filters: - DedupeResponseHeaderAccess-Control-Allow-Credentials Access-Control-Allow-Origin核心是確保轉(zhuǎn)發(fā)請(qǐng)求時(shí)保留瀏覽器提交的Cookie頭同時(shí)響應(yīng)時(shí)不要重復(fù)添加互相沖突的CORS頭。跨域配置也是個(gè)關(guān)鍵點(diǎn)。前后端域名不一致時(shí)后端必須配置CORS允許攜帶憑證Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin(https://frontend.example.com); config.addAllowedHeader(*); config.addAllowedMethod(*); return new CorsWebFilter(source - config); }這里有一個(gè)安全限制必須要知道allowCredentials(true)時(shí)allowedOrigins不能寫成*必須指定具體域名。瀏覽器規(guī)范明確禁止攜帶憑證的跨域請(qǐng)求使用通配符來源。前端調(diào)用時(shí)也要設(shè)置withCredentials: true否則即使后端允許瀏覽器也不會(huì)主動(dòng)攜帶Cookie。這個(gè)跨域問題排查起來比較費(fèi)時(shí)我每次都會(huì)先看瀏覽器Network面板里請(qǐng)求是否帶上了Cookie再看響應(yīng)頭里Access-Control-Allow-Credentials是否為true兩步能定位90%的問題。4.4 Redis內(nèi)存持續(xù)增長(zhǎng)與session過期回收失效還有一個(gè)經(jīng)典問題系統(tǒng)跑了一段時(shí)間后Redis內(nèi)存占用越來越高明明設(shè)置了Session過期時(shí)間數(shù)據(jù)卻沒有按預(yù)期釋放。這通常不是Spring Session沒做清理而是清理機(jī)制依賴某些前提條件。Spring Session的過期清理依賴兩個(gè)關(guān)鍵機(jī)制一個(gè)是通過spring:session:expirations:timestamp集合定時(shí)掃描另一個(gè)是Redis的過期key事件通知。如果Redis實(shí)例關(guān)閉了notify-keyspace-events配置Spring Session就無法收到key過期事件來觸發(fā)后續(xù)的刪除操作。雖然掃描任務(wù)也能兜底但事件通知關(guān)閉時(shí)清理效率和實(shí)時(shí)性都會(huì)下降內(nèi)存里會(huì)殘留更多等待淘汰的Session數(shù)據(jù)。建議在Redis配置里打開必要的事件通知notify-keyspace-events Exgx這個(gè)配置項(xiàng)開啟了過期key事件和通用命令事件。生產(chǎn)環(huán)境調(diào)整Redis配置后要記得驗(yàn)證生效用config get notify-keyspace-events確認(rèn)。更需要注意的另一個(gè)坑是Redis內(nèi)存淘汰策略。如果Redis配置的maxmemory-policy是allkeys-lru那么當(dāng)內(nèi)存達(dá)到上限時(shí)Redis會(huì)從所有key里挑選最久未用的key來淘汰Session數(shù)據(jù)也會(huì)被當(dāng)成普通緩存清掉哪怕它還沒到過期時(shí)間。結(jié)果就是用戶明明還在活躍Session卻被Redis強(qiáng)制刪除用戶被莫名其妙踢下線。這種情況特別難排查因?yàn)槿罩纠锟床坏饺魏螆?bào)錯(cuò)就是偶發(fā)掉線。后來我把Redis的內(nèi)存淘汰策略改成了volatile-lru這個(gè)策略只淘汰設(shè)置了TTL的key。Session主key自帶TTL業(yè)務(wù)緩存如果不需要被淘汰可以不帶TTL。這樣既能保證Redis內(nèi)存可控又不會(huì)誤傷活躍Session。同時(shí)我還寫了一個(gè)定時(shí)巡檢腳本每天檢查一次Redis內(nèi)存增長(zhǎng)曲線和spring:session:*的key數(shù)量如果發(fā)現(xiàn)Session數(shù)量異常增多基本都是某個(gè)接口在瘋狂創(chuàng)建新Session這時(shí)會(huì)去檢查業(yè)務(wù)代碼里是不是有“一登錄就訪問request.getSession(false)并觸發(fā)創(chuàng)建新Session”的邏輯。結(jié)尾改動(dòng)之外我留下的一點(diǎn)心得整套方案落地后再回看技術(shù)層面的難度其實(shí)不算高真正的難點(diǎn)在于兩處一是意識(shí)到“Session狀態(tài)必須和實(shí)例解耦”這個(gè)根本前提二是上線后通過實(shí)際問題把方案打磨到符合業(yè)務(wù)特性。如果你還在單機(jī)架構(gòu)里提前把Session遷到Redis并不是過度設(shè)計(jì)而是一筆很劃算的“架構(gòu)保險(xiǎn)”因?yàn)榈鹊綌U(kuò)容當(dāng)天再處理緊迫感和故障壓力會(huì)讓你沒有充足時(shí)間考慮細(xì)節(jié)。我個(gè)人的體會(huì)是遷到Redis Spring Session之后最需要改變的其實(shí)是“往Session里亂塞東西”的習(xí)慣。單機(jī)時(shí)代往Session塞什么都能跑但分布式環(huán)境下Session變成了分布式共享存儲(chǔ)每一次寫入都對(duì)應(yīng)一次網(wǎng)絡(luò)請(qǐng)求加一次序列化濫用會(huì)直接把Redis拖成瓶頸。我現(xiàn)在定的原則很簡(jiǎn)單Session里只放穩(wěn)定且低頻使用的核心標(biāo)識(shí)數(shù)據(jù)比如用戶ID、登錄令牌、少量偏好設(shè)置所有需要業(yè)務(wù)計(jì)算和頻繁變化的數(shù)據(jù)單獨(dú)設(shè)計(jì)Redis緩存key或落庫(kù)。這套原則比任何技術(shù)選型都更影響長(zhǎng)期穩(wěn)定。最后分享一個(gè)實(shí)用小技巧本地開發(fā)環(huán)境可以保留內(nèi)存存儲(chǔ)只把生產(chǎn)環(huán)境切到Redis避免每個(gè)開發(fā)同學(xué)都依賴一個(gè)共享的Redis實(shí)例。具體做法是在application.yml里用多環(huán)境配置區(qū)分dev和proddev環(huán)境不配spring.session.store-type讓它走Spring Boot默認(rèn)的內(nèi)存Sessionprod環(huán)境顯式配置成redis。這樣開發(fā)調(diào)試不受Redis狀態(tài)影響線上又能享受無狀態(tài)擴(kuò)容的紅利。兩套環(huán)境隔離好開發(fā)效率和系統(tǒng)穩(wěn)定性都可以兼得。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美亚洲| 狠狠久久手机视频精品| 色色热| 亚洲人成在线放东京热| 色天天野狼综合社区| 毛片17S| 丁香色婷婷| 久久国产热视频97电影| 大学生口爆吞精| 美女啊啊啊啊啊| 成人精品视频| 97看操| http://qxhbdz.com| 婷婷影院入口| 亚洲AV噜噜狠狠网址蜜桃动漫| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 中文字幕欧美日本乱码一线二线| 亚洲一区二区三区麻豆传媒| a片自拍直播视频| 丰满人妻一区二区三区四区| 国产精品69久久久久久久| 欧日韩不卡视.频| 亚洲成人久久一区二区| 超碰97人人cao| 久久成人东京热人妻| 日韩女优在线| 桃色五月天| 乱论91| 富女玩鸭子一级毛片| 男人天堂最新手机版在线青青草| 91九九九逼| 91久久国产综合久久| 97色婷| 婷婷亚洲综合| 99婷婷| 欧美色婷婷| 色综合色综合网| 极品尤物在线观看| 亚洲色图大香| 91l欧美在线| 亚洲欧美国产中文字幕| 亚洲欧美一区二区不卡视频播放| 安徽熟妇视频| 俺去啦自拍| 美女91网| 久久成人国产精品| 欧州一区二区三区四区| 国产97色在线| 亚洲有码 欧美精品| 天天干天天做| 色欲人妻一区二区在线| 狠狠操夜夜操蜜桃视频三区| 99xav| 日韩视频小说在线观看| 国产97综合| 天啪| 国内自拍 日韩激情 99| 日本三级小说中文字幕| 女上位精品在线| 风月影院十八禁| 欧美A片中文字幕| 午夜理论片在线观看免费| www久久99| xxx亚洲午夜天堂| 欧美成人国产精品| 中文字幕一区二区视频在线观看| 无色无码| 色色综合97| 久久久日本电影| 免费αV在线视频| 丰满人妻一区二区三区| 最新9久久久9免费视频| 日本成人A片网站| 91狠| 亚洲色图91| 久久草大香蕉| 色天天野狼综合社区| 国产高清吃奶免费视频网站| 亚州成人a∨| 中文字幕成人乱码熟女精品国50| 亚欧成人中文字幕一区| 亚洲超碰综合网| 综合久久久久久久久91| 青青草国产亚洲精品久久| 91亚洲人| 襙一襙| 狠狠久久四虎| 日本不卡码黄色 | 男人的天堂1024| 手机看片1024你懂的国产| 高树玛利亚无码流出| 一级AAA片一区二区三区| 一级久久性爱视频| 999国产精品999久久久久久| 五月激情小说| 欧美色www亚洲国产阿娇要播| 中文字幕高清20页视频| 国产一区二区成人av在线播放| 婷婷香蕉欧美在线一区二区三区 | 国产精品伦理| www…国产操逼| AV女优男人的天堂| 9/A片| 欧美日韩国产成人高清| 亚洲高清少妇| 欧美亚洲激情小说| 久久精品美女一区| 日本中文熟女视频| 蜜桃香蕉久草精品在线| 色老汉色| 日韩成人色图| 亚洲国产欧美中文永久| 日本人妻伦在线中文字幕| se,,,亚洲欧美| 六月丁香啪啪| 久久AV无码网址| 少妇熟女1区2区3区| 中文字幕一区二区三区蜜桃视频| 福利风月五月天影院| 能直接看AV的网站| 乳欲人妻办公室奶水| 日韩情色一区二区| 亚洲 欧美 色图| 综合欧美日韩在线| 日本欧美中文字幕| www.黄色在线| 有码免费观看| 久久久久成人蜜桃精品| 亚洲 欧美日韩 另类| 国产亚洲深夜激情| 国产家庭乱伦表演| 日本色色视频网站| 亚洲欧洲综合av在线| 2019男人的天堂| 国产精品天干天干综合网麻豆| 99自拍B亚洲 | 60秒免费视频| 国产精品一区二区三区四区五区| 91熟女网| 国产狂喷潮在线精品| 日韩熟女操逼| 中文字幕日韩人妻视频一区二区三区| 岛国视频免费在线观看| 国产高清无码一区二区三区四区皇冠| 亚洲中文字幕精品久久久久久直播| 自拍偷拍草一草| 精品欧美А∨无码黑人大荫蒂| 欧美18老人禁| 在线强奷到舒服的无码视频| 久热91| 四虎影视在线| 四虎精品一区| 人人摸人人入| 国产精品自拍欧美在线| 艹我哪美一区无码| 97精品中文字幕| 超碰偷拍| 国产三级在线现体验区| 婷婷伊人网| 欧美熟妇视频| 中文字幕免费在线观看| 国产亚洲精品A在线观看下载| 一本一道vs波多野结衣| 日韩AV一区二区三区三州三州| 超清福利精品视频在线| 色播五月丁香| 男人在线天堂| 色香色欲天天综合网天天来吧| 亚洲欧美中文日韩视频中国语| 2020视频1区2区3区| wuyechaopeng| 国产精品国产自产高清AV| 五月丁香色婷婷| 亚州色图片在线色| 精品无码久久久久久国产浪潮| 99精品在线观看| 午夜无码熟妇丰满人妻| 淫荡少妇免费| 香蕉免费一区二区三区不读| 福利操逼| 亚洲污污网站| 亚洲图片偷拍视频区| 亚洲91网。| 中国农村熟妇毛片视频| 亚洲。日韩。欧美| 成人一道本免费视频| 国产精品无码论坛| 精品人妻久久久久一区二区三区| 国内毛片国产专区二| AV色五月天| 自拍视频一区在线观看| 狠狠操狠狠燥| 色五月婷婷中文字幕| 天天操福利视频综合网站| 欧美少妇性爱网站| 91久久婷婷| 久久极品一区二区| 亚洲视频中文一区| 欧美日韩中国x| 99热只有这里有精品| 久久久久久人| 亚洲欧美爆| 美女尤物人人操| 国产精品久久久久久9999| 精品偷拍13p欧美dodk视频| 久久人人爽av亚洲精品天堂桃色| 午夜男人一级A片7777| 九九久久国产精品怡红院| 国内外毛片在线观看| 久久久久久久久女黄| 99精品久久| 国产辣妈在线视频福利| 精品无码产区一区二| 成人av影院在线观看| 97在线无精品| 久插综合| 99操| 久草网站免费在线观看| 91九九九吃| 亚洲中文字幕av| 五月丁香综合啪啪| 久热9| 日本天天人人狠狠在线日美女 | 极品欧美一区二区三区| 午夜福利免费精品视频| 亚洲色香| 3028国产精品| 91 亚洲情侣偷拍 久久| 自拍大香蕉乱插| 亚洲日韩久久精品一区| 强奸乱伦Av网| 日韩情色一区二区| 熟女欧美日韩综合婷婷| 蜜乳av首页| 少妇高潮九九九九| 天天舔九色婷婷| 国产无码高清操逼视频| 97超碰伊人| 欧美美女自慰一区二区三区| 国产一级舔足在线观看| 欧美色日本| av天堂5| 男同专区一区二区三区在线| 亚洲色图超碰在线| 精品国模无码| 女上位精品在线| 国产高潮AA片免费看| 在线 欧美 亚洲| 91亚·色| 在线看免费无码AV天堂的| 中文字幕av一区二区三区人妻少妇| 免费精品人妻一区二区三| 伊人嫩草| 欧美少妇第一页| 精品国产乱码久久久久久口爆网站| 亚洲精品人伦一区二区| 亚洲 欧美 中文 日韩超碰| 日韩欧美aⅴ综合网站发布| 久久久久久人体| 超碰地址97| 久视频在线观看| 91久久久久久久久18| 日韩一区二区精彩视频| 大香久久| 高清无码91| 性性欧美| 精品人妻一区二区三区夜夜| 超碰激情808| 久久人妻精品| 97久久精品亚洲| 精品人妻一区| 国产精品探花在线| 99色在线视频| 91在线|亚| 搡老女人老妇女老妇老熟女怎么读| 九月丁香婷婷| 乱日视频| 男人的亚洲天堂| 亚洲欲| 色香伊人| 国产农村妇女精品| 精品中文字幕一区二区| 国产亚州高清国产拍精| 色网在线视频观看免费| 青青伊人这里只有精品| 国内自拍 日韩激情 99| 五月激情啪啪| 国产免费大片| 97视频在线视频| 97欧美色综合| 黄色av一区二区在线| 91蜜桃婷婷狠狠久久综合9色| 六月丁香婷| 67194无码不卡| 日韩黄色小说| 白丝被操91| 国产精品视频一区二区三区八戒| 无码日韩网站| 91红杏| 熟妇一区,二区,三区。| 黄视频免费| h在线看免费版在线看| 2017大香蕉国产精品久久| 亚洲欧美洲综合| 人人插人人摸人人| 大屁股国产在线视频| 春色综合网| 亚洲中文字幕三级在线| 欧美日韩美女精品久草一区二区三区| 欧美一二三级精品在线| 久久a久久| 久久久极品| 人干人人人操人人摸| 亚洲强奸乱伦影视网| 综合国产97| 欧美熟女逼久久久久久| 操逼逼一区视频| 久久精品国产精品亚洲艾通辽熟妇| 男人精品天堂一区| 强奸乱伦资源| 色天天野狼综合社区| 亚洲h片在线免费观看| 亚洲情色五月天 | 久久久三区二区一区| 欧美在线播放| 亚洲熟女乱色| 人妻一二三区| 插插综合网天天影视网| 亚洲乱熟女一区二区三区大香蕉| 玖玖草久草99蜜月一区二区三区| 精品视频免费在线一区| 91视频综合在线| 这里只有精品视频在线观看麻豆| 日韩三级性| 女人高潮抽搐喷水视频网站| 国产AV中文| 操九九九九九九| heyZO天然素人无码AⅤ专区| 久久中文字幕女同性恋一区| 亚洲色图大香| 亚洲第一黄色av网站| 91视频女生| 另类图片五月| 福利色色| 欧美另类精品xxxx| 欧美 亚洲| 久久a久久| 国模艳艳啪啪一区| 欧美性第1页| 2024人人操人人摸| 91美女网站| 91影视亚洲| 黄色AV影视| 亚洲 一区二区 自拍| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 神马久久久久眼| 日韩乱伦影音先锋| 天天干干天天干干| 男人的午夜天堂| 91国精产品| 亚洲精品蜜桃久久久久久久| 用力操死我| 亚洲无码色| 国产精品原创巨作?v网站| 精品无码产区一区二| 9/A片| 日韩中文欧美| 天天视频综合在线观看视频| 国产亚洲精品激情| 无码人妻精品一区二区中文| 日本孕妇一区二区视频操逼免费看 | a级理论午夜日本| 久久精品国产99精品亚洲蜜...| 99re免费| 一级一性爱免费视频| 亚州欧美综合| 夜夜国自区| 99re这里| 青草影院内射高潮| 嫩草 我啊~嗯~在线| 爱爱久久| 偷拍亚洲视频一区二区三区四区| 大香蕉92| 亚洲图片第一页| 国产综合色精品在线观看| 久久精品店| 啊啊啊好想要| 欧美另类综合久久| 中文字幕黑人大片| 91 综合 色| 奶水 人妻 哺乳 在线| 成年人网站在线免费观看| 亚洲精品天堂久久A∨51成人漫| 性爱乱伦一区| 久热久一区二区三区| 中文熟女五十乱码在线| 欧美人妖内射| 亚洲男人久久综合天堂| 操逼无码一区| 啊啊啊啊啊啊在线看| 久久久久网站-538在线视频-欧美永久乱码 | 丝袜视频一区二区在线播放国产中文| 日韩中文9| 欧美日韩在线视频网站| 欧美后进式| 日韩 欧美 国产 麻豆| 久久久久久久久久9| av日韩国产一区二区| 婷婷综合五月| 天天躁狠狠躁av| 亚州一区二区| 免费精品福利在线观看| 久久99深爱久久99精品| 久久亚洲欧美中文字幕国语| 国产少妇与亚洲av| 久久精品熟妇丰满人妻99| 欧美激情性爱视频网站| 久久嫩草国产成人一区| 大香蕉综合网| 黄色污污污污污污网站| 人妻色偷色噜| 都市激情人妻一区二区青青操视频 | 中文字幕精品乱码| 日本操逼aaaaa| 8050无码八戒| 亚洲色图 综合| 一本色道久久天天射天天干| 国产精品肉丝自拍| 日日噜噜夜夜狠狠视频无| juliaann精品熟女一区| 中文字幕一区二区日韩网| 久久国产对白激情浪潮| 乱伦av麻豆| 久久人妻少妇| 性爱动态120秒| 男人天堂网站| 97在线青| 99国内精品| 国产精品点击进入在线影院| 久久东京热成人| 夜夜久久久| 亚洲脚交| 久久久久日本视| 综合熟女| 欧美 青青草| 麻豆精品天美| 天天干人人乐| 秋霞一集毛片观看| 国产亚洲女v在线观看| 亚洲欧美中日韩| 久久女同性恋一二区| 嗯啊视频免费在线观看| 超碰在线国产| 中文字幕片| 9.1小视频| 91综合网| 91呆哥人妻| 俺去久久| 蜜臀Av一区二区三区| 国产91福利小视频在线观看| 蜜桃av综合网发布| 97人人爱人人做人人乐| 91性网| 热无码中文亚洲H一道本一区二区| 91操人| 97香蕉人人乳| 国产67194| 999 久久久| 老司机福利青青草| 成人在线视频网| 免费亚洲国产精品久久一区| 久久久久亚洲Av无码专区老牛影视| 黄片com.| 大香蕉之青青草原| 亚洲成aⅴ人片不卡无码| 成人情色一区二区| 亚洲午夜精品久久久中文影院| 国产精品点击进入在线影院| 色哟哟-国产专区| 91黑人无码激情在线| 国产精品久久久久久9999| 国产亚洲精品A在线观看下载| 美女尤物福利视频| 久9re热视频这里只有精品| 亚洲欧美一区二区三区在钱蜜桃| 久操国产在线| 极品白嫩福利在线| 精品久久久久久AV无码| 丝袜视频一区二区在线播放国产中文| 亚洲性爱成人| 欧美999999| 欧美操逼熟女| 人妻精品一区二区三区| 日韩免费人妻色情网站| 日韩簧片免费看| 国产精品久久久久久久免牛肉蒲团| 日本黄色大片一级视频免费麻豆| 国产熟女高潮一区二区三区| 婷婷五月花| 国产欧美日本亚洲精品| 亚洲美腿丝袜香蕉影视欧美成人| 免费精品99| 乱伦一二三区| 自拍啪啪视频| 78久久久| 欧美日韩国产在线| 亚洲一曲日韩精品| 91亚洲高清| 久热久| 亚州少妇| 国产亚洲精品自在线亚洲情侣| 国产馆| 无码人妻精品一区二区三区九九 | 美女黑人91神马| 香蕉综合网| 精品国产人成在线| 天天躁日日躁AAAAXXXX国产 | 色婷婷99| 能直接看AV的网站| 韩日性爱av| 亚洲本色精品一区二区久久| 超碰吊日色| 搡老女人老91妇女熟女| 神马久久久久久久久久| 99re6久热只有精品6在线直播 | 国产精选视频| 一本一道久久综合久久| 美女黄码视频午夜| 91N综合在线| 欧美中文狠| 国产成自自拍在线观看| 亚洲人在线| 91亚洲不卡一区| 手机av天堂久久久久| 五月丁香六月| 日韩免费人妻色情网站| 久久天天摸| 久久综合18p| 国内黄色精品| 77国产精品| 久久久久亚洲精品| 很狠操| 91白虎| 九九综合九九综合| 翔田千里无码中出中文字幕| 人妻 丝袜美腿 中文字幕| 亚洲中文国际强奸字幕| 福利在线黄片| 97干在线看| 亚洲宗合网| 九t超碰| 日本韩国国产精品一区| 成人福利视频网| 亚洲天堂资源| 91亚洲黑人| 宅男91视频在线播放| 神马久久久久久久| 久久久久婷婷| 精品人妻少妇| 婷婷导航| 成人一二| 亚洲欧美国产中文字幕| 中文字幕亚洲永久精品| 国产风韵犹存熟妇三区| 9久久精品| 国产白丝AV| 精品一区二区三区最新| 日韩精品人妻一| 婷婷20月天青娱乐| 91久热这里只有精品| AV天堂国产| 亚洲精品国产精品乱码不卡| 麻豆三极片| 天天射日日干| 91一区二匹| 测评在线观看AV| 无码操逼视频一下| 国产精品极品美女视频| 国产精品呦一区二区三区| 首页中文字幕中文字幕免费| 99热久| 天天色香欲综合网| 偷拍在线观看视频| 亚州精品人妻一二三区| 91天天综合日韩欧美| 国产 日韩,欧美 自拍| 国产传媒午夜理伦精品| 粉嫩在线一区二区懂色| 日本 欧美 国产一区| 激情六月婷婷| 97五月天| 精品欧美А∨无码黑人大荫蒂| 天天天操天天天爱| 丰满人妻一区二区三区四| 夜夜嗨绯色| K8久久久久| 精品视频一区二区| av绯色| 婷婷五月天网| 九九国产| 国产一级内射高清视频| 亚洲精品天堂久久A∨51成人漫| 免費黃色視頻觀看一| 你操综合| 亚洲天堂一区二区| 日韩欧美大力操| 欧州色图区| 欧洲一区二区| 婷婷视频在线免费观看| 思思热一热婷婷热一热| 国产一二三福利视频网| 欧美欲色| 超踫中文字幕| 91人妻尻屄视频| 超碰97人妻免费在线| 人妻少妇无码| 亚洲色入欧美| 激情图片伦理国产一区二区日韩| 久久久久成人亚洲国产| 久久久久久久九九九九九九| 九九九九热| 国产美女高潮视频| 日韩欧美蜜桃精品久久中文字幕久久 | 蜜臀久久久99久久久久 | 2019午夜福利视频| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 亚洲欧洲综合av在线| 精品国产一区二区三区久久久蜜臀| 久久精品熟妇丰满人妻99| 中文字暮97| 韩国免费播放一级毛片| 久九9精品| silk lablo在线观看一区二区| 亚洲少妇色| 人人操av| 精品少妇一区二区三区免费观看| 日本一区二区不卡精品| 免费精品人妻一区二区三| 日韩簧片免费看| 91性高朝久久久久久久久| 亚洲高清自拍| 五月天精品| 天无日色综合| 色婷婷综合久久久久中文一区二区 | 亚洲天堂综合AV| 狼人综合婷婷激情四射 | 综合久久99亚洲人妻中文在线| 91国产大片| 亚洲欧美日韩电影网站一区 | 欧美美女视频| 日本成熟少妇A∨网站| 亚洲熟女乱色一区二区三区| 日本欧美一区二区三区视频麻豆| 91精品国产日韩欧美综合| 无码黑人精品一区二区三区三| 黄色一区二区秘书性感| 伊人久久婷婷| WWW.加勒比人妻一区不卡.com| 999综合色| 女生看匆91网站| 一级毛片电影免费看| 成人麻豆av电影网站| 精品人妻美妇91job| 成人精品电影| 国产精品一二三| 91被操| www.婷婷| 96久久久精品| а√天堂资源官网在线资源| 黄片无码在线制服| 超碰人妻中文在线| 97视频网站| 久99久视频| 日韩美女高潮喷水视频| 少妇被c 黄 免费观看| 精品在线观看视频在线| 中文字幕十五区| 成人国产视频在线观看| 另类在线| 妇女乱色二区| 影音先锋中文字幕日本好一区二区| 精品久久在线区一区| 草B在线| 久久久久久久久成人av解说| 狠狠干精品一二三四五六2022| 麻豆成人影音在线| 2024人人操人人摸| 欧美春色| 超碰79人人乐| 91丨人妻丨国产丨丝袜| 天天干美少妇一区| 日本女人久久久| 天天欧美色| 操逼网站网站| 亚洲色图美腿丝袜| 国产日韩欧美亚洲精品95 | 久久人妻少妇| 九九色逼| 久久精品国产亚洲5555| 2019AV天堂| 做爱A级亚欧| 蜜桃狠狠色伊人亚洲综合| 亚洲码专区| 男人的天堂视频精品乱在线| 日韩精品99999| 岛国A V在线免费看| 蜜臀一二三| 超碰99在线| 被窝影院午夜看片无码| 久久久免费懂色| 亚洲激情网一二三四区| 永久免费av无码网站国产app| 我爱搞逼综合网| 久久伊人大香蕉| 老熟女搡BBBB搡BBBB视频| 欧美手机在线综合| 综合久欧洲| 狠狠爱综合| 国产欧美精选激情视频| 亚洲黄色| 国产精品动态一区二区三区四四| 亚洲色天堂日韩中| 亚洲午夜福利在线影院| 欧美成人免费在线观看| 色悠悠伊人网五月天| 91天天爱| 亚洲综合图色在线| 久久欧美按摩999| av国产无码| 亚洲囯产精品女人久久久| 欧美日韩1234| 日本性爱视频一级| 日日AAvv| 亚洲骚男同com| AV中文字幕剧情1区2区3| 和协无码影院| 色狠人在线99| 青青草色情网站视频| 成人熟女视频一区二区三区| 蜜臀精品1区2区| 一本一道久久综合久久| 伊色综合天堂色97| 99热婷婷| 免费a在线播放v| 国产精品久久久无码AV网站| 三级色综合| 亚洲免费成人在线高清无码视频| 激情综合网激情综合| 亚洲国产日韩精品久久久| 欧美日韩精品久久久久东北老熟妇| silk lablo在线观看一区二区| 91亚州欧美| 中国黑人三级片网站上区| 国产精品欧美激在线| 人人摸人人干| 天天舔天天日天天射| 无码男人天堂| 欧美久久人妻少妇一区二区| 国产第11页| 亚洲97资源| 亚洲欧美在线丝袜| 亚洲欧美首页| se吧提供91精品国产91久久久久久| 黄色片A级一区二区三区| 在线日韩精品一区二区三区| 久久 国产 无码| 国产精品欧美日韩久久| 国产一区二区三区精品观看啪| 五月婷婷爱六月丁香色| 成人五月香网在线| 性色高清在线| 久久精品高清无码一区| 91精品人妻一区二区三区蜜桃| 男人的天堂2019| 国产黄色小视频网站| 九月丁香综合网| 亚洲天堂,男人| 开心六月色| 日韩欧美蜜桃精品久久中文字幕久久| 人妻丝袜二区| 肏逼福利网站| 婷婷丁香五月天亚洲天堂网| 99这里只有精品| 综合网欧| 凌辱美少妇久久aV| 国产一区二区三三视频| 日韩操人| 日韩三级在线观看mp4| 亚洲欧美变态| 一级婬片120分钟试看| 插日本熟女视频| 久久久久久大| 欧美专区17页| 性爱网站一区二区| 操99| 亚洲色资源| 亚洲国产97| 人人操人人操草草| 手机不卡视频不卡在线一二三区| 丰满人妻一区| 天天草夜夜草高潮片| 国产亚洲在线观看| 亚洲成人妻日韩在线| 好爽视频在线观看视频 | 一区二区日韩欧美久久| juliaann丝袜大战黑鬼| 上特色A在线| 国产无码一二三区| 91网站18在线| 人妻少妇久久中文字幕一区二区 麻豆 | 亚洲伊人a线观看视频| 香蕉久久国产AV一区二区| 国产第二页| 69XX一中文字幕人妻91| 五月婷婷色| 国产精品午夜福利| 亚洲砖码砖专无区2023| 日日干男人的天堂| 日韩免费福利在线观看| 超碰日本97美女人妻人人玩人人爱| 曰本道人妻久久久在线不卡色视频| 九九视频黄色片| 啊啊啊好湿国产一二| 天天92av| 深爱五月天| 国产熟女无套内射| 超碰国产在线| 人妻另类| 超碰人人色| 蜜桃传媒视频第一区入口在线看| 欧美不卡二区| 熟女网站最新| 日韩欧美aⅴ综合网站发布| 秋霞男人网| 国产狂喷潮在线精品| 超碰 另类 欧美 | 热久久无毒不卡| 91人妻中文| 91超碰在线播放| 乱伦Av网| 久久宗合97| 五月丁香啪啪网| 亚洲黄色电影| 精品少妇后入一区二区三区四区人妻巨乳 | 天天内射| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 国产精品亚洲天堂网址| 超碰人妻中文在线| 一级aaaaa欧美中文字幕录像片| 亚洲美女30b| 亚洲色系另类精品国产| h色99999| 这里都是精品在线观看| 国产激情在线| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 亚洲图片另类| 精品乱子一区二区三区99| 亚洲av无码成电影在线播放| 色网在线| 曰韩av中文字幕专区| 男人的天堂VA| 色呦呦、国产精品| 激情抓乳插进去啪啪啪日韩| 日本顶级天天操狠狠操夜夜操中文字幕| 99久久久er直播网址| 热热色综合网| 久久日韩毛| 日本熟女免费視颖| 一本色道久久综合亚洲二区三区| 99∨VTV| 欧美日韩午夜精品一区二区三区| 97久久网| 亚洲欧洲久久天堂| 国产无马av| 国产精品人妻无码久久久互動交流 | 男生女生啊啊啊啊| 91free福利| 又大又大又大又粗爽高潮观看| 四虎AV影视国产精品亚洲精品| 中国国国产一级特黄毛片| 97伊人网| 精品中文日韩字幕视频| 99热66| 伊人久久在线视频观看| 亚洲色电影在线| 秋霞午夜视频一区二区| 丁香婷婷久久 | 999岛国大片| 日本αv| 啊啊啊水好多| julia中文字幕在线观看| 亚洲 日本 一 二 三| 久久五月天婷婷丁香中文字幕| 三及片网站| 色偷综合| 99re这里只有精品3| 日本3级一区二区免费| 欧美一级AAAAAAA| 水滴偷拍| 久久精品人妻一区二区三区| 97超碰天天爱天天爱| 精品婷婷| 唐山老熟妇露脸啪啪叫| 91人妻人人澡人人爽人人精品| 久久是精品| 一区二区 电影 亚洲| 加勒比大香蕉视频在线| 新婚人妻扶着粗大强行坐下| 久操91视频| 亚洲熟女av中文字幕| 日本加勒比无码专区一二三| 亚州人妻| 亚洲欧美中日韩| 一区二区激情国产熟女| 国产福利精品最新在线| 亚洲蜜乳av| 99视频这有这里有精品| 中文字幕欧美日韩三级| 欧美se综合| 国产午夜福利合集| 久久久久国产精品人妻aⅴ天堂| 国产专区路线| 日韩97视频!在线| 国产成人亚洲精品自产在线| 五月婷婷爱六月丁香色| 色乱二区| 久久久97| 插穴性爱视频在线观看| 亚洲av乱伦色图网站| 这里只有精品视频在线观看麻豆| 日本视频在线中文字幕| 九九九九九九九九九国产精品| 啊啊啊在线看| 99热大香蕉伊在线| 老女人老91妇女老热女| 亚洲色图国产另类| 日韩精品人妻系列无码天堂| 草b在线| 日韩伦理久 久久 清纯| 99热色这里只有精品| 猛交交| 中文啪啪视频| 日韩99神马视频播放片在线播放| 99re视频在线观看这里只有精品| www.99在线| 成人短视频在线观看| 亚洲欧洲另类| 九九99久久| 中文字幕黑人大片| 亚殴在线| 国产一区麻豆免费观看| 国产美女91视频| 欧美综合在线91| 亚精品无码毛片一区二区三区| 欧美亚洲宗合色性图| 亚洲综合另类色图| 无码粉嫩白虎一线天b区| 性欧美91| 精品无码欧美三级| 国产女同视频在线播放| 激情网色| 99热国产| 天天操女人| 97精品视频免费| 国产女人9999| 91N综合网| 91成人18| 国产成人一级av88| 日韩激情啪啪| 天天综合亚在线| 99www.bibizy香蕉资源国产一区二区三区高清 | 综合色91| 天天激情综合站| 美国一区二区免费视频| 中文字幕在线观看丝袜| 亚洲另类色图片| 性九九九九九九| juliaann欧美丝袜办公室| 日本αv| 性做久久久久久免费观看软件| 蜜桃久久综合视频| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 日本一卡二区在线| 亚洲一区中文精品| 亚洲aV无码成人在线观看| 曰韩欧美国产传媒麻豆第一区| 亚洲国产精品久久久男人的天堂| 208天天久久九九九| 粉嫩av在线| 亚洲欧美日韩精品久| 色性荡荡荡荡视频| 天天干1区2区在线| 黑人免费福利视频| 自慰白浆在线观看| 精品久久久久久久久久久久| 亚洲第一页色网| 涩涩涩综合| 性欧美另类高清| 中文字幕欧美日本乱码一线二线 | 一区二区首页| 日韩天天综合| 色色色色日本| 欧美亚男人的天堂| 新怡红院| 色五天伊人| 亚洲。日韩。欧美| 久久久涩| 国产A v无码专区| 北条麻妃99精品青青久久| 好色美女九七第一页| 亚洲国产91精品一区二区久久| 思思热在线观看| 午夜精品久久久99热蜜桃的功能特点| 中国一级αV| 九九热精品| 欧美综合色综合| 乱伦a片视频| 黄色小说亚洲| 久久久97| 一区二区偷拍拍视频| 97在线亚洲| 欧美另类综合久久| 美欧老女人97| 男人女人18禁片免费看网站| 无码9区| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 久久久久久久九九九九| 伦理片秋霞免费影院| 偷拍色图| 上海一级黄片| 国产免费久久精品99re韩国| 久久亚洲国产成人| 丝袜制服字幕在线| 极品白嫩美少妇在地板上位骑射淫水泛滥| 探花精品视频| 国产suv精品一区| 国产一区二区视频在线播放| 色亚州人久干视频在线观看免费版| 在线观看一级α片刺激高潮视频| 中文一区二区婷婷视频| 国产精品96| 精品大久久| 免费家庭乱伦视频| 六月丁操逼| 久思思热视频在线观看| 久久久网一区| 国产av又色又爽又黄| 九七毛片九九毛片| 91三级理论片播放器| 精品综合久久久久久97| 亚洲Av无码成人精品国产| 91亚.色| www.zbzhongsen.com| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 夜夜嗨一区二区三区三州加勒比| 久久精视频美日韩在线视频| 久久是精品| 久久99视频| 亚洲情色综合| 激情终合网| 亚洲最新a在线观看| 久草电影网| 女优视频第10页| a片自拍直播视频| 美女毛片999| 凸凹视频在线观看| 欧美78P| 国产a级精品| 日韩视频啪啪| 超碰97综合| 丝袜喷水在线| 黄色av片三级三级三级免费看| 天天天干977| 国产久久日韩网站导航| 无码精品蜜桃一区二区三区ww| 久久久一区二区三区麻豆| xxx亚洲午夜天堂| 插日本熟女视频| 超碰97色| 超碰久久网| 97精品国产97久久久久久| 欧美偷拍区| 久久久999国产精品| 日本九九久久99播| 人人干人人操人人..com| 久久午夜色播影院免费高清| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 欧 美 自 拍 偷 拍| 中文字幕青青草| 97看操| 亚州色阁| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 欧美色图亚洲色| 小明看看网址| 日日夜夜天天| 黑丝自慰喷水网站| 免费试看60秒| 亚洲激情深爱文学小说网站| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 97人人模人人爽人人| 免费视频在线一区二区不卡| 中文字幕免费在线观看| 97色视频在线| 欧美乱色| 狠狠操综合| 国产一进一出视频网站| 国产深夜福利| 亚州黄站| 粉嫩av一区二区三区四季| 亚洲少妇诱惑| 日本高清电影欧美色图| 色五月AV| 91Chinese在线| 中文字幕乱在线伦视频中文字幕乱码在线| 97色操| 久草精品一区| 日韩AV一区二区三区三州三州| 日韩中文字幕二区| 亚洲国产尤物yw在线观看| 我要色综合网| www四虎| 99热最新| 人看人人摸人人操| 乱伦av麻豆| 7777奇米影视久久| 神马久久久久久| 密臀在线一区尤物| 色网亚洲人| 爱丝福利| 欧美色图 人妻| 国产精品网站免费| 成人老鸭窝人人在线视频| 伊人综合色网| 成人性爱电影一区二区| 日本高清_区二区三区| 欧美一区二区福利在线| 日韩黄片影院| 黄片免费日韩| 亚洲天堂精品日韩电影| 亚州色综合| 91综合网站| 亚洲AV色图| 好涩综合| 老妇女91| 久久久久久精| 91综合天天看| 色噜噜人妻av中文字幕| 青青草在线视频播放器| 欲综合网| 97精品国产手机| 亚洲成人精品久久久| a人欧美综合天堂麻豆| 四虎国产成人精品免费一女五男| 亚洲情色图片区| 欧色综合| 亚州综合AⅤ| 国产蜜臀在线| 600国产精品视频| 欧美色性情| 亚洲春色一区二区三区|