南昌做网站开发的公司有哪些网络营销策划的主要特点
web/
2025/10/9 1:13:49/
文章来源:
南昌做网站开发的公司有哪些,网络营销策划的主要特点,制作网站的公司做网站去哪里找,微信怎么自建小程序商店https://mp.weixin.qq.com/s/7FL0nUTk6aFmAb2J__5Mtw 因 Redis Key 命令不规范#xff0c;导致熬了一个通宵才把Key删完了#xff01;
点击关注 #x1f449; Java面试那些事儿 9月3日 # 前言 由于有一条业务线不理想#xff0c;高层决定下架业务。对于我们技术团队而言导致熬了一个通宵才把Key删完了
点击关注 Java面试那些事儿 9月3日 # 前言 由于有一条业务线不理想高层决定下架业务。对于我们技术团队而言其对应的所有服务器资源和其他相关资源都要释放。释放了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的代码具体步骤如下 通过这些代码统计出Key的前缀并录入到文本中 通过python脚本把载入文中中的的Key并在后面加上“*”通配符 通过python脚本通过scan命令扫描出这些key 为了便于检查我们并没有直接使用del命令删除key在删除key之前先通过debug object key的方式得到其序列化的长度再执行删除并返回序列化长度。这样我们就可以统计出所有key的序列化长度来得到我们释放的空间大小。关键代码如下 def get_key(rdbConn,start): try: keys_list rdbConn.scan(start,count2000) return keys_list except Exception,e: print eRedis DEBUG OBJECT command got key info def get_key_info(rdbConn,keyName): try: rpiple rdbConn.pipeline() rpiple.type(keyName) rpiple.debug_object(keyName) rpiple.ttl(keyName) key_info_list rpiple.execute() return key_info_list except Exception,e: print INFO : ,edef redis_key_static(key_info_list): keyType key_info_list[0] keySize key_info_list[1][serializedlength] keyTtl key_info_list[2] key_size_static(keyType,keySize,keyTtl) 通过以上方式能够统计出究竟释放了多少内存了。 由于这个集群是有这么接近7千万个key 因此等到了第二天天亮我睡眼朦胧的看了一下终于删除完毕了时间07:13…早高峰即将来临…… 知耻而后勇 从来没有经历过因业务下线而清除资源的经验。这次事情真心让我觉得细微之处见真功夫的道理。如果一开始我们就能够遵循开发规范来使用和设计redis key也不至于浪费这么多时间。为了让key的命名和使用更加规范以及今后避免再次遇到这种情况下午睡醒之后我就在redis公共组件库里面添加了一个配置和自定义了key序列化代码如下 ConfigurationProperties(prefix spring.redis.prefix) public class RedisKeyPrefixProperties { private Boolean enable Boolean.TRUE; private String key; public Boolean getEnable() { return enable; } public void setEnable(Boolean enable) { this.enable enable; } public String getKey() { return key; } public void setKey(String key) { this.key key; } } /** * desc 对字符串序列化新增前缀 * author create by liming sun on 2020-07-21 14:09:51 */ public class PrefixStringKeySerializer extends StringRedisSerializer { private Charset charset StandardCharsets.UTF_8; private RedisKeyPrefixProperties prefix;public PrefixStringKeySerializer(RedisKeyPrefixProperties prefix) { super(); this.prefix prefix; }Override public String deserialize(Nullable byte[] bytes) { String saveKey new String(bytes, charset); if (prefix.getEnable() ! null prefix.getEnable()) { String prefixKey spliceKey(prefix.getKey()); int indexOf saveKey.indexOf(prefixKey); if (indexOf 0) { saveKey saveKey.substring(indexOf); } } return (saveKey.getBytes() null ? null : saveKey); }Override public byte[] serialize(Nullable String key) { if (prefix.getEnable() ! null prefix.getEnable()) { key spliceKey(prefix.getKey()) key; } return (key null ? null : key.getBytes(charset)); }private String spliceKey(String prefixKey) { if (StringUtils.isNotBlank(prefixKey) !prefixKey.endsWith(:)) { prefixKey prefixKey ::; } return prefixKey; } } 使用效果 为了避免再次发生这种工作低效而又不得不做的事情我们在开发规范中规定新项目中redis的使用必须设置此配置前缀就设置为项目编号。另外一个模块中的key必须统一定义在二方库的RedisKeyConstant类中。配置如下 spring: redis: prefix: enable: true key: E00P01 Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplateString, Object redisTemplate new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 支持key前缀设置的key Serializer redisTemplate.setKeySerializer(new PrefixStringKeySerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } 通过以上方式我们至少可以从项目维度来区分出key避免了多个项目之间共用同一个集群时而导致重复key的问题。从项目维度对key进行了划分。更方便管理和运维。如果对于key的管理粒度要求更细我们甚至可以细化到具体业务维度。 我们在测试环境进行了压测增加key前缀对redis性能几乎没有影响。性能方面能接受。 # 总结 通过本次事情我发现对于大多数开发者而言差距其实不在于智力而是在于态度。比如这次事件暴露出来的问题大家都知道要遵循开发规范然而到了真正“打仗”的时候负责这个项目的开发者却没有几个人能始终如一的做好这些细微之事。另外reviewer的工作其实是极其重要的他就像那“纪检委”如果“纪检委”都放水睁一只眼闭一只眼那麻烦可就大了千里之提毁于日常的点滴松懈啊~~~ 经过这次事件之后如果上天再给一次这样的机会我一定会对项目经理说接着奏乐接着舞 来源juejin.im/post/6854573215726075917
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89364.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!