99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜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
返回資訊列表
色婷婷AV在线| 大香蕉七区| 丁香五月激情婷婷婷婷在线观看| 五月天开心色情网| 丁香五月综合高清在线| 91凹凸在线| 狠狠色综合网| 激情五月天色色| 色婷婷a三区麻| 激情九月婷婷| 色婷婷在线播放| 婷婷五月天丁香综合网| 丰满老熟妇BBBBB搡BBB| 久久激情网| 六月丁丁香| 开心五月婷婷在线视频免费观看| 丁香六月色香蕉视频| 超碰99热在线观看| 中文字幕丰满乱孑伦无码专区| 五月丁香色| 五月天天爽| 思思99精品视频在线观看| 97日在线视频| 91色逼| 丁香五月激情综合久久| 大香蕉五月婷婷丁香| 亚洲色婷婷五月天| 国产精产国品一二三在观看| 久久丁香五月天| 色色丁香婷婷| 九九在线精点品| 色色色在线观看| 噜噜噜精品欧美成人在线观看| 五月在线婷色| 五月丁香综合精品| 色狠狠色狠狠| 99热免费精品| 久碰婷婷视频| 久操人妻| 欧美婷婷| 69凹凸成人综合网| 第四色色六月色综合| 夜夜操加勒比| www网站在线观看| 草榴视频黄色网| 丰满少妇乱A片无码| 色婷婷狠狠18禁| 中文字幕在线播放视频| 人人干av| 色色色网站| 激情婷婷丁香| 99亚洲精品综合在线| 一起草AV入口| 99ri国产精品| 九九九九国产| 2025最新亚洲激情在线| 欧美日本一区二区三区| 97色色色| 婷婷五月天综合网| 9视频在线成人网站| 五月婷A V在线| 九色视频九色九色91jiuseshipin| 无码少妇高潮喷水A片免费| 欧美性生交XXXXX无码小说| 第九色区av天堂| 亚洲亚洲人成综合网络| 丁香五月婷婷香| 五月婷护士| 九月性爱网| 婷婷色色丁香| 国产亚洲99| 青青草a在线| 91dy.av| 日本成人小说婷婷六月| 日韩色久| 亚洲情综合五月天| 婷婷五月色惰| 色婷婷成人丁香| 色五月婷婷丁香国产在线| 五月激情另类| 停婷丁五月在线| 97干综合网| 久久五月天婷婷| 婷婷激情四射| 婷婷五月激情五月丁香五月| 99国产er热视频| 亚洲一色色色色色色色色| 操你av| 亚洲a色| 大香蕉伊人99| WwW色婷婷| www.99久久久久99| 欧美日韩AAAAA| 夜夜夜叫天天天做| 91丨九色丨43老版熟女| 中文字幕高清av| 久久色五月| 丁香六月婷婷缴情欧美| 婷婷综合成人| 成人综合视频网址| 久久这里都是精品免费| 久婷五月| 超碰婷婷色| 久久综合网桃花| 丁香婷婷五月综合色情| 五月丁香六月婷婷激情视频在线观看免费| 亚洲操人| 久久精品视频99| 丁六月激情| 激情婷婷六月天| 婷婷五月婷婷| 97色婷婷五月天| 午夜九九电影| 色色色色五月| 啪啪色区| 色99热| 色婷婷电影| 成人做爰黄A片免费看直播室男男| 青青草99热久久精品国| 岛国av电影网站| 九九这里都是精品| 啪色综合| 婷婷五月色情天| 五月婷婷久久综合| www九九| 激情五月天色婷婷综合| 国产JK精品白丝AV在线观看| 久久婷婷色| 色永久| 九久9精品| 超级碰碰碰碰视频| 熟女激情五月天 | 米奇影视五月天| 玖玖无码中文| 婷婷激情四射网| 狠狠爱婷婷五月天| 日韩激情人伦人| 超碰在线99| 丁香色五月AV在线| 婷婷五月激情天| 欧美顶级少妇做爰HD| 黄色精品五月婷婷| 丁香婷婷91在线观看视频| 超碰日韩人妻在线| 五月天色导航| 五月开心播播网| 色五月婷婷久久| 色五月激情五月| 久久您您综合网| 激情五月丁香婷婷夜夜操| 九九综合| 操逼三区| 激情六月天婷婷| 99情色五月天| 精品人妻伦一二三区久久| 99热草草| 天天舔天天操| 黄网在线观看免费| 久久婷婷成人| 婷婷丁香五月天哟啪| 九九热10| 婷婷亚洲日本| 六月丁香婷| 色情综合网| 色射影院| 五月天亚洲图片婷婷| 色婷网| WWW色色色COm| 五月天快乐开心激情网| 丁香五月激情综合| 一级二级香港秋霞欧美欧美秋霞| 天堂网亚洲色图| 亚洲久久婷婷| 综合久久六月| 91丨九色丨高潮丰满日本| 国产资源在线视频| 丁香五月性| 五月天激情黄色小说在线观看| 成人看片网站| 日在线V视频在线播放| 丁香五月电影| 好激情在线综合网| 超碰99资源站| 色综合色色色| 五月丁香六月情婷婷久久| 深夜婷婷 丁香| 深爱激情网噜噜色| 在线视频99| 中文字幕av在线播放| 成人电影在线免费试看| 婷婷社区五月天| 涩涩五月天综合| 做爰丰满少妇1313| 丁香五月激情五月| 丁香婷婷精品视频| 亚洲成AV人片在线观看| 9久热在线视频精品| 亚洲午夜av| 五月天色五月| 丁香美女主播视频在线观看 | 婷婷六月中文字幕| 美国不卡视频| 久久久久婷婷| 五月丁香六月情| 99久久玖玖| 久碰视频| 色婷婷狠狠18| 热久久思思热思思| 五月婷婷草| 国产成人网| 色必久悠悠影院| 婷久久久| 九九精品热| 激情五月婷婷色播网| 中文字幕欧美精品久久| 五月丁香激情综合| 婷婷久久综合| 五月开心婷婷| 97福利视频| 久草x色在线观看99| 成人网址在线观看| 天天日夜夜操五月| 大香蕉综合网| 久99久视频精选| 日本久久网| 久久这里只有精品无码| 九色视频91| 色五月综合激情网| 五月婷婷综合网| 国产色五月婷婷| 婷婷五月色色| 日韩五月婷婷久久| 超碰碰碰碰| 开心激情网在线| 那里有AV网址| www.ywav| 婷婷伊人五月天| 99色综合网| 99在线免费视频| 99网| 婷婷丁香一月| 青青草伊人婷婷| 狠狠色丁香综合| 97人人超| 国产欧美日韩性爱| 天天综合在线网| 六月婷欧美| 欧美成人色婷婷| 九月婷婷在线观看| 婷婷五月天福利| 天天综合色99| 五月丁香六月天| 99综合99| 激情五月久久| 九热精品| 97色色网| 我要色综合五月婷婷| 丁香五月天堂网| 精品一二三区视频立| 激情综合网五月天| av操一操| 久久婷婷热| AV操逼网| 91啪啪视频| a色色色色色| 99热97| 丁香六月婷月91婷月| 色播五月网| 久久视网36| 日日夜夜狠狠| 激情亚洲婷婷六月| 九九精品少妇| AV在线免费网站| 97在线精品| 婷婷 月 丁香| 99ri视频在线播放| 婷婷五月天激情四射| 日韩成人网址| 日本熟妇乱妇熟色A片蜜桃| 激情五月丁香色婷婷| 性做爰A片免费视频A片直播 | 99热精在线九九久久保| www.lchjjc.com| 久热网站| 九九aV| 五月婷婷六月天| 梁铮版《蜘蛛女侠》在线| 欧洲MV日韩MV国产| 婷婷五月天综合AV| www。狠狠干。com| 99热99日天天干| 五月天播播中文字幕 | 激情九月婷婷| 99热免费精品| 婷婷亚洲综合| 婷婷五月天高清无码| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 欧美va在线| 99色啊| 操碰色一区就去操| 五月天激情网站| 久99| 天天色五月婷婷91久久久久久久| 无码人妻电影| 色五月成人在线| 婷婷爱五月| av九九| 五月噜噜| 超碰在线观看99| 无码日本精品XXXXXXXXX | 久热网在线视频| 97精品自拍| 青草视频在线观看视频| 综合五月丁香六月婷婷| 亚洲激情色色| 亚洲色综合| 日日噜噜夜夜狠狠久久丁香五月| 亚州色婷婷| 婷婷狠狠五月综合| 色狠狠五月天| 99久久五月天| 三级黄色大片视频| 亚洲综合99| 婷婷九月丁香久久| 高清无码.com| 影音先锋91| 日本人妻伦在线中文字幕| 五月丁香亭亭| 五月丁香花激情综合网| 天天插天天插天天日| 九九精品少妇| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 五月丁香婷婷综合视频| 熟女国产在线一区二区三区四区| 丁香五月激情综合| 婷婷丁香宗合888| 久久婷婷五月综合色播| 亚洲人妻av| se婷97| 九九av| 超碰99热精品| 色五月婷婷丁香五月| 这里只有精品日韩| 夜夜资源站| www.第四色99| 香蕉久久国产AV一区二区| 伊人五月综合网| 日本va视频| 99热在线观看免费中文| 激情图片婷婷| 免费成人中文字幕| 欧美久久久中文字幕| 婷婷天堂站| 九月综合| 色综合久久五月天| 丁香五月另类小说| 欧美va亚洲va在线播放| 这里只有视频精品| 久久98| 激情伊人网| 日韩黄在免| 538在线精品| 五月天激情综合10p| 久久中文人妻系列| 色婷婷欧美| 五月丁香婷婷99| 激情九月婷婷九月| 天天日天天色| 开心五月网| 丁香五月欧美午夜视频| 婷婷五月天电影网| 无码 色| 色婷婷五月综合在线| 丁香午月AV中文字幕| www.婷婷,com| 91精产一区三区免费观看| 91干婷婷| 婷婷影院A成人| 色噜噜狠狠色综合日日| 99爱这里只有精品免费视频| 97视频久久| 午夜婷婷久久| 在线中文亚洲| 丁香六月啪啪啪| 日日操日日撸| 色色热| 综合激情站| 性色99| 五月丁香婷婷综合激情基地| 婷婷综合网伊人| 77799热| 丰满少妇猛烈A片免费看观看| 色九月婷婷综合| 日日夜夜久| 久久99美女精彩视频| 日日色五月天| 亚洲婷婷丁香五月视频| 日日婷婷不卡| 国产性色蜜乳| 婷婷六月天亚州| 深爱五月亚洲| 婷婷色色欧美| 色播五月天激情| 六月丁香VA| 婷婷金品综合视频| 来吧亚洲综合网| 五月天亚洲综合网| 97精品欧美91久久久久久久| 久久综合激情| 国产精品色| 久久婷婷五月天| 五月天国产| 国产成人99久久亚洲综合精品| 日韩欧洲亚洲| 欧美激情五月天| 婷婷五月天av| 亚洲婷婷性爱| 亚洲四色五月| 久久久久久久97| 99操视频| site:minyis.com| 俺五月| 婷婷丁香五月,狠狠综合| 色色色色色色97| 这里只有精品视频一区| 欧美成人va| 色婷婷a v| 91精品久久久久久| 九九成人视频| BBWCUCKOLD精品熟妇| 色婷婷呢狠禁久禁| 欧美激情久| 色~性~乱~伦~噜| 色丁香五月天射婷婷爱婷婷| 色青青视频| 激情五月www| 天天弄天天操| 九九久久综合| 综合网啪| 丁香五月欧美| 大香蕉天堂色| 97色干| 中文无码精品一区二区三区| 久热这里| 亚洲激情四射| 丁香五月婷婷激情中文| 99re在线视频精品,这里只有精品18,| 综合在线丁香五月| 丁香五月激情综合| 天天天天干| 丁香六月天婷婷| 日韩成人AV在线播放| 91综合国免费久入| 天天射天天射一道本日本社区| 色婷大香蕉| www色五月天| 欧美A级成人婬片免费看理论| 五月天婷婷视频30| 人人操人人干AV| 中文字幕在线免费观看视频| 996热re视频精品视频这里| 91日综合欧美| 国产做爰视频免费播放| 五月丁香婷婷成人网| 色综合中文色综合网| 婷婷在线精品| 婷婷五月激情视频在线| 色综合久久五月| 婷婷激情五月天桃花网| 五月丁香六月婷婷久久| 亚洲天天| 婷婷五月天色丁香| 超碰爱爱爱| 五月激情天| 亚州色色色| 五月丁香香蕉| 91碰碰碰久久久久| 九九亚洲| 9有码中文| 一二三区视频韩国| 九九精品综合| 久久五月天免费网站| 99精品综合| 丁香五月天的网址。| 五月婷婷综合影院| 天堂在线观看视频| 精品色| 日日操天天| 亚洲色色在线| 婷婷伊人综合中文字幕| 超碰成人影视| 五月天伊人| 中文AV在线播放| 青草激情在线| 五月在线婷色| 天天色天天搡| 久久hd| 成人精品视频99在线观看免费| 另类激情五月| 九九热精品| 婷婷瑟五月天久久综合| 婷婷射图| 99色日本| 噜噜网免费视频| 97碰碰碰免费公开在线视频| 这里只有精品视频视频在线观看| 丁香五月综合激情啪啪| 另类国产区| 天天添天天摸天天天天做| 婷婷五月激情网| 碰超在线九色| 无码人妻一区| 67194线路二在线观看| 日本老女人黄页在线播放| 婷婷五月电影| 热热99爱爱| 狠狠撸激情综合丁香五月天俺来啦| 97啪啪| 嫩草视频观看| 天天摸天天做天天爱天天爽| 婷婷五月激情在线| 五月天精品综合| 亚洲精品V天堂中文字幕| 亚洲va日| 精品夜夜澡人妻无码AV| 天天日夜夜高潮| 超碰人妻在线| 99丁香五月婷| 亚洲性爱区无码区| 国产精品久久久爽爽爽麻豆色哟哟 | 日本本土色网第一区| 91丁香五月| 免费看片操逼| 97热在线精品| 黄色片精品| 婷婷五月天无码| 日韩啪图| 这里只有精彩视频| 五月婷婷六月丁香玖玖玫瑰91| 婷婷五月花西瓜| 刘玥精品一区| 五月天社区狠狠| 五月停性愛| 可以免费看AV网站| 九九99香蕉在线视频播放| 色噜噜狠狠色综合日日免费| 欧美va亚洲va在线播放| 噜噜噜噜噜色| 99A片| 亚洲视频操| 国产精品美女| 婷婷亚洲天堂| 99视频久久| 亚洲激情综合| 99热精品在线在线| 97久久婷婷色| WWW,五月| 激情五月天婷婷直播| 轮奸综合网| 午夜精品777| 丁香五月天啪啪激情综合网| 激情丁香图片| 超碰99热| 五月天电影网| 31色区视频免费看| 网色99| 99爱视频精品| 亚洲婷婷六月天| 天干夜夜操| 无码色| 丁香婷婷久久| 嫩草AV久久伊人妇女超级A| 国产精品18久久久| 丁香六月天婷婷| 九九热内射| 欧美综合五月丁香六月婷| 久久久精品视频79| 思思w99| 色五月偷偷| 色婷婷亚洲精品天天综| 五月婷婷涩涩爱| 婷婷五月色情| 婷婷少妇激情| 婷婷色综合| 婷婷五月丁香婷婷| 99这里只有精品| 丁香五月天电影| 开心色色五月天综合| 久久99三级在线视频| 亚州精品色情无码A片| 另类图片五月天婷婷| 思思热久久久在线| 婷婷99狠狠| 99久久婷婷国产综合精品| 97色女人在线| 婷婷激情五月综合丁| 97色色综合| 精品一二三区久久AAA片| 色欲一区二区三区精品A片| 99热官网精品在线| 久久久久久久综合狠狠综合| 99热这里只有国产精品| 久久亚洲婷婷| 婷婷狠狠狠爱| 天天综合亚洲综合| 伊人久久丁香五月91| 国产婷婷五月色情综合| 婷婷欧美偷拍综合| 99啪99| 少妇AB又爽又紧无码网站| 激情丁香五月婷婷| 五月天色婷婷视频| 日韩一级A片黄色| 秋霞九九无码| 丁香婷婷色五月激情综合| 伊人深爱综合| 五月色丁香综合| 精品九九婷婷| 99国产精品久久久久久久久久久| 色婷婷19| 成 人 色 色| 99欧美| 久cao香蕉影院| 丁香六月婷婷开心| ji'qi'luan'ren'lun| 五月天婷婷黄色视频| 啪啪五月综合| 五月婷婷电影院| 超碰成人免费| 亚洲激情精品| 春色激情第四色| 午夜爱插插| 日韩av高清| 色色色热| 欧美日韩91| 99爱精品| 性生活视频98791| 欧美日本综合网| 九九这里都是精品| 国产婷婷五月色情综合| 色五月婷婷视频| 五月天激情综合在线| 停停综合色色| 婷色综合| 久综合4| 欧美婷婷| 香蕉久久国产AV一区二区| 狠狠操天天干| 综合激情五月天六月婷免费视频| 99噜噜噜在线播放| 色99视频| 狼人婷婷综合| 99人人干人人| 99少妇精品| 五月丁香婷婷伊人| 国产偷人爽久久久久久老妇APP| 伊人久久婷婷| 成人版视频在线观看| 伊人超碰在线| 欧美性丁香色色五月天| 江苏少妇性BBB搡BBB爽爽爽| 男女久久婷婷五月天| 中国女人做爰A片| 在线区区区| 午夜少妇在线观看视频| 五月开心六月婷婷在线播放网站| 婷婷午夜精品久久久| 大香蕉网站,大香蕉综合| 色综合天堂| 久草天堂| 色五月AV| 色丁香综合影院| 婷婷97色| 噜噜久| 丁香六月| 成年人丁香五月| 亚洲精品操一操、噜一噜、摸一摸、爽 | 婷婷久久视频| 天天艹夜夜爽| 丁香六月婷婷综合激情欧美| 六月婷婷综合| 亭亭丁香aV| 婷婷爱在线观看| 99操99| 天天噜天天插| 激情综合网五月天天| Av性爱网站| 亚洲看av的网站| 欧美噜一噜| 亚洲bt丁香五月天婷婷激情小说| 精品无码99| 五月激情久久综合网| 激情五月婷婷丁香| 久草热在线视频| 日本天天色| 色综合丁香婷婷| 丁香五月中文字幕| 久久9视频欧美| 日韩欧美颜射| 天天干,夜夜爽| 婷婷五月丁香激情| 婷婷日韩| 婷婷九月丁香天堂丁香天堂| 五月婷婷六月天| a色色色色色| 男人天堂伊人五月丁香| 五月天久久成人| 欧美成人精品一区二区| 色偷偷色婷婷| 激情综合网五月天| 国产3p露脸普通话对白| 99色在线视频观看| 色5月婷婷色| 五月天开心激情网色欲无码| 人人干AV| 极品人妻VideOssS人妻| 婷婷五月色天| 无码视频国内精品久久久| 婷婷伊人綜合中文| 开心五月激情网| 偷偷与邻居做爰完整视频| 97婷婷五月丁香| 九九99热| 日本的α片xxxwww| 这里只有精品2| 成人婷99最新| 黄色片久久| 激情丁香五月天图片| 色丁香五月天| 91人妻视频| 26uuu成人网| 亚洲精品99| 91女人18毛片水多国产| 亚洲成人AV在线播放| 丁香五月日啪| 玖玖婷婷五月天| 91啪啪| 五月丁香六月综合图| 淫视馆AV在线| 六月婷婷激情小说网| WWW.17C亚洲精品| 狠狠综合网| 婷婷激情四射五月天| 九九热这里只有精品7| 天天色综合网1| 91婷婷丁香| 免费三级黄色| 综合久久婷婷| 九九热精品视频九九| 26uuu欧美日本| 91av视频| 五月五婷婷网| 久久五月天综合| 能看的AV| 色九月婷婷综合| 天天爽综合| 99热网站| 日韩天堂久久| www.伊人天堂偷偷婷婷| 国产67194| 久久国产成人9999久久久久| 色热久资源| 99热这里只有精品9| 99ree6| 色色激情网| 色婷婷狠狠色| 日日夜夜婷婷| 99资源人人| 天天操夜夜夜拍拍拍| 综合激情五月婷婷| 4399在线观看免费高清毛片| 色丁香五月婷婷婷| 五月天久久网站| 大香蕉丁香五月| 中文字幕丰满乱孑伦无码专区| 国产九九一区二区三区| 综合久久五月天| 丁香六月久久| 五月婷婷国产| 五月花亭亭| 五月婷婷深深爱| 日本色图综合| 激情五月婷婷视频一区二区三区| 色婷丁香91| 亚洲激情 久久| 色色五月天网站| 天堂久久大香蕉| 激情黄色小说五月天| 亚洲综合五月天婷婷| 激情五月天综合网| 天天久综合| 亚洲日韩操B| 激情 五月 婷婷 丁香| 黄网免费看| 一区二区三区四区牛| 另类图片 五月激情| 亚洲va综合va国产va中文| 狠狠干综合网| 91热网址| 亚州婷婷五月激情综合| 停停五月天激情网| 538在线精品| 婷婷久久午夜网| 久久久中文| 婷婷99中文字幕| 99这里有精品视频| 99热全是精品| 亚洲综合热| 殴美97色| 桔色成人在线| 欧美日韩精品一区二区三区钱| 97婷婷丁香五月| 婷婷色导航| www.99视频| 超碰免费大香蕉| 亚洲黄色精品| 久久久久久久久99精品| 狠狠爱婷婷| 超碰国产AV| 大香蕉久久伊人网| 久久偷拍综合五月天| 五月婷婷亚洲天堂97色婷婷| 国色天香伊人狠狠色| 九九99九九精品免费| 五月丁香激情综合六月涩涩爱| 欧美性爱五月天| 久久五月六月| 亚洲乱码日产精品BD| 日日干综合| 色色网站毛片| 热久久视频99| 狠狠色婷婷综合开心影视| 99久久精品视频女神1| 风流少妇A片一区二区蜜桃| 婷婷五月天伊人在线| 久久综合五月天| 五月婷婷六月爱| caop视频| 婷婷婷婷色| 欧美色97| 丁香五月天激情视频| 99视频久久免费视频| 丁香月六月| 婷婷中文字暮| 婷婷草| 色五月婷婷一二| 97九色视频| 久久久久er热| 亚洲视频丁香网va| 67194线路二在线观看| 六月婷婷五月天| 婷婷丁香五月基地| 激情综合网五月| 天天爽爽日日做做| 少妇AB又爽又紧无码网站| 79成人网| 99热在线爱| 情色婷婷五月天| 五月天天天综合| 国外亚洲成AV人片在线观看| 五月天影院| 亚洲AV无码一区二| 五月天婷婷小说| 五月五丁香婷婷| 婷婷五月天丁香激情| 日本久热| 亚洲中文无码成人| 黄色aa观看aaguochan| 久99热在线观看| WWW色五月天| 亚洲欧美综合7777色亭亭| 日日夜夜干| 色色日韩| 九月色婷婷综合亚洲| h在线看免费版在线看| 99久久精| 亚洲五月六月婷婷| 91婷婷色 | 综合色播| 国产又色又爽又黄又免费| 久色婷婷200| 九色婷婷| 丁香五月婷婷影视先锋| 日本久久婷婷| 色婷婷六月精品| 伊人玖玖网| 国产亚洲精品AAAAAAA片| 婷婷五月天激情丁香| 91色色色| 九九艹女| 狠狠草在线观看| 26uuu亚洲欧美| 五月丁香综合久久夜夜| 国产欧洲欧洲精品久久| 久8色色| 五月天婷婷久久| A短视频免费在线观看| 99在线资源| 狠狠色婷婷丁香六月| 久久Xx| 狠狠精品干练久久久无码中文字幕| 婷婷刺激综合| 色婷婷国色天香综合| 六月婷婷香蕉| 老师的粉嫩小又紧水又多A片视频| 91成人看片| 欧美毛片www| 97色色色| 九九色插| 国产精品久久欧美久久一区| 色噜噜狠噜噜视频| 91操色| 婷婷五月天网址| 少妇搡BBBB搡BBB搡毛茸茸| 丁香九月激情| 丁香五月 无码| A片试看120分钟做受视频红杏| 婷婷丁香五月网| 久久网思思| 日本三级大片| 亚洲成人网站在线播放| 色网五月婷婷| 色婷婷丁香| 99热免费| 丁香月六月| 欧洲亚洲免费视频区| 色色丁香五月天| 精品操逼一区二区| 爱久久小说下载网| www久久久| 开心五月婷婷| 五月丁香花激情综合网| 五月亚洲激情| 黄色五月婷婷| 91在线日本| 婷婷色在线| 五月婷婷综合精品| 能看的AV网站| 亚洲小视频免费播放| 人人综合91网| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 亚洲视频在线观看| 精品99爱免费视频在线观看| www。五月,com| 五月丁香操亭亭网| 色婷婷综合亚洲| 99日本精品视频热| 热无码A∨| 超碰在线网站9| 色99网| 激情99| 五月天激情小说| 99精品爱| 97欧美在线| 91色久| 伊人狠狠狠综合| 91怕怕网| 99热91| 日日操夜夜爽天天天| 色色97丁香婷婷五月天| 91精品久久久久久久久| 日韩无码一区二区三区四区| 狠狠爱青青草| 91凹凸在线| 婷婷五月香蕉| 五月天大香蕉av| 啪啪 综合网| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 色色亚洲| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 91肏| www.色婷婷。com| 亚洲成人精品三区| 五月丁香六月婷综合成人综合| 99热精品少| 无码动漫AV| 久综合| 丁香六月婷婷色XXXX| 青草视频在线播放| 九热视频在线精品15| 狠狠操天天操| 久久色吧| 精品无码久久久久久久久| 日日日日操| 丁香九月综合| 欧美色偷偷大香| 天天插天天射| 九九99精品视频在线观看| 激情综合网丁香| AV操一操| 怡红院AV亚洲一区二区三区H| 色婷婷五月在线| 激情网五月天| 日本精品人妻无码77777| 大香蕉在九| 99热在线观看成人| 久艹伊| 欧美婷婷九月| 五月丁香久人妻中文| 五月婷婷色色| 亚洲婷婷丁香五月在线| 五月婷婷黄色视频| 99久久免费精品| 色播五月天激情| 9有码中文| 五月婷婷在线免费观看| 大香蕉人妻| 丁香五月天堂婷婷| www狠狠爱com| 热久国产| 午夜色色色极品视频| 婷婷五月天熟妇| 99精品视频网| 亚洲啪啪视频| 丁香五月成人| 97操在线| 亚洲无码11| 天天想夜夜爽天天爽| 丁香激情六月天婷婷| Www.狠狠| 99天堂网| 黄色国久久| 黑人无码一区| 婷婷五月蜜桃成人桃色丁香| 丁香五月天的网址。| 亚洲第一综合| 丁香六月啪| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 婷婷八月丁香激情综合| 久久性爱视频网站| 国产精品久久久久久久久久| 成人网站高清无码| 综合亚洲六月婷婷在线| 丁香五月天av| 一区二区乱码视频| 久久怡红院| 色婷婷五月影视| 婷婷丁香亚洲色综合91| 婷婷色综合| 五月婷婷伊人网| 五月天色丁香| 激情五月天视频| 亚洲综合色成丁香五月色| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 激情五月婷婷色综合| 久久这里有精品| 色五月激情网| 五月婷婷丁香综合,亚洲天堂| 亚洲激情AV| 婷婷五月天第四色| 激情色播| 天天干在线播放| 色婷婷亚洲在线观看| 欧美色色色| 婷婷五月骚厕所| 中文字幕视频在线播放| 91男同视频| 天天操天天曰天天射| 桔色成人官方网站| 爱操人妻| 乱乱av| 色婷婷综合网| txt五月激情四射网综合俺也来了| 99re这里只有精品99| 天天五月情| 99ri视频| 色婷婷777狠狠| 婷婷日日天天| 中文av网站| 99热www| 一本道综合网| 97资源欧美日韩大香蕉超碰一区| 亚洲九九99精品视频在线播放| 色婷婷视频| 五月激情偷拍| 青青久在线视频免费观看| 九九热re99re6在线精品| www.俺去也com| 伊人狠狠丁香婷婷综合尤物| 丁香五月瑟瑟| 思思网站| 激情综合网址| .comwww在线观看免费操| 亚洲精99| 99亚洲天堂| 久草丁香婷婷五月天婷| 五月丁香婷婷激情在线| 亚洲精品大片| 9热在线视频精品| 天天日天天做天天操| 久久婷婷色色| 婷婷综合在线视频| 激情五月天色婷婷综合| 久久婷婷色| 亚洲欧美综合7777色婷婷| 五月天色社区| 99热10在线高清播放| 日韩狠狠色婷婷| caop在线| 色九月婷婷丁香| 丁香五月婷婷色| 影音先锋日本三级资源| 丁香九月激情| 9月色婷婷| 婷婷丁香www视频日本韩国| 激情婷婷五月色| 专区无日本视频高清8| 日本99视频精品免费播放| 另类综合婷婷五月天欧美视频| 草了bav视频在线观看| 久久久婷婷婷| enecarbon-materials.com污K127封锁请涟系@wip1688 | 激情五月天激情网| 激情综合五月丁香| 国产综合视频婷婷| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 丁香色色网| 超级黄色片| 婷婷亚洲五月| 丁香婷婷影院| 国精产品一区二区三区| 日日噜噜夜夜狠狠久久丁香六月| 成人在线精品| 99热老司机| 日韩精品一品二区三区的使用体验 | 天天操B| av一区二区电影免费在线观看| 丁香五月婷婷骚视屏| 久777| 天天成人综合视频| 日本WwW色偷偷丁香花久久久京东热| 欧美搡BBBBB摔BBBBB| 九九热视频精品| 99热人人| www.99热视频| 丁香婷婷九月| 婷香五月| 一区二区成人电影| 综合激情婷婷| 丁香五月电影| 丁香五月婷婷啪啪啪| 超碰人人艹| 日韩成人中文字幕| 99操免费视频| 91欧美日韩综合| 97超碰人人操| 五月天啪啪| 丁香五月综合婷婷| 99热e| 久热99| 久久99久久久久久| 能看的AV| 色五月天天| 日日操夜夜擼| 99成人精品视频| 九九成人电影婷婷| 一本久道综合色婷婷五月| 伊人久久综合| 日韩精品一区二区亚洲AV观看 | 久久9RE热视频精品98| 天天插天天爽| 亚洲AV人人操| 亚洲精品亚洲人成人网| 色播五月婷婷综合| 9精品久久999| 五月天色网站| 丁香香蕉婷婷| 91爱操| 五月天日日操夜夜操| 疯狂做受XXXX高潮A片动画| 色性日本| 久久9热综合| 激情综合在线观看| www.97碰碰com| 五月天综合| 色婷婷五月天堂资源| 日本网站久久| 91婷色| 五月天无码视屏播放| 日本WwW色偷偷丁香花久久久京东热| 天天综合情| 99热亚洲| 久久九九囯产| 六月丁香VA| 人妻第九页| 日韩狠狠色婷婷| AAA久久| 9久热| 天天精品视频免费观看| 九九色图| 黄色五月婷婷| 久操无码| 色优久久| 91精品久久久久久| 激情AV| 怕怕視頻| www.婷婷五月天| 丁香婷婷五月天网站| 欧美色五月| 五月总合激情网| 欧美日比视频| 欧美日本黄色| 久久婷五月天| 精品在线| 婷婷色六月| 色婷婷成人丁香| 日产精品久久久久久久蜜臀| 美女亚洲五月丁香| 高清一区二区三区日本久| 五月青青草综合| 国产AV一区二区三区最新精品| 久久这里只有精品网| 999热视频精品99免费在线| 五月天夜夜爱夜夜操| 丁香五月伊人| 人人操AV| 五月天操逼网| av狠狠操| 五月香蕉婷婷| AV大片在线播放| 伊人啪啪网| 日本色久| 啪啪一区| 婷婷在线操| 婷婷色综合网日韩国产| 精品A√| 91热视频色网站| 色五月丁香婷婷| 99 频99热国里只有精品| 欧美情色电影一区二区| 99热在这里只有精品| 九九综合网色全集 | 九洲一级A片| 九九色色| 99视频一区| 丁香花操逼| 日日干天天爽| 青青福利网| 日韩啪图| 天天干天天干天天干天天干天| 激情综合五月色在线| 五月激情小说| 亚洲六月色| 99在线观看| 亚洲欧美综合7777色亭亭| 俺去也五月| 啪啪综合网| 五月天婷婷偷拍| 五月婷婷五月天| 另类色网| 激情丁香五月| 深夜男女福利刺激影院一区| 色欲日日躁| 91porn一起草| 婷婷五月天视频| 五月婷婷丁香瑟瑟视频| 五月天社区| 国产成人网站在线观看| 亚洲夜夜操| 在线五月婷婷小电影| 草榴成人影片| 9|无码久久久久久| 久久66精品| 久热91| 97操碰98| 亚洲激情综合|