成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

熬了一個通宵,終于把Reids的7千萬個Key刪完了,今天腦子都嗡嗡響!

開發 前端 其他數據庫
由于有一條業務線不理想,高層決定下架業務。對于我們技術團隊而言,其對應的所有服務器資源和其他相關資源都要釋放。

前言

由于有一條業務線不理想,高層決定下架業務。對于我們技術團隊而言,其對應的所有服務器資源和其他相關資源都要釋放。釋放了8臺應用服務器;1臺es服務器;刪除分布式定時任務中心相關的業務任務;備份并刪除MySQL數據庫;刪除Redis中相關的業務緩存數據。CTO指名點姓讓我帶頭沖鋒,才扣了我績效……好吧,沖~

其他都還好,不多時就解決了。唯獨這刪除Redis中的數據,害得我又熬了一個通宵,真是折煞我也!

難點分析

共用Redis服務集群

由于這條業務線的數據在Redis大概在3G左右,完全沒必要單獨建一個Redis服務集群,本著能節約就節約的態度,當初就決定和其他項目共享一個集群(這個集群配置:16個節點,128G內存,還算豪華吧~)集群配置如下:

在這種共用集群的情況下,導致無法簡單粗暴的釋放。因此只能選擇刪除Key的方式。

Key命名不規范

要刪除Key,首先就要精準的定位出哪些Key需要刪除,如果勿刪Key,會影響到其他服務正常運轉!如果Key本身設置了過期時間,但有些數據需是持久化的。然而那該死的項目經理一直催項目進度,導致開發人員在開發過程中很多地方都沒有設計到位,比如Redis Key散落在項目代碼的每個角落;比如命名不是很規范。真不知道是怎么review代碼!哦,想必是沒有時間review,那該死的項目經理……

我隨便截個支付服務中的Key命名:

怎么樣?是不是覺得我們開發人員寫的代碼很low~別笑,在實際工作中,還有比這更low的!希望你別遇到,不然真的很痛苦~

解決思路

經過以上的分析,我們簡單歸納如下:

  •  我們真正關心的是那些未設置過期時間的Key
  •  不能誤刪除Key,否則下個月績效也沒了
  •  由于Key的命名及使用及其不規范,導致Key的定位難度很大

看來,通過scan命令掃描匹配Key的方式行不通了。只能通過人肉搜索了~

幸而Idea的搜索大法好,這個項目中使用的是spring-boot-starter-data-redis.因此我通過搜索RedisTemplate和StringRedisTemplate定位所有操作redis的代碼,具體步驟如下:

1、通過這些代碼統計出Key的前綴并錄入到文本中;

2、通過python腳本把載入文中中的的Key并在后面加上“*”通配符;

3、通過python腳本通過scan命令掃描出這些key;

4、為了便于檢查,我們并沒有直接使用del命令刪除key,在刪除key之前,先通過debug object key的方式得到其序列化的長度,再執行刪除并返回序列化長度。這樣,我們就可以統計出所有key的序列化長度來得到我們釋放的空間大小。關鍵代碼如下:   

  1. def get_key(rdbConn,start):  
  2.        try:  
  3.        keys_list = rdbConn.scan(start,count=2000 
  4.        return keys_list  
  5.        exceptException,e:  
  6.        print e  
  7.    ''' Redis DEBUG OBJECT command got key info '''  
  8.    def get_key_info(rdbConn,keyName):  
  9.        try:  
  10.        rpiple = rdbConn.pipeline()  
  11.        rpiple.type(keyName)  
  12.        rpiple.debug_object(keyName)  
  13.        rpiple.ttl(keyName)  
  14.        key_info_list = rpiple.execute()  
  15.        return key_info_list  
  16.        exceptException,e:  
  17.        print"INFO : ",e  
  18.    def redis_key_static(key_info_list):  
  19.        keyType = key_info_list[0]  
  20.        keySize = key_info_list[1]['serializedlength']  
  21.        keyTtl = key_info_list[2]  
  22.        key_size_static(keyType,keySize,keyTtl) 

通過以上方式,能夠統計出究竟釋放了多少內存了。

由于這個集群是有這么接近7千萬個key:

因此,等到了第二天天亮,我睡眼朦朧的看了一下,終于刪除完畢了,時間07:13...早高峰即將來臨……

知恥而后勇

從來沒有經歷過因業務下線而清除資源的經驗。這次事情真心讓我覺得細微之處見真功夫的道理。如果一開始我們就能夠遵循開發規范來使用和設計redis key,也不至于浪費這么多時間。為了讓key的命名和使用更加規范,以及今后避免再次遇到這種情況,下午睡醒之后,我就在redis公共組件庫里面添加了一個配置和自定義了key序列化,代碼如下: 

  1. @ConfigurationProperties(prefix = "spring.redis.prefix" 
  2. publicclassRedisKeyPrefixProperties{  
  3.     privateBoolean enable = Boolean.TRUE;  
  4.     privateString key;  
  5.     publicBoolean getEnable() { 
  6.          return enable;  
  7.     }  
  8.     publicvoid setEnable(Boolean enable) {  
  9.         this.enable = enable;  
  10.     }  
  11.     publicString getKey() {  
  12.         return key;  
  13.     }  
  14.     publicvoid setKey(String key) {  
  15.         this.key = key;  
  16.     }  
  17.  
  1. /**  
  2.  * @desc 對字符串序列化新增前綴  
  3.  * @author create by liming sun on 2020-07-21 14:09:51  
  4.  */  
  5. publicclassPrefixStringKeySerializerextendsStringRedisSerializer{  
  6.     privateCharset charset = StandardCharsets.UTF_8; 
  7.      privateRedisKeyPrefixProperties prefix;  
  8.     publicPrefixStringKeySerializer(RedisKeyPrefixProperties prefix) {  
  9.         super(); 
  10.          this.prefix = prefix;  
  11.     }  
  12.     @Override  
  13.     publicString deserialize(@Nullablebyte[] bytes) {  
  14.         String saveKey = newString(bytes, charset);  
  15.         if(prefix.getEnable() != null&& prefix.getEnable()) {  
  16.             String prefixKey = spliceKey(prefix.getKey());  
  17.             int indexOf = saveKey.indexOf(prefixKey);  
  18.             if(indexOf > 0) {  
  19.                 saveKeysaveKey = saveKey.substring(indexOf);  
  20.             }  
  21.         }  
  22.         return(saveKey.getBytes() == null? null: saveKey);  
  23.     }  
  24.     @Override  
  25.     publicbyte[] serialize(@NullableString key) {  
  26.         if(prefix.getEnable() != null&& prefix.getEnable()) {  
  27.             key = spliceKey(prefix.getKey()) + key;  
  28.         }  
  29.         return(key == null? null: key.getBytes(charset));  
  30.     }  
  31.     privateString spliceKey(String prefixKey) {  
  32.         if(StringUtils.isNotBlank(prefixKey) && !prefixKey.endsWith(":")) {  
  33.             prefixKeyprefixKey = prefixKey + "::";  
  34.         }  
  35.         return prefixKey;  
  36.     }  

使用效果

為了避免再次發生這種工作低效而又不得不做的事情,我們在開發規范中規定,新項目中redis的使用必須設置此配置,前綴就設置為:項目編號。另外,一個模塊中的key必須統一定義在二方庫的RedisKeyConstant類中。配置如下: 

  1. spring:  
  2.     redis:  
  3.         prefix:  
  4.             enable: true  
  5.             key: E00P01    
  1. @Bean  
  2.    publicRedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {  
  3.        RedisTemplate<String, Object> redisTemplate = newRedisTemplate<>();  
  4.        redisTemplate.setConnectionFactory(redisConnectionFactory);  
  5.        // 支持key前綴設置的key Serializer  
  6.        redisTemplate.setKeySerializer(newPrefixStringKeySerializer());  
  7.        redisTemplate.setValueSerializer(newGenericJackson2JsonRedisSerializer());  
  8.        return redisTemplate;  
  9.    } 

通過以上方式,我們至少可以從項目維度來區分出key,避免了多個項目之間共用同一個集群時而導致重復key的問題。從項目維度對key進行了劃分。更方便管理和運維。如果對于key的管理粒度要求更細,我們甚至可以細化到具體業務維度。我們在測試環境進行了壓測,增加key前綴對redis性能幾乎沒有影響。性能方面能接受。 

 

責任編輯:龐桂玉 來源: java版web項目
相關推薦

2022-10-18 07:30:06

MySQLJVM日志

2019-06-17 08:21:06

RPC框架服務

2019-04-22 10:25:52

程序員技術職場

2021-04-23 13:46:06

Python標準庫協議

2025-06-03 06:30:05

2011-08-08 16:18:49

諾基亞蘋果iPhone

2021-04-07 10:53:30

安全公司區塊鏈安全比特幣

2020-10-16 16:28:54

Python開發技術

2024-11-11 14:57:56

JWTSession微服務

2020-03-31 18:54:31

微軟OfficeMicrosoft

2022-09-27 08:19:20

前端React

2015-01-23 10:04:56

bug程序員

2021-08-09 10:24:21

技術分類數學

2021-07-21 05:22:12

Webpack 前端 JavaScript

2019-07-29 09:11:36

2024-05-22 13:04:46

Python對象關系

2024-05-21 12:51:06

Python對象PyObject

2015-11-30 11:33:10

項目管理團隊開發

2018-01-29 12:15:30

蘋果應用App

2023-05-11 08:08:18

MySQL主從復制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 噜久寡妇噜噜久久寡妇 | 久久久久久国产 | 国产一二区视频 | 一区中文字幕 | 欧美日韩一区精品 | 米奇狠狠鲁| 成人在线国产 | 日韩视频在线播放 | 又黑又粗又长的欧美一区 | 欧美精品福利 | 国产日屁| 国产午夜精品一区二区三区嫩草 | 欧美激情视频网站 | 91在线区| 四虎影院新地址 | 国产日韩欧美在线观看 | 狠狠综合久久av一区二区小说 | 免费精品视频一区 | 国产精品久久久爽爽爽麻豆色哟哟 | 日韩中文一区二区三区 | 一级a性色生活片久久毛片 午夜精品在线观看 | 色欧美片视频在线观看 | 亚洲国产精品久久久 | 亚洲女优在线播放 | 在线视频 亚洲 | 日韩三区 | 午夜噜噜噜| 国产视频中文字幕 | 久久久久久国产精品免费免费 | 91日韩| 天天操天天舔 | 国产一在线 | 亚洲一区二区电影在线观看 | 久久人爽 | 在线视频a | 亚洲日本欧美 | 免费久久网 | 丝袜美腿一区二区三区动态图 | 中文字幕综合在线 | h视频在线看 | 先锋影音资源网站 |