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

ARTICLE DETAIL

資訊詳情

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

eladmin后臺(tái)系統(tǒng)Redis深度實(shí)踐:從緩存配置到分布式鎖與集群部署

eladmin后臺(tái)系統(tǒng)Redis深度實(shí)踐:從緩存配置到分布式鎖與集群部署 如果你問我后臺(tái)管理系統(tǒng)里最容易被低估的中間件是什么我會(huì)說(shuō)Redis。很多團(tuán)隊(duì)把Redis當(dāng)成一個(gè)“放Token的緩存庫(kù)”就完事了但實(shí)際上在eladmin這種基于Spring Boot的后臺(tái)管理系統(tǒng)里Redis能承擔(dān)的角色遠(yuǎn)比你想象得多。從用戶登錄態(tài)、驗(yàn)證碼、在線用戶到字典緩存、分布式鎖、接口限流計(jì)數(shù)器再到集群部署后的Session協(xié)調(diào)它幾乎參與了業(yè)務(wù)鏈路的每一層。我最早接手團(tuán)隊(duì)eladmin項(xiàng)目時(shí)Redis已經(jīng)配好了但一查監(jiān)控全是問題——key亂碼、緩存不生效、分布式鎖偶爾失效、主從切換后計(jì)數(shù)器歸零。這篇文章我把這幾輪踩坑和重構(gòu)的過程完整寫出來(lái)包含配置、序列化、緩存注解、分布式鎖、故障處理和部署升級(jí)路線適合正在用或準(zhǔn)備用eladmin做二次開發(fā)的朋友參考。先說(shuō)個(gè)結(jié)論eladmin本身自帶一套緩存機(jī)制很多基礎(chǔ)代碼里也預(yù)留了Redis的入口但默認(rèn)狀態(tài)下的使用深度遠(yuǎn)遠(yuǎn)不夠。如果你只是把它當(dāng)成“驗(yàn)證碼臨時(shí)存儲(chǔ)”那你既沒發(fā)揮Redis的價(jià)值也遲早會(huì)在高并發(fā)或集群場(chǎng)景下栽跟頭。接下來(lái)我按實(shí)際項(xiàng)目推進(jìn)的順序來(lái)講。1. eladmin為什么需要Redis從登錄態(tài)到緩存的架構(gòu)動(dòng)因1.1 eladmin原生架構(gòu)下的存儲(chǔ)瓶頸eladmin的默認(rèn)設(shè)計(jì)里用戶認(rèn)證走的是JWT也就是服務(wù)端簽發(fā)一個(gè)Token前端每次請(qǐng)求都帶上后端通過攔截器解析鑒權(quán)。好處是服務(wù)端無(wú)狀態(tài)但問題也很明顯Token一旦簽發(fā)服務(wù)端沒法主動(dòng)讓它失效。你改了用戶權(quán)限、禁用了賬號(hào)、踢了下線只要Token沒到期用戶依然能訪問接口。這是我在實(shí)際項(xiàng)目里最痛苦的體驗(yàn)之一。解決思路很簡(jiǎn)單把Token的狀態(tài)存到Redis里。用戶登錄后生成一個(gè)會(huì)話KeyJWT信息、用戶基本信息、權(quán)限快照都放進(jìn)去鑒權(quán)時(shí)先查Redis里的“會(huì)話是否還在”。這樣賬號(hào)禁用、權(quán)限變動(dòng)、強(qiáng)制下線都能實(shí)時(shí)生效。eladmin的登錄邏輯本身是基于在線用戶管理的如果配合Redis做會(huì)話存儲(chǔ)整個(gè)認(rèn)證鏈路的可控性會(huì)提升一個(gè)檔次。1.2 Redis在eladmin里的四種典型角色我把Redis在一個(gè)成熟eladmin項(xiàng)目里承擔(dān)的工作分成四類緩存層字典數(shù)據(jù)、部門樹、角色權(quán)限、菜單、系統(tǒng)配置項(xiàng)這類讀多寫少的數(shù)據(jù)全部放進(jìn)Redis降低數(shù)據(jù)庫(kù)壓力。會(huì)話與臨時(shí)數(shù)據(jù)登錄Token、驗(yàn)證碼、短信驗(yàn)證碼、文件上傳分片信息、導(dǎo)入導(dǎo)出的臨時(shí)文件索引。分布式協(xié)調(diào)定時(shí)任務(wù)防重執(zhí)行、庫(kù)存扣減、操作冪等、分布式鎖。計(jì)數(shù)器與限流登錄失敗次數(shù)統(tǒng)計(jì)、短信發(fā)送頻率控制、接口調(diào)用頻控依賴Redis的原子自增操作。這四類場(chǎng)景在eladmin里幾乎都能找到對(duì)應(yīng)的業(yè)務(wù)入口。你會(huì)發(fā)現(xiàn)Redis在后臺(tái)系統(tǒng)里不是“可選項(xiàng)”而是“基礎(chǔ)設(shè)施”。1.3 引入Redis前后的一次對(duì)比我團(tuán)隊(duì)當(dāng)時(shí)做了一個(gè)很小的壓測(cè)同樣的字典查詢接口數(shù)據(jù)庫(kù)直連查詢平均12ms命中Redis緩存之后平均0.8msQPS從900左右升到接近7000。這個(gè)差距在單機(jī)環(huán)境不明顯但一旦上了集群、數(shù)據(jù)量上來(lái)緩存層的存在就是生死線。而且Redis本身是單線程模型IO多路復(fù)用性能非常穩(wěn)定配合Spring Boot Cache抽象層幾乎不用在業(yè)務(wù)代碼里寫很重的緩存邏輯。提示eladmin的依賴?yán)锲鋵?shí)已經(jīng)引入了spring-boot-starter-data-redis但很多分支版本沒有把序列化器配好。第一步不是寫業(yè)務(wù)而是把RedisTemplate的序列化配置修正否則后面全是亂碼和ClassCastException。2. RedisTemplate序列化配置接入eladmin的第一個(gè)分水嶺2.1 默認(rèn)JDK序列化帶來(lái)的亂碼問題我見過太多eladmin項(xiàng)目Redis里長(zhǎng)這樣一堆以\xAC\xED\x00\x05t...開頭的keyvalue用Redis Desktop Manager打開全是亂碼。這是因?yàn)镾pring Boot默認(rèn)的RedisTemplate用的是JdkSerializationRedisSerializer它會(huì)把對(duì)象序列化成二進(jìn)制字節(jié)不僅肉眼不可讀還會(huì)因?yàn)轭惤Y(jié)構(gòu)變化導(dǎo)致反序列化失敗。另外JDK序列化會(huì)附帶大量類元信息一條簡(jiǎn)單的用戶緩存可能膨脹到幾KB內(nèi)存浪費(fèi)嚴(yán)重。這在開發(fā)階段還能忍上了生產(chǎn)就是事故。比如你發(fā)版時(shí)改了實(shí)體類的字段舊緩存的二進(jìn)制流反序列化直接拋異常緩存層級(jí)崩潰數(shù)據(jù)庫(kù)瞬間被打爆。2.2 用GenericJackson2JsonRedisSerializer做全局序列化eladmin的RedisConfig應(yīng)該重寫兩個(gè)BeanRedisTemplate和StringRedisTemplate。核心思路是key序列化用StringRedisSerializer保證可讀性。value序列化用GenericJackson2JsonRedisSerializer把對(duì)象轉(zhuǎn)成JSON字符串存儲(chǔ)兼容性好且能通過class字段保存類型信息反序列化時(shí)不丟類型。hash的key和value也分別指定序列化器。一個(gè)我實(shí)際在用的配置如下Configuration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(factory); // key 使用 String 序列化 StringRedisSerializer stringSerializer new StringRedisSerializer(); GenericJackson2JsonRedisSerializer jsonSerializer new GenericJackson2JsonRedisSerializer(); template.setKeySerializer(stringSerializer); template.setHashKeySerializer(stringSerializer); template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); template.afterPropertiesSet(); return template; } }這里有個(gè)細(xì)節(jié)GenericJackson2JsonRedisSerializer默認(rèn)會(huì)把類型信息寫在JSON的class字段里。如果你緩存的對(duì)象里有接口類型、父類引用或者泛型反序列化時(shí)這一手非常關(guān)鍵。但它也不是萬(wàn)能的遇到LocalDateTime這類Java 8時(shí)間類型時(shí)容易出問題一個(gè)常見的坑是序列化后變成數(shù)組格式。我在eladmin里處理這種場(chǎng)景時(shí)會(huì)在ObjectMapper里注冊(cè)JavaTimeModule并調(diào)整日期序列化的格式避免前后端解析不一致。2.3 緩存key的設(shè)計(jì)規(guī)范序列化只是第一步key的命名同樣重要。Redis是鍵值存儲(chǔ)沒有表結(jié)構(gòu)約束key設(shè)計(jì)是否規(guī)范直接決定后續(xù)運(yùn)維的體驗(yàn)。我在eladmin里定的規(guī)范是業(yè)務(wù)域:模塊:唯一標(biāo)識(shí)例如auth:token:{userId}用戶會(huì)話sys:dict:{dictName}字典緩存sys:dept:tree部門樹緩存lock:task:{taskName}定時(shí)任務(wù)的分布式鎖這樣用Redis Desktop Manager或者命令行SCAN匹配前綴時(shí)非常清晰也能通過命名空間做批量清理。另外key盡量短一些能用ID就不拼長(zhǎng)字符串節(jié)省內(nèi)存也提高查詢效率。2.4 配置完成后的最小驗(yàn)證配置改完后不要急著寫業(yè)務(wù)先做一個(gè)最小驗(yàn)證SpringBootTest public class RedisTest { Resource private RedisTemplateString, Object redisTemplate; Test public void test() { redisTemplate.opsForValue().set(auth:token:1, hello-redis); Object value redisTemplate.opsForValue().get(auth:token:1); System.out.println(value); } }跑通這一步再去Redis客戶端看key是否可讀、value是不是JSON字符串。如果看到類似hello-redis的文本內(nèi)容就說(shuō)明序列化配置生效了。提示不要用RedisTemplate直接存泛型對(duì)象比如ListUser如果JSON里只存了class到List內(nèi)部元素類型容易丟失。穩(wěn)妥做法是自定義一個(gè)帶類型包裝的DTO或者用redisTemplate.opsForValue().set(key, JSON.toJSONString(list))配合反序列化手動(dòng)指定類型。3. 緩存注解和RedisUtils兩種緩存方式的邊界3.1 Cacheable適合哪些業(yè)務(wù)eladmin里大量使用Spring Cache的注解緩存比如Cacheable、CacheEvict。注解方式的好處是侵入性小業(yè)務(wù)代碼里不用手寫存取邏輯。適合以下幾類字典類型列表按類型名緩存。部門樹、菜單樹按用戶ID緩存。系統(tǒng)配置項(xiàng)按配置鍵緩存。角色權(quán)限集合按角色I(xiàn)D緩存。一個(gè)典型例子Cacheable(value sys:dict, key #type, unless #result null) public ListDictDetail getDictDetails(String type) { // 數(shù)據(jù)庫(kù)查詢 }這樣第一次查詢后結(jié)果進(jìn)入Redis后續(xù)請(qǐng)求直接命中緩存。但注解緩存有幾個(gè)隱藏問題我后面還會(huì)講失效時(shí)間不好精細(xì)控制、緩存擊穿場(chǎng)景下注解幫不上忙、更新時(shí)機(jī)容易亂。3.2 eladmin里的RedisUtils手動(dòng)緩存eladmin原生的RedisUtils工具類是非常實(shí)用的封裝它把常用的set、get、delete、exists、expire都包了一遍并在設(shè)置值時(shí)自動(dòng)指定過期時(shí)間。對(duì)于簡(jiǎn)單的數(shù)據(jù)我建議直接用這個(gè)工具類而不是每個(gè)地方都寫redisTemplate.opsForValue().xxx()。手動(dòng)緩存適合以下場(chǎng)景數(shù)據(jù)短生命周期比如登錄驗(yàn)證碼5分鐘有效。需要精細(xì)控制過期時(shí)間。緩存數(shù)據(jù)需要在業(yè)務(wù)中頻繁更新比如在線用戶狀態(tài)。數(shù)據(jù)緩存與數(shù)據(jù)庫(kù)更新之間需要手動(dòng)維護(hù)一致性注解方式很難表達(dá)“先改庫(kù)再刪緩存”的順序。舉個(gè)eladmin里的實(shí)際例子登錄成功之后把用戶信息塞進(jìn)Redis設(shè)置30分鐘過期每次請(qǐng)求時(shí)刷新過期時(shí)間實(shí)現(xiàn)“滑動(dòng)續(xù)期”。這個(gè)需求用Cacheable做不到因?yàn)樽⒔饩彺娌恢С謩?dòng)態(tài)刷新TTL但RedisUtils可以輕松完成。3.3 緩存更新機(jī)制優(yōu)先刪而不是更新這是我吃了虧才明白的道理。很多人寫完緩存后想當(dāng)然地認(rèn)為數(shù)據(jù)庫(kù)更新后把Redis值也更新就好了。但緩存更新的路數(shù)很多組合方式容易出錯(cuò)。比如先更新數(shù)據(jù)庫(kù)還是先更新緩存、失敗了怎么辦、并發(fā)下會(huì)不會(huì)讀到舊值。eladmin業(yè)務(wù)里我統(tǒng)一采用“先更新數(shù)據(jù)庫(kù)再刪除緩存”的策略。下一請(qǐng)求發(fā)現(xiàn)緩存未命中再回源數(shù)據(jù)庫(kù)重建緩存。這個(gè)策略在大多數(shù)讀多寫少的后臺(tái)系統(tǒng)里足夠用而且天然避免了“寫緩存失敗導(dǎo)致數(shù)據(jù)不一致”的問題。刪除緩存這個(gè)動(dòng)作本身也是冪等的就算刪晚了也只是多一次數(shù)據(jù)庫(kù)查詢。3.4 字典緩存的完整案例以eladmin的字典模塊為例它的查詢頻率很高但字典數(shù)據(jù)基本穩(wěn)定。如果每次查字典都走數(shù)據(jù)庫(kù)查詢接口響應(yīng)會(huì)受DB性能影響。我的處理方式啟動(dòng)時(shí)預(yù)熱項(xiàng)目啟動(dòng)后調(diào)用一次字典查詢接口把常用字典寫進(jìn)Redis。查詢時(shí)先查緩存命中直接返回。后臺(tái)編輯字典后調(diào)用刪除緩存接口保證下次查詢回源。這里有一個(gè)細(xì)節(jié)分頁(yè)查詢的字典列表不適合直接整體緩存因?yàn)榉猪?yè)排序條件太多緩存命中率低還會(huì)造成緩存key爆炸。我只對(duì)“按字典名稱查詢所有明細(xì)”這種固定場(chǎng)景做緩存列表頁(yè)不緩存Excel導(dǎo)出也不緩存。緩存不是越多越好命中率低的緩存不僅浪費(fèi)內(nèi)存還增加了維護(hù)成本。4. 分布式鎖從緩存組件到協(xié)調(diào)組件4.1 為什么單機(jī)鎖不夠eladmin里的定時(shí)任務(wù)、庫(kù)存扣減類操作在單機(jī)部署時(shí)用Synchronized或ReentrantLock沒問題。但項(xiàng)目上了集群同樣的定時(shí)任務(wù)會(huì)在每個(gè)節(jié)點(diǎn)各執(zhí)行一遍造成重復(fù)數(shù)據(jù)。比如定時(shí)同步訂單狀態(tài)如果兩臺(tái)機(jī)器同時(shí)跑數(shù)據(jù)庫(kù)可能被更新兩次產(chǎn)生臟數(shù)據(jù)。單機(jī)鎖只對(duì)本進(jìn)程生效這時(shí)就需要一個(gè)跨進(jìn)程的鎖分布式鎖。Redis實(shí)現(xiàn)分布式鎖是最常見的方案因?yàn)樗旧硎枪蚕泶鎯?chǔ)所有節(jié)點(diǎn)都能訪問且提供了原子操作。4.2 用Redis手寫一個(gè)可用的分布式鎖最簡(jiǎn)單可靠的方案就是基于SET key value NX EX seconds這個(gè)命令能同時(shí)保證“key不存在才設(shè)置”和“過期時(shí)間自動(dòng)設(shè)置”。用RedisTemplate實(shí)現(xiàn)如下public boolean tryLock(String key, String requestId, long expireSeconds) { // NX: 不存在才設(shè)置 EX: 設(shè)置過期時(shí)間 // 注意 SET_IF_ABSENT NX, SET_ABSENT_TIME EX Boolean result redisTemplate.opsForValue() .setIfAbsent(key, requestId, Duration.ofSeconds(expireSeconds)); return Boolean.TRUE.equals(result); } public boolean releaseLock(String key, String requestId) { // 使用Lua腳本保證“校驗(yàn)持有者再刪除”是原子操作 String script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end; DefaultRedisScriptLong redisScript new DefaultRedisScript(script, Long.class); Long result redisTemplate.execute(redisScript, List.of(key), requestId); return Long.valueOf(1).equals(result); }這里有兩個(gè)關(guān)鍵點(diǎn)requestId可以是UUID是鎖持有者的唯一標(biāo)識(shí)。釋放鎖時(shí)必須校驗(yàn)這個(gè)標(biāo)識(shí)防止“自己不持有的鎖被自己刪掉”。用Lua腳本包裹“檢查-刪除”操作保證原子性。如果拆成兩步可能在GET之后、DEL之前鎖到期被另一個(gè)線程搶走然后你把別人的鎖刪了。4.3 鎖的續(xù)期問題和Redisson選擇手寫鎖有個(gè)麻煩業(yè)務(wù)執(zhí)行時(shí)間超過鎖的過期時(shí)間怎么辦比如加鎖時(shí)設(shè)了30秒但業(yè)務(wù)跑了40秒鎖自動(dòng)釋放另一個(gè)線程進(jìn)來(lái)了。解決思路是續(xù)期——在鎖即將到期但業(yè)務(wù)還沒結(jié)束時(shí)自動(dòng)延長(zhǎng)過期時(shí)間。這個(gè)邏輯很煩不建議手寫。我在這塊直接引入了Redisson它內(nèi)置了看門狗機(jī)制默認(rèn)鎖續(xù)期到30秒每10秒檢查一次業(yè)務(wù)沒結(jié)束就自動(dòng)續(xù)期業(yè)務(wù)結(jié)束就釋放鎖。代碼反而簡(jiǎn)單很多RLock lock redissonClient.getLock(lock:task:syncOrder); boolean isLocked lock.tryLock(3, 10, TimeUnit.SECONDS); if (isLocked) { try { // 業(yè)務(wù)邏輯 } finally { lock.unlock(); } }引入Redisson的代價(jià)是加一個(gè)依賴和一點(diǎn)內(nèi)存但省去了自己處理續(xù)期、重入、異常釋放的雜活。eladmin里如果已經(jīng)有Redisson依賴優(yōu)先用它的tryLock如果沒有手寫一個(gè)簡(jiǎn)單的也夠用。提示手寫鎖務(wù)必設(shè)置過期時(shí)間絕不能只用setIfAbsent(key, value)不帶過期時(shí)間。一旦分布式鎖的key沒有過期時(shí)間而持有鎖的服務(wù)宕機(jī)這個(gè)鎖就永遠(yuǎn)解不開了下游業(yè)務(wù)全部卡死。4.4 鎖定在eladmin里的實(shí)際場(chǎng)景我在eladmin里落地分布式鎖最多的場(chǎng)景是定時(shí)任務(wù)。eladmin有定時(shí)任務(wù)管理模塊可以動(dòng)態(tài)啟停任務(wù)但任務(wù)本身可能被多個(gè)節(jié)點(diǎn)同時(shí)觸發(fā)。處理方式任務(wù)執(zhí)行入口先嘗試獲取鎖。搶到鎖的節(jié)點(diǎn)執(zhí)行任務(wù)沒搶到的節(jié)點(diǎn)直接跳過。執(zhí)行完成后主動(dòng)釋放鎖。另外批量導(dǎo)入導(dǎo)出、文件分片合并、訂單狀態(tài)機(jī)轉(zhuǎn)換這類場(chǎng)景也需要鎖。核心思路是凡是“多實(shí)例下同一時(shí)間只允許一個(gè)執(zhí)行”的操作都值得用分布式鎖。5. 緩存三大故障現(xiàn)場(chǎng)穿透、擊穿、雪崩的解決實(shí)錄5.1 緩存穿透不存在的key瘋狂打庫(kù)eladmin里權(quán)限校驗(yàn)接口如果被惡意刷每次都會(huì)攜帶一個(gè)不存在的用戶ID查數(shù)據(jù)庫(kù)Redis里始終沒有緩存數(shù)據(jù)庫(kù)壓力直線上升。這種查詢一個(gè)“必然不存在的數(shù)據(jù)”的現(xiàn)象就是緩存穿透。最常用的兩個(gè)辦法緩存空值查詢結(jié)果為空也寫緩存設(shè)置一個(gè)較短的過期時(shí)間比如60秒這樣后續(xù)相同Key不會(huì)打到DB。但要注意空值過多會(huì)占用內(nèi)存需要設(shè)置過期時(shí)間。布隆過濾器把所有合法的用戶ID加載到布隆過濾器查詢前先判斷ID是否存在不存在直接返回。適用于ID集合較小且相對(duì)固定的場(chǎng)景。我在eladmin里處理驗(yàn)證碼校驗(yàn)接口時(shí)用的就是緩存空值方案驗(yàn)證碼錯(cuò)誤就緩存一個(gè)錯(cuò)誤標(biāo)記過期時(shí)間比驗(yàn)證碼本身還短。這樣既保護(hù)了數(shù)據(jù)庫(kù)又不會(huì)影響正常用戶的重新發(fā)送。5.2 緩存擊穿熱點(diǎn)key瞬間過期打崩DB緩存擊穿和穿透容易混淆擊穿指的是某個(gè)熱點(diǎn)key在過期瞬間大量并發(fā)請(qǐng)求同時(shí)回源數(shù)據(jù)庫(kù)。比如eladmin的系統(tǒng)配置緩存如果剛好在零點(diǎn)過期所有請(qǐng)求都去查數(shù)據(jù)庫(kù)一次就夠數(shù)據(jù)庫(kù)喝一壺。解決手段通常有兩種互斥重建用分布式鎖包住回源邏輯只允許一個(gè)線程回源數(shù)據(jù)庫(kù)寫緩存其他線程等待緩存重建完成。缺點(diǎn)是鎖等待會(huì)增加接口耗時(shí)。邏輯過期緩存中不設(shè)置物理過期時(shí)間而是存一個(gè)邏輯過期戳。查詢時(shí)發(fā)現(xiàn)戳已經(jīng)過期就異步重建。優(yōu)點(diǎn)是接口永遠(yuǎn)有數(shù)據(jù)可返回但實(shí)現(xiàn)稍復(fù)雜。在eladmin的字典緩存里我采用的是折中方案熱點(diǎn)key的物理過期時(shí)間拉長(zhǎng)到小時(shí)級(jí)后端修改字典后通過ActiveMQ或者直接調(diào)用刪除緩存接口來(lái)維護(hù)一致性避免“自然過期”引發(fā)擊穿。這個(gè)方案簡(jiǎn)單但依賴“刪除操作必須可靠”。5.3 緩存雪崩大量key同一時(shí)刻失效雪崩和擊穿的區(qū)別在于影響范圍。雪崩是大批key在同一時(shí)間過期或者Redis服務(wù)整體不可用導(dǎo)致數(shù)據(jù)庫(kù)瞬間被沖垮。解決辦法我總結(jié)三條過期時(shí)間加隨機(jī)抖動(dòng)比如基礎(chǔ)過期時(shí)間300秒實(shí)際設(shè)置時(shí)加一個(gè)0到60秒的隨機(jī)數(shù)避免同一秒集體失效。eladmin里的緩存工具類我已經(jīng)統(tǒng)一封裝了這個(gè)邏輯。多級(jí)緩存配合Redis之上加一層本地緩存Caffeine本地緩存失效再查RedisRedis失效再查DB。這樣即使Redis短時(shí)間不可用本地緩存還能扛一部分。Redis高可用部署主從加哨兵或者Redis Cluster避免單點(diǎn)故障。這個(gè)我放在第6節(jié)詳細(xì)講。5.4 曾經(jīng)踩過的坑INCR在分布式環(huán)境下的“不準(zhǔn)”熱詞里有一條“redis incr不準(zhǔn)”我在eladmin里也遇到過。場(chǎng)景是短信驗(yàn)證碼發(fā)送頻率限制Long count redisTemplate.opsForValue().increment(limit:sms: phone); redisTemplate.expire(limit:sms: phone, 60, TimeUnit.SECONDS);這段代碼在單機(jī)Redis下沒有問題。但在主從架構(gòu)下主機(jī)自增后同步給從機(jī)如果主機(jī)宕機(jī)、從機(jī)頂上自增的值可能丟失或重復(fù)導(dǎo)致計(jì)數(shù)不準(zhǔn)。解決方案有幾個(gè)使用Redis Cluster的單一分片鎖住key的哈希槽保證只有一臺(tái)機(jī)器處理該key。頻率限制場(chǎng)景可以接受誤差時(shí)改成SETNX 過期時(shí)間判斷邏輯。或者在Redis事務(wù)Pipeline中執(zhí)行減少錯(cuò)誤概率。另外INCR和EXPIRE是兩個(gè)獨(dú)立命令如果想讓key自動(dòng)過期最好用Lua腳本把兩個(gè)操作包起來(lái)保證原子性否則極端情況下可能key永不過期計(jì)數(shù)累加超過預(yù)期。提示eladmin的接口限流功能如果用了IP計(jì)數(shù)千萬(wàn)不要用get再set的復(fù)合操作必須用原生INCR。兩步操作在并發(fā)下會(huì)丟失增量計(jì)數(shù)這是非常隱蔽的一類bug。6. 從單機(jī)到集群eladmin上線后的Redis部署升級(jí)路線6.1 單機(jī)版夠用嗎開發(fā)環(huán)境和日活幾千的小項(xiàng)目單機(jī)Redis完全夠用。eladmin這種后臺(tái)系統(tǒng)數(shù)據(jù)庫(kù)字段多、接口讀寫比例高單臺(tái)8G內(nèi)存的Redis實(shí)例支撐幾百個(gè)并發(fā)是沒問題的。但是單機(jī)的問題在于故障域。Redis宕機(jī)所有緩存全部失效數(shù)據(jù)庫(kù)被瞬時(shí)打滿整個(gè)系統(tǒng)雪崩。而且一臺(tái)機(jī)器上Redis進(jìn)程如果OOMRedis會(huì)直接拒絕寫入進(jìn)而影響所有依賴Redis的業(yè)務(wù)。因此正規(guī)一點(diǎn)的項(xiàng)目都會(huì)考慮主從。6.2 主從加哨兵怎么配更穩(wěn)主從模式解決的是“單點(diǎn)故障”哨兵解決的是“自動(dòng)故障轉(zhuǎn)移”。我在eladmin生產(chǎn)環(huán)境用的一主二從加三哨兵架構(gòu)主節(jié)點(diǎn)負(fù)責(zé)讀寫。從節(jié)點(diǎn)負(fù)責(zé)讀擴(kuò)展和備份。哨兵監(jiān)控主從狀態(tài)主節(jié)點(diǎn)宕機(jī)后自動(dòng)從從節(jié)點(diǎn)選舉出一個(gè)新主節(jié)點(diǎn)修改客戶端配置的地址指向新主節(jié)點(diǎn)。Spring Boot里配置Sentinel模式的地址很簡(jiǎn)單spring: data: redis: sentinel: master: mymaster nodes: - 192.168.1.10:26379 - 192.168.1.11:26379 - 192.168.1.12:26379注意哨兵模式下應(yīng)用連接的是哨兵地址而不是Redis節(jié)點(diǎn)地址。哨兵會(huì)告訴你當(dāng)前可寫的主節(jié)點(diǎn)是誰(shuí)。這塊如果配錯(cuò)應(yīng)用會(huì)一直連不上Redis日志里反復(fù)報(bào)Connection refused。主從復(fù)制還有一個(gè)核心點(diǎn)需要注意replica-read-only建議設(shè)置為yes。從節(jié)點(diǎn)只做讀寫操作全部走主節(jié)點(diǎn)否則可能會(huì)發(fā)生數(shù)據(jù)不一致。6.3 什么時(shí)候值得上ClusterRedis Sentinel解決的是“故障轉(zhuǎn)移”但單節(jié)點(diǎn)的內(nèi)存容量上限還在。當(dāng)緩存數(shù)據(jù)量大到單節(jié)點(diǎn)內(nèi)存裝不下或者寫入并發(fā)超過單實(shí)例上限時(shí)就該考慮Redis Cluster。Cluster采用分片存儲(chǔ)每個(gè)key根據(jù)CRC16算法映射到16384個(gè)哈希槽中的某一個(gè)然后哈希槽分配給不同節(jié)點(diǎn)。好處是容量和性能都線性擴(kuò)展壞處是配置復(fù)雜、客戶端要支持Cluster模式且Redis Cluster不支持多key操作除非這些key在同一個(gè)Hash標(biāo)簽下。eladmin項(xiàng)目的緩存體量通常到不了Cluster的規(guī)模但如果未來(lái)做多租戶、數(shù)據(jù)量暴漲可以提前把key的Hash Tag設(shè)計(jì)好比如把所有需要一起操作的key都加上{user:1}這樣的Hash前綴確保它們落在同一個(gè)槽里。這個(gè)設(shè)計(jì)越早做越省事。6.4 Docker部署Redis時(shí)的常見錯(cuò)誤很多團(tuán)隊(duì)用Docker部署Redis熱詞里提到的“docker search redis request returned 500 internal server error”我碰到過多次。這個(gè)報(bào)錯(cuò)通常是Docker Desktop的引擎沒起來(lái)或者API版本不兼容解決辦法是重啟Docker Desktop或者檢查Docker引擎的版本。真正進(jìn)入docker pull redis階段之后還需要注意掛載持久化目錄比如/data防止容器重啟后數(shù)據(jù)丟失。指定Redis密碼和配置文件不要用默認(rèn)無(wú)密碼的配置。如果宿主機(jī)和Redis容器不在同一網(wǎng)絡(luò)需要注意防火墻和端口映射。用Docker Compose部署一主二從加哨兵集群是本地復(fù)現(xiàn)和學(xué)習(xí)的好方式比手動(dòng)敲命令省心很多。但這個(gè)更多是運(yùn)維話題本文就不展開了。7. 體檢清單慢查詢、大key和熱點(diǎn)key的排查手段7.1 Redis慢查詢?nèi)罩驹趺纯碦edis的慢查詢?nèi)罩竞蚆ySQL的slow query log思路類似。配置項(xiàng)slowlog-log-slower-than設(shè)置超時(shí)閾值單位微秒slowlog-max-len設(shè)置日志條數(shù)。執(zhí)行SLOWLOG GET可以查看最近慢查詢命令。eladmin的緩存基本都是小Key很少有長(zhǎng)命令但如果有KEYS *這類命令出現(xiàn)在慢查詢里基本可以斷定代碼有問題。Redis是單線程的一個(gè)耗時(shí)的KEYS命令會(huì)阻塞所有客戶端響應(yīng)線上絕不能執(zhí)行。我見過有人用KEYS auth:token:*來(lái)批量清理用戶會(huì)話導(dǎo)致Redis卡了幾秒所有依賴緩存的接口全部超時(shí)。正確做法是用SCAN游標(biāo)遍歷分批次刪除。7.2 大key是隱藏的內(nèi)存炸彈大key通常指value特別大的key比如一個(gè)Hash里塞了幾十萬(wàn)個(gè)字段或者一個(gè)String存了幾MB的數(shù)據(jù)。大key會(huì)導(dǎo)致Redis內(nèi)存碎片增加、刪除/序列化耗時(shí)變長(zhǎng)還會(huì)在主從復(fù)制時(shí)造成網(wǎng)絡(luò)帶寬壓力。在eladmin里最常見的兩個(gè)大key場(chǎng)景緩存的用戶權(quán)限集合沒有控制大小一個(gè)超管用戶的權(quán)限菜單串成一個(gè)大JSON。字典緩存把所有數(shù)據(jù)一股腦塞進(jìn)一個(gè)key而不是按類型拆分。排查手段用redis-cli --bigkeys它會(huì)掃描找出大key并給出類型和建議。治理方式很直接大key拆小key、續(xù)期策略調(diào)整、數(shù)據(jù)結(jié)構(gòu)優(yōu)化。比如權(quán)限集合按角色拆分字典按類型拆分。7.3 內(nèi)存淘汰策略的選擇Redis內(nèi)存寫滿后怎么辦配置maxmemory-policy決定了淘汰策略。后臺(tái)管理系統(tǒng)里我推薦volatile-lru只在設(shè)置了過期時(shí)間的key里淘汰最近最少使用的數(shù)據(jù)。這樣業(yè)務(wù)緩存是“可淘汰”的但正在使用的會(huì)話數(shù)據(jù)不會(huì)被強(qiáng)制清掉。相比之下allkeys-lru會(huì)對(duì)所有key做淘汰包括你不想丟的業(yè)務(wù)緩存可能導(dǎo)致關(guān)鍵數(shù)據(jù)意外消失。還有一點(diǎn)maxmemory不要設(shè)成Redis所在服務(wù)器的全部?jī)?nèi)存要留出一部分給操作系統(tǒng)、其他進(jìn)程防止Redis OOM把整臺(tái)服務(wù)器壓垮。我一般給Redis分配機(jī)器內(nèi)存的60%-70%左右。7.4 可視化工具和日常巡檢建議命令行工具就是redis-cli圖形化工具我常用Another Redis Desktop Manager和Redis Insight。選工具主要看是否支持連接哨兵、Cluster、SSH隧道。日常巡檢建議做成定時(shí)腳本每天掃一遍INFO memory查看內(nèi)存使用率。INFO replication查看主從復(fù)制狀態(tài)確認(rèn)沒有斷連。INFO stats看連接數(shù)和命中率。SLOWLOG GET 50檢查慢命令。這些指標(biāo)配合Prometheus和Grafana可以做到很完善的監(jiān)控但哪怕沒有專業(yè)監(jiān)控系統(tǒng)定時(shí)敲一下命令也比完全不看強(qiáng)一百倍。Redis掛了不可怕可怕的是你不知道它什么時(shí)候開始變慢、內(nèi)存什么時(shí)候開始飆升。結(jié)尾經(jīng)驗(yàn)這套東西從頭到尾梳理下來(lái)我覺得在eladmin里用好Redis的關(guān)鍵只有兩點(diǎn)一是序列化和key設(shè)計(jì)必須在一開始就定好規(guī)范這個(gè)決定后續(xù)所有緩存代碼的體驗(yàn)二是把分布式鎖、緩存擊穿、集群部署這些“進(jìn)階能力”當(dāng)作標(biāo)配去考慮而不是等出了事故再補(bǔ)。我經(jīng)歷過Redis配置亂碼導(dǎo)致生產(chǎn)環(huán)境接口直接500的夜晚也經(jīng)歷過分布式鎖誤刪把定時(shí)任務(wù)數(shù)據(jù)弄亂的尷尬。現(xiàn)在已經(jīng)養(yǎng)成的習(xí)慣是任何redisTemplate的讀寫都先問自己“key規(guī)范嗎序列化對(duì)嗎過期時(shí)間設(shè)了嗎這行代碼在集群下還成立嗎”這四個(gè)問題能擋住絕大部分線上事故。希望這篇實(shí)踐對(duì)正在折騰eladmin的朋友有幫助。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩97P| 激情啪啪拍91| 天天情欲宗合网| 五月天色色色| 无码 有码 国产18p| 国产精品视频在线观看| 天天影视网色欲色香| 99久久婷婷国产综合精品草原| 精品一级毛片在线观看| 极品出轨视频网站| 天堂综合| 操死我了嗯嗯嗯| 18精品一区| 亚洲熟女av日韩熟女| 精品日韩人妻视频| 中文字幕丰满人妻日本| 999精品乱码| 熟女久久久| 青青草视频在线观看一区二区| 五月色网| 丁香五月色| 亚洲国产成人高清在线| 96久久精品一二三区色欲| 精品日韩人妻精品一二三区| 日韩一级欧美一级国产一级台湾| 中文字幕人妻资源在线| 极品销魂美女一区二区| 青草成人免费视频一com| 亚洲熟妇A V黑人| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚州熟妇精品| 亚洲黄日韩无码专区| 蜜臀国产AV中文字幕| WWW黄片COM| 日韩av在线免费网站| 无码人妻精品一区二区中文| 无码 黑人一区二区三区| av黄图片在线观看| 综合另类| 亚洲无码成人精品| A级毛片在线看免费| 丰满人妻区一区二区三| 国产精品白领在线观看| www.yeyecao| 十八禁的黄污污免费网站| 又大又长又粗又爽又黄| 国产精品自拍欧美在线| 青青草丝袜在线视频| 竹菊影视国产一区二区| 天天做天天爱| 久操99| 欧美熟妇乱码在线一区| 激情欧美日韩女同久久| 97久久网| 2018天天干在线视频| 中文字幕精品日韩中文字幕| 丁香六月婷婷| 久久6热精品99视频| 中文久久96| 9997se| 国产熟女无套内射| 一级性爱视频免费在线| 美国aaaaa一级黄片| 欧美专区日本专区| 日日干夜夜干| 91成人在线| 亚洲情色一区二区三区| 日韩综合97p| 色欧美综合| 伊人黄色片| 久久‘黄片视频| 天天日天天爽| 美女网站黄页| 日韩国产在线观看av| 亚洲经典啪啪| 色情婷婷久久五月天| 中日韩久久久免费看| 四虎精品一区二区| 操逼www.| 中文字幕在线观看网页| 欧美激情精品久久久| 中文乱码字字幕在线第5页| 日韩熟女乱伦中出| 婷婷香蕉欧美在线一区二区三区| 青青草色插素人| 91九色丨风韵犹存| 97 色综合| 东京热一区二区三区四区五区六区| 久久久一区二区三区三州| 国产精品宅男免费| 国产精品网站www| www.acm成人黄色毛片| 少妇精品久久| 日韩婷婷| 99re视频在线播放青草| 国产欧美日韩一区二区三区| 天天干一区二区| 欧美三级偷拍| 91人妻素女| 久久久99久9| 国产一区二区在线看| 久久免费99精品久久久久久| 久久爽爽精品| 嫖老熟女A片一二三区| 午夜福利在线视频1000| 家庭乱伦国产精品| 1024久久高清视频| 高清无码人妻久久久一区二区三区aⅴ| 无码国产Av| 亚洲情色一区三区| 妇女性内射冈站HDWWWCOM| 97综合在线| 亚州欧美综合| 5月婷婷6月六月丁香| 一二三四视频在线社区中文字幕| 日韩激情无码影院| 超碰天天操| 9国产超碰| 求求你操操我| 国产操操日韩三级黄| 精品十三区| 日韩免费在线观看不卡| 男女激情中文字幕| 国产女人高潮嗷嗷嗷叫小说| 欧美 亚洲 另类 综合| 日本人妻伦在线中文字幕| 怡红院怡春院| 国产精品婬乱一级毛片彝族| 久草电影网| 精品一区二区人妖| 黄页网站成人免费| 激情一区二区三区在线观看| 香蕉视频欧美一卡二卡| 欧美熟女妇同| 开心五月深爱五月| 国产内射爽爽大片| 欧美少妇高潮久久91| 黑人无码一区二区| 欧美日韩资源| 大香蕉国产中文自拍| 国产精品原创巨作?v网站| 久日91在线| 99热99在线播放激情| 青青草原伊人网| 长长久久曰曰夜夜成人网| 97超碰超| 一区中文字幕二区日韩| 久久社区一区二区三区| 黄色工厂这里只有精品| 久久啊啊啊| 久久欧美按摩999| 亚洲国产精品无码AV久久久| 欧美在线亚洲| 一区中文字幕二区日韩| 国产精品久久久久久久黄无码| 无码九九| 熟妇最新先锋一二三区| 美女午夜福利免费视频| 视频不卡中文字幕| 九一国产精品| 日本不卡高清免v欧美日韩在线观看| 中文字幕精品一区欧美| 精精品人妻一区二区三区| 日日干夜夜操视频h| 欧美黑人精品一区二区| 亚洲欧洲日本精品中文a∨| 99热99re6国产在线播放| 偷拍欧美综合| 国产丝袜视频| 日韩国产乱子伦App| 亚洲色图 91| 久久中日麻豆| 久久婷婷一区二| 日韩中文字幕人妻视频| 亚洲另类春色| 欧美性高潮在线| 色噜噜人妻丝袜AV资源| 丁香六月综合激情| 爱射综合| 大色综合网| 日本孕妇一区二区视频操逼免费看 | 亚洲无码超碰免费| 91精品人| 国产成人五月天丁香花| 亚洲第二页| 婷婷另类小说| 91欧美丨精品丨入口| 久99热| 淫荡少妇免费| 国产精品午夜福利亚洲综合网| 色哟哟AV| 激情啪啪视频| 欧美高清在线| 国产白丝网站| 91亚洲图片| 死我十八禁| 亚洲熟久久| xxx亚洲午夜天堂| 天天综合网~69| 欧美日韩岛国大片在线观看| 国产www色在线观看| 丰满人妻被猛烈进入中| 欧美亚洲国产91在线| 碰碰97| 97超碰中文在线| 久夜操| 老熟女天天操| 91欧美亚洲| 东京太热男人的天堂久久久| 亚洲天堂欧美| 干少妇视频| 日韩人妻丝袜中文字幕| 99国产精品| 婷婷五月天影院| wwwcaobibi| 国产男女无套视频免费观看| 久久97| 亚州精人品大香蕉| 操我啊啊啊啊啊| 亚洲人成色9999精品久久| 天天操女人| 成人久久精品| 伊人欧美大香蕉视频| 亚洲交换| 一起草三级AV电影在线观看| 被窝影院午夜看片无码| 天天摸夜夜添无码小视频| 黄色电影观看久久9| 欧美精品99久久久**| 爆操无码| 啊啊啊啊啊啊啊国| 欲香欲色天天天综合和网| 亚洲麻豆18发?| 一本一道久久综合久久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 大香交伊人网| 久久大线蕉一区| 97爱碰| 天天干人妻视频| 久久午夜色播影院免费高清| 中文字幕一二区二三区人妻专区| 五月天大香蕉| 97公开久久| 精品国产乱码久久久久久日本公司| 91天天综合在线观看| 久久香蕉国产线看观看亚洲女人| 高清不卡一二三区视频......| 大香蕉男人的天堂| 4虎在线观看| 强奸乱伦大香蕉| 婷婷激情综合网| 欧亚乱色熟一区二区三四区| 道久久五香丁月婷婷激情综合| 久久啊啊| 无码免费精品高清| 91色图片| 日日摸日日碰夜夜爽视频| 秋霞操逼片| 亚洲国产日韩欧美熟妇在线| 国产乱弄免费在线视频。| 少妇精品久久久八区九区| 极品色| 中文自拍欧美影视| 久偷拍欧美日韩三区| 婷婷8月天青娱乐| 国产超碰AV在线精品| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 四季AV一区二区凹凸精品小说| 怡红院成人视频| 亚洲小电影免费涩涩成人在线高清| 天天干一干| 欧美一级专区免费大片 | 这里有精品| 亚洲色图第四色| 玖玖爱在线视频免费观看| 天天操天天舔| 亚洲污污网站| 久干9操| 五月天伊人| 91夜色| 亚洲中文字幕网| 国产妇女精品视频青青草| 亚洲中字幕日本一区二区三区| 强奸a片网| 密臀AV在线| 亚洲不卡三级手机播放| 黑操B| 国产suv一区二区三区6| 激情综合婷婷| 我想要 啊 啊 啊| 国产小u女在线观看| 麻豆天美在线喷水AV| 国产精品麻豆视频网站| 超碰97极品9| 无码在线亚洲| 欧美色九九| 90后性网国产欧美| 天天操天天舔| 玖玖综合.com| 成·人免费午夜在线观看| 99成人| 天天综合网~91| 综合熟女| 久久久久国产精品久久久| 另类综合另类| 亚洲欧美日韩二区视频| 四虎在线观看网站| 91精品伊人久久久大香线蕉91| 欧美青青草视频| 九九性爱网| 日韩无码第3页| 嗯嗯啊啊视频在线看| 99国产精品| 9热9热综合网| 久久久麻豆精品| 精品一区二区三区蜜桃| 嗯嗯嗯好爽| 国产精品午夜福利亚洲综合网| 超碰1024久久| 激情看片网站| 国产不良强奸视频免费看| 青青青艹在线视频| 91黑丝露脚| 欧美国产精品久久九九| 亚洲九九爱| 狠狠操狠狠插| 日本欧美一区二区三区免费| 丝袜 中出 制服 人妻 美腿 中文字幕| 极品尤物在线观看| 成人乱人伦一区二区| 国产精品69久久久久孕妇欧美| 婷婷午夜| 国产野战露脸在线播放| 97免费在线观看| 成人熟女区| www色色色com| 天天操夜夜操狠很操| 蜜桃久久一区| 欧美韩日精品资源| 国产视频三区四区| 操逼网站视频漫画国产| 波多野结衣AV无码一区| 欧美在线啊啊| 大逼色网站| 99热在线不卡| 国产丝袜美女诱惑| 大香蕉操久久| www.夜夜操| 久久成人国产| 国产极品粉嫩馒头一线天av| 啪啪啪男女亚洲中文字幕99| 97热视频在线观看| 亚洲第91页 | 天天综合欧美| 综合久久2017| 老熟女91视频| 欧美丝袜中文字幕07在线| 校园春色宗合网| 宅男午夜在线视频| 欧美久久婷| 性色一线| 天天综合91在线| 在线观看黄色电话| 思思热免费视频观看| 五月丁香六月综合缴清无码| 中日韩免费看男女操逼大全| 青青草好吊色| 亚洲资源站| 美女91网| 97香蕉网| 久久精品国产亚洲AV先锋| 精品美女少妇一区二区| 日韩青久久| 啊啊啊啊啊好舒服视频| 劲爆欧美人妖三区91| 97内射偷拍| 用力操死我| 69人妻人人揉人人躁人人精品| 九九久久精品| 天天综合网国产| 午夜人妻精品综合在线| 每日更新AV| 看日韩操逼| 国产黄色在线播放观看| 亚洲熟伦熟妇AV无码春色| av亚洲天堂资源网站| 青青青国产| 精品久久一区二区三区四区五区| 国产精选三级在线观看| 熟女人妻av在线资源,黄色的资源| www.av在线观看| 777AV电影| 尤物黄色在线观看网站| 日本色色色色色视频| wwwxxx日本爽| 国产性爱乱伦AV| 天天操夜夜嗨| 激情久久久| www.色婷婷色综合| www.色操逼| 日韩另类色图| 男人的天堂激情| 日本一二区免费| 91在线免费观看处女| 亚洲综合影片| 色综合20p| 一区二区亚州激情久婷婷欧美| 欧美啪啪天堂| 91精品老女人| 亚洲成人性爱网站在线播放| 无套内射人妻在线播放| 超碰在线91| 精品久久久av| 亚洲色图国产另类| 97超碰免费人人性爱| 嫩草 我啊~嗯~在线| 久草电影网| 综合第一页| 午夜福利激情在线视频| 欧美一级黄片免费播放| 色性综合| 嗯嗯啊好大| 国产一线二线三线av| 91人妻在线视频| 国内精品嫩模A∨私拍小视频| 国内亚洲精彩视频在线| 久久婷婷五月综合| 91av天美性媒精品视频| 欧美性暴力猛交XXXX| 女人天堂网| 少妇久久久久久久| 夜嗨影院| 亚洲五区熟女| 黑人在线91| 久久欲| www亚洲免费| 91无码中出人妻视频| 99热在线不卡| 久久香蕉国产线看观看亚洲女人 | 91肏屄网| 啊啊啊好大好深| 91久久免费视频互動交流| 免费看久久久性性| av亚洲天堂资源网站| 丰满人妻-区二区三区免费看| 另类小说综合网| 婷婷五月成人| 少妇色欲综合网2| 日韩一区二区精彩视频| 强奸xx国产| 国产视频一区二区在线| 婷婷色香伊人| 国内自拍 日韩激情 99| 精品一区二区麻豆| 欧美激情性爱视频网站| 久久欧美按摩999| 欧美91色| 国产一区二区在线电影| 嗯嗯啊啊视频一区二区三区| 热思思免费视频| 亚洲囯产精品女人久久久| 艹我哪美一区无码| 综合欧美色图| 亚洲综合精品国产一区| 欧美爱国产综合、| 大香蕉久| 久久大陆| 国产AV精久久| 欧美第二页午夜| 操操逼视频| 日逼五月天| 超碰97中文| 激情五月婷| 亚洲精品黑丝| 亚洲激情av| 久久禁| 人人透人人操| 九九热re99re6在线精品| 亚洲AV无码国产精品久久久久 | 97超碰人人模人人拍人人| 久久伊人五月天| 久久国产精品m码| 天天操夜夜嗨| 东北操逼| 99无码| 中文字幕乱妇免费视频| 久热9| 超碰美女97| 蜜臀久久99精品久久综合| 久久久无码精品人妻二区 | 久久久亚洲精品电影免费看| 好色综合| 欧美亚州色的图| 日韩亚洲精品一区二区| 欧美色吧综合| 日韩在线人妻网站| 91人妻中文| 无码九九| 色性荡荡荡荡视频| 日韩色欲久久一二三四区| 日韩 欧美 国产 麻豆| 99人人干| 免费操逼91| 天天日天天射天天干| 国产麻豆福利av在线播放| 激情婷婷丁香| 五月久久HDAV| 97久久久| 国产91专区| 五月婷婷影院| 欧美不卡二区| 欧洲精品二区| 大香蕉十区| 亚州色图片在线色| 日本肉体xxxx裸交| 日本欧美中文字幕| 超碰国产情侣自拍网| 国产男人又猛又粗又爽| 久久人妻熟女一区二区| 成人热久久精品| 激情小说五月天| 久久免费99精品久久久久久| 一二三四区电影| 色老汉色| 四虎影院成年人片| 天天懆天天日| 超碰色综合| 综合av影片| 中文字幕一区 二区三四五 区日 日骚 | 色综合潮| 久操网视频| 男女啪啪啪18禁网站| 亚洲伊人久久精品影院| 日韩内射视频| 一块操欧美| 国产av又色又爽又黄| 探花视频免费观看国产专区| 国产中文字幕在线观看| 免费看污网址| 天天摸天天碰天天添青青| 日本午夜精品理论片A级APP发布| 天天射天天操天天干天天吃2018| 91老熟女91老女人| 久久久久ab| 日韩三级久久久| 成人欧美一区二区三区黑人一| 日韩亚洲精品一区二区| 精品人妻一二三| 精品久久久一本一道| 夜夜国产一区| 在线人妻熟女一区二区三区四区五区| 久久久久婷婷| 亚洲码专区| 十八禁av无码免费网站APP| www.91视频网| 91精品老女人| 国产路线专区| 91无码人妻精品一区二区三区蜜桃 | 大香蕉乱级| 色九久| 97干在线视频| 啊啊啊好大好深| 欧美精品,四区。五区| 欧美在线中M| 亚洲天堂五月天国产| 亚洲天天操| 国产内射爽爽大片| 岛国黄片网站| 超碰精品日韩欧美国产| 少妇无码av专区线| 岛国毛片手机在线观看| 欧美一级久久久丰满| 久久久久亚洲AV无码专区少妇| 日婷婷| 秋霞免费无码视频日韩A片| 蜜乳AV免费观看| 澳门黄片一香蕉视频| 欧美精品久久久久久久丰满| 免费观看的黄色的网站| 强奸乱伦av电影| 国产懂色精品国产av| 亚洲男人的天堂亚洲| 99热网站| 天天综合在线4| 天天夜夜久久| 超碰欧美在线欧美| 噜噜瑟| 亚洲国产丝袜熟女av| 亚洲影院无码在线| 亚洲囯产精品女人久久久| 欧美v亚洲v日韩v最新在线二区| www.国产高潮精品| 三级三级三级日本99| AV丝袜少妇| 欧美与日韩97| 78久久| 欧美成熟性爱精品| 黄色AAAAA欧美| 国产CHASE男男GAYGA 毛多色婷婷| 蜜臀久久99精品久久综合| 美女啊啊啊啊pc| 超碰欧美在线欧美| 美女黄网| 国产亚洲美日韩Aⅴ中文字幕无码成人| 99久久精品无码一区二区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 婷婷成人久久久精品| 亚洲激情色片| 亚洲操人| 欧美中文字幕男人天堂久久精品| 黄色一区三区| 天美传媒精品一区二区| 成人aⅴ一区二区三区| 婷婷久草一区二区三区| 99热8| 少妇综合| 婷婷亚洲综合| 久污| 亚洲囯产精品女人久久久| 五月婷婷综合激情| 天天综合网~91入口| 电家庭影院午夜69久久夜色精品国产69乱| 91精品久久久久五月天精品| 9久热| 熟女熟妇伦久久影院毛片一区二区 | 蜜乳AV网址| 夜夜夜久久| 欧美色图自拍| 1禁看欧美黄片免费看| 清清一区二区三区四区不卡视频| 久久影视二区三区行押| 视频黄色国产一级| 视频在线观看一二三区| 欧美啪啪啪91| 丁香五月性| AV丝袜东京热| 人人看人人爰人人操| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 天天日天天射天天干| 精品国产乱码久久久| 簧片免费看视频| 校园春色综合香蕉| A一区片| 日韩欧美亚洲国产日韩| 春色91| 久久国产视频性吧 | 丁香九月婷婷| 99精品久久| 唯美清纯 妖精视频| 国产精品一区二区黄片| 99热在线只有精品| 一级性爱aaaa| 熟女91网| 五月天婷婷久久| 久九九九九九九九热| 精品伊人久久久大香线蕉小说| 国产日韩无码一区二区三区久久区| 91久久久久久| 色偷综合| 精品人人插人人操| 四虎免费在线播放| 婷婷五月天基地| 97在线观| 久久久久密| 2019精品国产无码成人| 99热导航| 亚洲精品一区二区三区在线播放| 97久久天天综合色天天综合色电影| 可以在线观看的黄色网址| 香蕉色网| 超碰91在线| 男人的午夜天堂| 久久偷拍人| 国产欧美岛国精品一区| 亚洲欧美碰碰| 欧美大香蕉在线观看| 亚洲āv网址在线观看| 超碰天天操| 中文字幕亚洲在线一区| 九七超碰人人乐| 精品 码产区一区二-1080P高清在线www-B029AV| 中国熟妇| 欧美日动态视频| 欧美日韩国产高清在线一二三区 | 亚洲综合在线91| 黄色大片一区二区密桃丝袜| 天堂v无码免费视频| 中文字幕av丝袜| 人成午夜免费大片| 97超碰中文在线| 69久久久久久久久久久久久| 99久久综合网| 国产精品毛片?v一区二区三区| 五十路人妻在线| 丁香六月啪啪| 综合欧美激情网| 欧美 色 亚洲| 97大色网| 亚洲精品三| 亚洲网站一区二区在线| 超碰97.com| 亚洲棕合电彰| 91碰碰碰| 国产高清精品一区二区三区毛片| 丝袜加勒比| 岛国人妻少妇av在线观看| 日日碰狠狠添天天爽超| 天天性射网| 天天插夜夜爽| 欧美后进式| 亚洲第一在线视频| 国产精品久久久无码aV去| 日日黄色三级网站| 禁片 高清 在线观看视频网站| 小日子操bb在线看| 视频国产欧美在线播放| 久久精品男人的天堂| 国产精品白虎| 五月激情综合网| www..com操老师| 无码免费在线观看黄色片| 久久九九97| 天天射夜夜| 60秒免费小视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 亚洲性刺激| yy少妇精品久久| 97色色国产视频| 欧美在线官网| 特级毛片特黄久久免费看 | 蜜桃精品一区二区三区ww| 九九色图| 很很热性爱视频| 强奸乱伦AV网站| 日本色色视频网站| 亚洲中文字幕在线视频一区二区| 九九亚洲| 国产区在线| 综合天天网| 骚逼一区二区| 美腿丝袜偷拍亚洲欧美| 91色黑人少妇| 男人的天堂成人的社区| 任我爽视频在线观看| 亚洲欧美精品91| 丁香五月天激情| 污啪啪啪视频| 日本天天操| 日韩草久视频| 欧美后进式| 天天日少妇逼AV| 久久黄黄| 精品99999久久久久久| 爱欲AV| 黑人中出21连凳花野真衣| 亚洲成人精品久久久| 刺激性视频黄页| 久久久久久91香蕉国产| 国产乱人妻精品入口| 天天综合网入口~91| 久久夜精品一区二区三区| 亚洲国产青青| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 青青欧美| 亚州五月| 91观看 国产白丝| 欧美人黑A片无码免视费| 天天流夜夜操| 青青操97| 1204金沙人妻懂旧版免费| 婷婷激情五月综合| 熟妇色99| 亚洲男人综合| 欧美日韩操逼嗦吊| 99亚洲精品| 神马午夜久久久| 死我十八禁| 人人搞人人插人人操| 中文字幕,人妻,日韩| 欧美一级特黄淫片在线观看| 性爱1区| 婷婷色五月激情| 精品91摸| AV高清一区| wuyechaopeng| 无码人妻一区二区三区免费九色| 中文字幕日韩专区精品系列| 97超碰磁| 国产免费一区二区在线A片视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 国产欧美日韩在线观看麻豆传媒公司| 日本天堂网| 97青娱乐超碰久久| 色图四区| 中国zzijzzijzzwww精品| 狠狠操狠狠| 97色视频在线| 亚洲天堂男人天堂网| 黄色av网站在线播放| 美女刺激久久国产欧美| 欧亚日韩三区| 人人妻人人爽| 多乙久久久久久| 97色冈| 国产嫩草精品A88AV| 亚洲精品一二牛牛| 夂久色| 免费亚洲国产精品久久一区| 成人免费性爱视视| 91日本在线观看| 欧美精品成人亚洲| 成人精品久久| 最新国内自拍av免费| 亚洲一区深夜| 97操碰| 黄片免费看黄片免费看| 色眯眯射| 日本成人免费一区二区三区| 婷婷五月花| 亚洲色图 91| 涩涩涩综合| 啊a一区在线| 日本一区二区中文字幕久久| 全球成人中文在线| 丰满人妻一区二区中文| 成人羞羞视频国产| 最新欧美色网| 欧美性高潮| 狠狠色婷婷777| 日韩三级性| 亚洲中文日韩欧美大香蕉视频| 久操99| 偷拍亚洲情色| 亚洲精品精品一区二区| 青青草乱入乱欲视频在线观看| 色色毛片| 欧美熟爽综合| 大学生美女口爆| 色色国产| 国产久久久久久| 99热这里只有精品9| 久久亚洲日韩熟女精品| 国产精品熟女丝袜一区二区| 啊啊啊男女| 91小视频| 国产精品视频| 人妻日日干| 日本加勒比无码专区一二三| 欧美日韩操操操| 国产精品在线一区二区| 日本日皮视频逼| 97少妇人妻中文字幕久久| 欧美性爱伊人| 自拍啪啪视频| 嗯啊不要在线观看嗯啊| 日日骚中文字幕| 久久中文色图| 欧美精品一区二区少妇免费A片 | 后入福利| 激情综合色| 精品欧美老熟女一二区| 亚洲国产剧情少妇激情| 亚洲,日韩,欧美,成人播放 | 一级黄色性爱A级片| 亚洲啪啪啪啪视香蕉| 无码外流操逼视频| 夜夜做夜夜爽精品视频| 在线观看日韩av不卡| 久久这里只有精品9| 国产免费大片| 精品亚洲黄色片 国产精品导航一区二区 | 丝袜天堂网| www.91久久| yaouchengrenav| 久久亚洲熟妇在线视频| 抽插无码高清一区| 亚洲男人的天堂va亚洲男人社| 国产精品国产自产拍高清AV| 高清无码一区二区三区| 亚洲天堂电影网99999| 99re视频在线观看这里只有精品| 99亚洲精品| 欧美与日韩97| 青青青操| 欧美日韩国产高清在线一二三区 | 天天色粽合合合合合合合| 国产无码精品成人| 色臀aV| 色婷婷aV一区二区三区麻豆综合| 国产午夜在线观看视频| 亚洲天堂另类| 天天综合网久久ww| 激情丁香婷婷| 超碰在线人妻中文字幕| 啊啊啊啊嗯嗯在线久久久| 在线啊啊啊啊| jk白丝没脱就开始啪啪| 97久操| caorenqi shipin| 日本高清_区二区三区| 99国产女人| 乱操9999| 亚州综合电影| 亚洲一区二区三区久久 亚洲一区二区| 青草成人免费视频一COm| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 女色视频社区| 可以在线观看AV的网站| 丰满美女一级毛片在线播放| 偷拍新久久| 国产久久久9999| 蜜乳AV色欲AVAV无码| 搡老女人老91妇女老熟女| 99re99视频在线免费观看| 男人天堂站| 婷婷六月色| 午夜男人一级A片7777| 日本精品网站在线中文| 狠狠操,使劲操| 欧美日韩人妻精品系列一区二区三区| 久湿久久 | 国产青青综合伊人| 日本大香蕉| 一区中文字幕二区日韩| 婷婷五月天成人| 久久人人看| 99久久久久久久久| 久久精品国产亚洲AV嘿嘿| 日韩成人高清一区二区| 无码天堂| 久久99国产精品| 天天综合中文字幕 91| 婷婷精品国产欧美精品亚洲人人爽| 国产中文福利| 色鬼在线综合| 97超碰天天爱天天爱| 人妻激情另类| 日本美女性生活久久久久久久| 婷婷伊人| 国产少妇与亚洲av| 色五月婷婷麻豆在| 天天日老熟妇| 一级久久久久久久久久久| 亚洲av影音先锋| 大学生美女口爆| 国产精品日本无码A片| 97综合激情| 97国产精品一区二区传媒公司| 欧洲精品二区| 这里只有精品97| 综合色欧美| 亚洲在饯| 亚洲AV成人精品网站在AV| 欧美综合网| 日本一区视频在线观看| 青青免费在线视频一区| 亚洲精品性爱片| 国产精品黄色三级av| 日本一区二区不卡精品| α√在线| 大香蕉伊人色偷偷在线| 超91综合网| 91美女在线视频| 婷婷香网站| 亚洲女优有码无码高清| 婷婷10月天青娱乐| 精品国产Av无码久久久伦古装| 蜜臀在线视频| 亚洲图片激情综合另类| 国产激情av女片自拍| 日韩性爱网址| 九一亚洲国产免费| 久久深夜无码| 青青草一本道福利视频| 亚洲丝袜少妇在线| 一二三四视频中文字幕在线看| ..日韩av毛片精品久久久| 日韩午夜啪啪视频| 99热综合在线| 欧美日韩中国x| 日韩大香蕉AV影片| 嫩草在线视频| 欧美,日韩,亚洲视频| 国产亚洲在线观看| 六月丁香婷| 5252色欧美在线| 人妻熟女一区二区三区视频| 欧美综合亚洲| 夜夜操美女| 欧美在线视频99| 人妻一区二区三区| 亚州,欧美在线| 精品视频在线观看精品| 澳门特级毛片免费观看| 亚洲欧美一区二区三区在钱蜜桃| 久久视频少妇美女| 欧美黄业| 中文字幕 国产 精品| 天天日日夜夜| 蜜臀在线看片| 国产美女自拍AV| 日本99视频| 激情久久日韩精品中文字幕麻豆| 亚洲综合九九| 大香蕉丝袜一级片| 狠肏骚人妻| 东京热天堂网| 亚洲AV成人无码一二三久久| 超碰av人人人| 91天堂丝袜美腿| 草草影院最新网址| 国产日本熟女顶级一区二区三区视频 | 久久久夜夜嗨免费视频| 极品粉嫩少妇视频| 亚洲 欧美综合| 69精品久久久久中文字幕| 嗯嗯啊啊啊好舒服| 亚洲情欲| 性做久久久久久久| 日韩三级在线观看mp4| 屁股久久久久久久| 免费一级视频特黄色大片| 青操影院| 少妇一区二区三区精选| 北京专精特新企业招聘信息| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 欧美99999| baisiav| 91丝袜在线观看| 天天色粽合合合合合合合| 男人天堂导航| 探花熟女,姿勢到位,體驗感也到位| 嫩草伊人久久精品| 91欧洲国产成人久久精品网站| 欧美躁死她一区二区| 日韩图色| 99精品在线观看| 水滴偷拍| 日本一级黄色电影| 91N综合网| 亚洲第一黄色av网站| 中亚黄色三级大片| 福利在线观看一区二区| 色麻豆AV| 91强热人妻| 99只有精品| 无色无码| 久热网| 五月天婷婷色色| 另类天堂| 天天色香欲综合网| 欧美精品久久96人妻无码| 六十路日本| 色五月av| 4141514逼喷水三级片| 国产精品高潮久久久无码| 久久97资源 网| 国产精品人妻无码久久久老鸭窝| 亚洲色图加勒比| 视频在线观看免费一区二区三区| 日韩精品9999| 欧美,日韩,亚洲视频| 国产精品第一页国产大屁股视频免费区i| ?亚洲伊人伊成久久人综合网| 97欧美久久久久久久| 337p大胆噜噜噜噜噜91Av| 欧美日韩资源| 色噜噜国产在线| 久操网址| 久久久久深夜无码| 久热69九色熟妇97| 成人aⅴ一区二区三区| 另类成人首页一区| 亚洲欧美精品一区天堂久久| 午夜精品久久久久久久久久久久久 | 色诱中文字幕| 美国精品国产精品| 97伦综合| 国产九九久久久精品| 亚洲免费成人精品电影| 欧美宗合网| 天天亚洲综合| 国产精品久久伊人| 狠狠入| 情色五月天网| 9 9精品一区二区三区| 国产色图乱伦| 无卡一区=区| 色综合久| 香蕉国产精品麻豆亚洲欧美日韩| 91精品国产乱码| 婷婷五月天小说| 日韩熟女乱伦中出| 欧美 亚洲 另类 综合| 伊人网av| 色婷婷九月天天综合| 久草新在线| 男女性扦B| 亚洲AV免费在线| 无遮挡男女激烈动态图| 日本免费二区三区| 蜜桃久久久久久久| 五月天大香蕉| 少妇高潮对白在线观看| 性色A∨91| 夜夜做夜夜爽精品视频| 国产精品青青草| 亚洲AV无码乱码在线观看性色| 亚洲国产精品成人综合| 日本五区不卡| 久久99草| 91天堂视频| 欧美成人精品A片免费一区99| 日本视频一区二区三区| 久久久久久九| 91色欧美| 自拍啪啪视频| 搞中出视频在线观看| 熟女在线视频| 欧美淫穴| 国内精品久久久久影院亚洲| 日本免费一级AAA大片器 | 99无码| 精品一区二区2| 久久亚洲天堂| 日本中文字幕一区| 干B视频伊人网| 青青草原狼av| 蜜色网色哟哟| 婷婷97| 五月天婷婷综合网| 五月丁香影视| 国产一区二区视频在线播放| 波多野结衣先锋影音| 91九色丨风韵犹存| juliaann丝袜| 亚洲熟女综合一区二区| 久久久9 9 9精品| 狠狠操狠狠燥| 激情视频图片| 丝袜美腿射精91| 久久精品电影| 中文字幕精品专区搜索结果91| 熟妇艹鸡八| 久久久久久久久久久999| 97干天天| 天天天乱色综合全| 欧美国产有色电影| 亚洲 综合 第一页| 成人性爱av| 五月丁香影院| 精品国产a∨一区天美传媒| 日韩精品人妻中文字幕久久久| 国产性爱在线视频一区二区| 精品人妻一二三四区视频| 欧美性天天影院| 亚洲中文电影| 欧美第二页午夜| 久久成人东京热人妻| 国产亚热在线久久|