京东配运基础数据缓存瘦身实践

Unity京东小游戏开发:电商营销新利器 游戏化营销正成为电商平台的重要策略,通过Unity引擎开发的3D小游戏能显著提升用户停留时长和转化率。Unity的跨平台能力使其成为电商小游戏开发的首选,尤其在京东这样的平台上,游戏化内容能带来3-5倍的流量红利。技术实现上,开发者需掌握WebGL优化、资源压缩和内存管理等核心技能,以应对平台对包体大小和性能的严格要求。结合京东特有的社交裂变和商品API功能,Unity小游戏不仅能提升用户互动,还能直接带动GMV增长。对于希望进入电商游戏化领域的开发者,理解这些技术原理和平台特性至关重要。 阅读详情

一、背景

在现代物流的实际作业流程中,会有大量关系到运营相关信息的数据产生,如商家,车队,站点,分拣中心,客户等等相关的信息数据,这些数据直接支撑起了物流的整个业务流转,具有十分重要的地位,那么对于这一类数据我们需要提供基本的增删改查存的能力,目前京东物流的基础数据是由中台配运组来整体负责。

在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。

二、方案

这次优化我们挑选了商家基础资料和C后台2个系统进行了缓存数据的优化试点,从结果看取得了非常显著的成果,节省了大量的硬件资源成本,下面的数据是优化前后的缓存使用情况对比:

商家基础资料Redis数据量由45G降为8G;
C后台Redis数据量由132G降为7G;

从结果看这个优化的力度太大了,相信大家对如何实现的更加好奇了,那接下来就让我们一步步来看是如何做到的吧!

首先目前的商家基础资料使用@Caceh注解组件作为缓存方式,它会将从db中查出的值放入本地缓存及jimdb中,由于该组件早期的版本没有jimdb的默认过期时间且使用注解时也未显式声明,造成早期大量的key没有过期时间,从而形成了大量的僵尸key。
所以如果我们可以找到这些僵尸key并进行优化,那么就可以将缓存进行一个整体的瘦身,那首先要怎么找出这些key呢?

2.1 keys命令

可能很多同学会想到简单粗暴的keys命令,遍历出所有的key依次判断是否有过期时间,但Redis是单线程执行,keys命令会以阻塞的方式执行,遍历方式实现的复杂度是O(n),库中的key越多,阻塞的时间会越长,通常我们的数据量都会在几十G以上,显然这种方式是无法接受的。

2.2 scan命令

redis在2.8版本提供了scan命令,相较于keys命令的优势:

  • scan命令的时间复杂度虽然也是O(N),但它是分次进行的,不会阻塞线程。

  • scan命令提供了类似sql中limit参数,可以控制每次返回结果的最大条数。

当然也有缺点:

  • 返回的数据有可能会重复,至于原因可以看文章最后的扩展部分。

  • scan命令只保证在命令开始执行前所有存在的key都会被遍历,在执行期间新增或删除的数据,是不确定的即可能返回,也可能不返回。

2.3基本语法

目前看来这是个不错的选择,让我们来看下命令的基本语法:

SCAN cursor [MATCH pattern] [COUNT count]

  • cursor:游标

  • pattern:匹配的模式

  • count:指定从数据集里返回多少元素,默认值为10

2.4 实践

首先感觉上就是根据游标进行增量式迭代,让我们实际操作下:

看来我们只需要设置好匹配的key的前缀,循环遍历删除key即可。
可以通过Controller或者调用jsf接口来触发,使用云redis-API,demo如下:

好的,大功告成.在管理端执行randomkey命令查看.发现依然存在大量的无用key,貌似还有不少漏网之鱼,这里又是怎么回事呢?

下面又到了喜闻乐见的踩坑环节。

2.5 避坑指南

通过增加日发现,返回的结果集为空,但游标并未结束!

其实不难发现scan命令跟我们在数据库中按条件分页查询是有别的,mysql是根据条件查询出数据,scan命令是按字典槽数依次遍历,从结果中再匹配出符合条件的数据返回给客户端,那么很有可能在多次的迭代扫描时没有符合条件的数据。

我们修改代码使用scanResult.isFinished()方法判断是否已经迭代完成。

至此程序运行正常,之后通过传入不同的匹配字符,达到清楚缓存的目的。

三、课后扩展

这里我们探讨重复数据的问题:为什么遍历出的数据可能会重复?

3.1 重复的数据

首先我们看下scan命令的遍历顺序:

Redis中有3个key,我们用scan命令查看发现遍历顺为0->2->1->3,是不是感到奇怪,为什么不是按0->1->2->3的顺序?

我们都知道HashMap中由于存在hash冲突,当负载因子超过某个阈值时,出于对链表性能的考虑会进行Resize操作.Redis也一样,底层的字典表会有动态变换,这种扫描顺序也是为了应对这些复杂的场景。

3.1.1 字典表的几种状态及使用顺序扫描会出现的问题

  • 字典表没有扩容
    字段tablesize保持不变,顺序扫描没有问题

  • 字典表已扩容完成

假设字典tablesize从8变为16,之前已经访问过3号桶,现在0~3号桶的数据已经rehash到8~11号桶,若果按顺序继续访问4~15号桶,那么这些元素就重复遍历了。

  • 字典表已缩容完成

假设字典tablesize从16缩小到8,同样已经访问过3号桶,这时8~11号桶的元素被rehash到0号桶,若按顺序访问,则遍历会停止在7号桶,则这些数据就遗漏掉了。

  • 字典表正在Rehashing
    Rehashing的状态则会出现以上两种问题即要么重复扫描,要么遗漏数据。

3.1.2 反向二进制迭代器算法思想
我们将Redis扫描的游标与顺序扫描的游标转换成二进制作对比:

高位顺序访问是按照字典sizemask(掩码),在有效位上高位加1。

举个例子,我们看下Scan的扫描方式:
1.字典tablesize为8,游标从0开始扫描;
2.返回客户端的游标为6后,字典tablesize扩容到之前的2倍,并且完成Rehash;
3.客户端发送命令scan 6;

这时scan命令会将6号桶中链表全部取出返回客户端,并且将当前游标的二进制高位加一计算出下次迭代的起始游标.通过上图我们可以发现扩容后8,12,10号槽位的数据是从之前0,4,2号槽位迁移过去的,这些槽位的数据已经遍历过,所以这种遍历顺序就避免了重复扫描。

字典扩容的情况类似,但重复数据的出现正是在这种情况下:

还以上图为例,再看下缩容时Scan的扫描方式:
1.字典tablesize的初始大小为16,游标从0开始扫描;
2.返回客户端的游标为14后,字典tablesize缩容到之前的1/2,并完成Rehash;
3.客户端发送命令scan 14;

这时字典表已完成缩容,之前6和14号桶的数据已经Rehash到新表的6号桶中,那14号桶都没有了,要怎么处理呢?我们继续在源码中找答案:

即在找目标桶时总是用当前hashtaba的sizemask(掩码)来计算,v=14即二进制000 1110,当前字典表的掩码从15变成了7即二进制0000 0111,v&m0的值为6,也就是说在新表上还要扫一遍6号桶.但是缩容后旧表6和14号桶的数据都已迁移到了新表的6号桶中,所以这时扫描的结果就出现了重复数据,重复的部分为上次未缩容前已扫描过的6号桶的数据。

结论:
当字典缩容时,高位桶中的数据会合并进低位桶中(6,14)->6,scan命令要保证不遗漏数据,所以要得到缩容前14号桶中的数据,要重新扫描6号桶,所以出现了重复数据.Redis也挺难的,毕竟鱼和熊掌不可兼得。

总结

通过本次Redis瘦身实践,虽然是个很小的工具,但确实带来的显著的效果,节约资源降低成本,并且在排查问题中又学习到了命令底层巧妙的设计思想,收货颇丰,最后欢迎感兴趣的小伙伴一起交流进步。

 - END -

推荐阅读:

ThreadLocal为什么要使用弱引用和内存泄露问题

京东研发团队 - 领域驱动设计(DDD)实践

SpringCloud四个注册中心的比较

谈谈微服务设计中的 API 网关模式

Netflix 如何解决身份验证问题?

关注我

学习架构知识

互联网后端架构

SSD涨价不换盘:Windows C盘瘦身方案与Compact OS实操指南 磁盘空间不足是电脑使用中最高频的痛点之一,尤其在系统盘容量告急时,清理缓存、迁移文件往往只能解决表面问题。Windows系统本身就内置了一套完整的空间回收机制,其核心原理是利用NTFS文件压缩与组件存储管理,在不影响系统稳定性的前提下释放冗余备份。通过开启Compact OS功能,系统会将二进制文件透明压缩,配合存储感知、磁盘清理和DISM组件清理,可显著降低系统盘占用。这项技术的价值在于平衡性能与容量,尤其适合SSD涨价行情下暂不升级硬件的用户。无论是256GB老笔记本还是128GB平板设备,都能通过这套 阅读详情

相关推荐

告别F12!AI+Python自动解析京东商品页,新手也能写出生产级爬虫

本文仅用于Python自动化学习与网页结构分析技术研究。京东商品数据受《反不正当竞争法》及平台服务条款保护,未经授权批量采集可能构成违法。文中代码仅作技术演示,请勿用于实际数据采集。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 361

配运基础数据缓存瘦身实践

在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。

京东科技开发者 175

仿京东购物车小程序模板详解与改造实战:从RAR到上线

微信小程序开发中,购物车是电商类应用的核心模块,其实现涉及商品规格(SKU)选择、列表金额计算、登录态维持等复杂逻辑。开发者常从网上下载“仿京东购物车”类模板,但模板结构混乱、接口对接困难。理解模板的数据流与渲染机制,是将其改造为可用项目的基础。购物车数据通常以本地缓存或接口驱动方式管理,通过setData更新视图,并结合wx.request与后端交互。登录态通过wx.login获取code换取token,支付则需后端返回预支付参数。掌握这些关键技术点,能快速定位模板问题,实现从静态演示到真实上线的跨越。本

weixin_31309419的博客 251

【最佳实践】京东小程序-LBS业务场景的性能提升 | 京东云技术团队

以上是我们近期优化的阶段性成果,不仅得到了业务和产品同学的认可,而且线上用户反馈门详加载慢、卡顿的问题占比降低了约15%。用户体验提升是需要长期坚持,技术同学需要具备一定的工匠精神,持续探索,我们在规划中的事情还有:① 能耗层面的继续探索与优化;虚拟列表的支持:目前门店列表支持多分类的加载联动,且在同一个分类下进行了组件复用与回收;下一步,我们将继续进行跨分类的组件复用与回收,将门详列表的回收渲染机制形成统一性的解决方案。

京东科技开发者 1819

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

涨薪技术|Kubernetes(k8s)环境部署实战

这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json:​​​​​​​。安装完成后,可以使用以下命令来查看dashboard访问的端口号​​​​​​​。网络插件CNI也是以容器的方式进行启动​​​​​​​。安装完成后可以检查是否拉取了对应的容器​​​​​​​。再使用以下命令进行安装:​​​​​​​。打开后输入以下内容:​​​​​​​。安装1.19.0版本​​​​​​​。修改IP地址:​​​​​​​。

m0_60889254的博客 1085

京东三级列表页持续架构优化—前端优化实践

王向维,京东商城三级列表页架构师,完成列表页的nodejs版本到nginx+lua版本的变迁,并做了大量三级列表页的服务端和前端的优化工作。 在持续开发一个核心系统过程中,除了满足业务需求外,还应该考虑系统未来的架构,追求极致的系统的可用性、高性能和稳定性。这个过程是一个长期积累和重构的过程。   每个应用都要满足自己特定的需求,因为商业条件、应用场景、用户期望,以及

__技术分享__部落格 755

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 335

Unity项目上架京东小游戏:从构建到上线的完整实践指南

小游戏依托超级App的流量生态,已成为开发者拓展用户场景的高性价比选择。Unity作为主流游戏引擎,其WebGL导出产物需经适配层转换才能运行于京东小程序容器。这一过程涉及构建管线选型、包体瘦身、登录支付差异化适配等关键技术。通过理解微信小游戏生态的兼容性基础,开发者可复用现有Unity资产,将游戏快速迁移至京东电商场景,触达高价值用户。文章系统梳理从Unity工程到京东小游戏上线的完整链路,沉淀可落地的实践方法。

weixin_34319374的博客 296

LTspice进阶技巧-031.一键加密仿真模型:LTspice Encrypt Tool实战指南

本文详细介绍了LTspice Encrypt Tool的使用方法,帮助工程师一键加密LTspice仿真模型,保护知识产权。通过图形化界面简化操作流程,支持批量加密和兼容性处理,适用于电路设计中的模型保护需求。

weixin_28304023的博客 202

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 296

京东智能客服核心技术解析:从架构设计到实战优化

回顾京东智能客服系统的演进,核心是一个在效果、性能、稳定性三角中不断寻找最佳平衡点的过程。我们通过领域定制和模型压缩来提升效果与性能,通过分布式架构和降级策略来保障稳定性。如何更好地平衡模型精度与推理延迟?在电商大促时,流量激增,对延迟极其敏感,我们可能会启用更轻量级的模型。但在平时,我们又希望给用户最精准的服务。是否可以实现一个自适应模型选择系统?实时监控系统负载和流量特征,动态地在“大模型”、“小模型”、“规则引擎”之间进行切换或组合,在满足延迟SLA的前提下,尽可能提供最智能的回复。

2600_94959989的博客 387

基于C++和Qt开发IEC104规约主站调试软件(第二章)

本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。

半青年的博客 860

京东2019春招iOS笔试题深度拆解:考点分析与面试指南

Objective-C语言基础和iOS系统机制是移动开发工程师的核心知识体系。Runtime的消息传递与消息转发、内存管理中的引用计数、RunLoop的事件循环与多线程并发模型,这些底层原理决定了开发者能否写出稳定高效的代码。在电商、社交等复杂业务场景中,内存泄漏、线程死锁、卡顿优化等问题都与这些机制直接相关,因此也成为大厂工程师面试的必考内容。以京东2019春招iOS开发类试卷为线索,梳理语言特性、系统机制、架构设计与实战经验等高频考点,帮助准备iOS面试的开发者建立系统化复习路径,并延伸到网络层设计、性

weixin_34293911的博客 419

使用VNA(Vector Network Analyzer)对S参数进行去嵌(二)

无论是使用 EM 仿真工具创建的简化模型(如一段理想传输线)还是复杂模型用于测试夹具,现在都需要使用该 S 参数模型执行去嵌入过程。

小孟同学的博客 6111

华为OD机考双机位C卷:精准核酸检测 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 精准核酸检测,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 精准核酸检测。

qq_45776114的博客 1729

Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析

这一切明了移动互联网并没有具体的形态,它仅仅代表着一个高速发展的时代已经来了。我们很幸运也很不幸,幸运的是,能够活着看到时代的发展和变迁,不幸的是,我们会很累需要不停地去接受和面对挑战。在这样一个社会中,不要浪费时间在思考,实践才能够抓住「红利期」。不要纠结于先有鸡,还是先有蛋。很多人纠结于自己没有这个,没有那个,所以不够级别去做一些事情。想做了就去做,我们不应该等到自己达到了一个等级才去做事情,而是要在做事情的过程中让自己达到对应的级别。Android性能优化——实战解析。

2501_90392169的博客 1338

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

小程序如何用data的数据控制页面展示_京喜小程序体验评分优化实践

近来小程序开发已成为各大公司的刚需,而小程序的体积也越来越重。跟随作者一起,提升小程序的访问体验。背景—体验评分 Audits 是微信开发者工具内置的一项功能,会在小程序运行过程中实时检查,分析出一些可能导致体验不好的地方,并且定位出哪里有问题,以及给出一些优化建议。京喜小程序作为京东战略级业务,拥有千万级别的流量入口,经过长时间的业务迭代,代码逻辑已经十分复杂臃肿,有迫切的性能优化需求...

weixin_39725885的博客 259

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android面试必备,Android性能优化实战解析(含腾讯、字节、阿里、百度、京东、网易等一线大厂)

背景 近几年针对优化的面试越来越深入,例如如下问题: 在之前的项目中做过哪些性能优化,取得过哪些收益? 对于App启动时间这块,有什么心得?如何从线程、系统层面出发优化启动速度? 对于内存优化,你觉得需要做哪些事情?Java/Native 内存泄露如何检测与处理? 流畅性这块,你们 App 的关注的指标是?这块有什么经验? 你觉得造成页面卡顿最主要的原因是?有什么通用性的优化方案? 但大多数开发者更多的还是在做业务开发,对于性能优化基本停留在"听说过"或者"简单使用工具"的阶段,其中不乏一些工作多年的

xiaokangss的博客 275

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

2021京东最新Android面试真题解析,文末领取面试资料

Android开发真的凉了吗? 经常有朋友问我:“现在学习Android开发还有前景吗?”“Android开发还有什么可以研究的?”大家对于职业的未来,都有一些迷茫和焦虑,其实我也有,为什么会这样呢? 现在互联网行业,各大公司已经从争夺用户转为争夺用户时长。而小程序、快应用的崛起,也让许多 App 的增长达到瓶颈。所有人都在说,国内移动互联网的红利期已经过去。 另外一方面,今年移动端的技术变革也确实有点慢。大前端的概念虽然说了很久也很多,但React Native、PWA的效果依然不尽人意。 这么看来,移动

m0_56255097的博客 113

聚观早报 | OPPO A2 Pro官宣;京东建材发布“1家1”计划

【聚观365】9月15日消息OPPO A2 Pro官宣京东建材发布“1家1”计划谷歌开始新一轮“瘦身”计划CapCut全球用户总支出超1亿美元马斯克称特斯拉FSD安全性超过人类司机。

Juguan365的博客 458

腾讯android面试题,大厂经典高频面试题体系化集合,面试总结

前言 新鲜面筋出炉了! 一直都挺喜欢京东这家公司的,于是一边复习,一边看京东的招聘信息。 我是在7月25日投递的简历,投出去后等了三天,一直没有收到回音。本来以为已经石沉大海了的,没想到三天后收到了信息。 因为目标公司不在本地,我当时还在乡下,网不好,所以整个面试节奏都往后推了一下,后面约了8月6日的笔试。 后面,一切顺利进行,11号上午短信+邮件通知12号下午15.30电话面试。 这里要说一下,给我面试的面试官口音是正宗川普,好几次我都没听清,让面试官重复了好几次问题,还好面试官有耐心hhh。 下面,我记

m0_56222134的博客 340

全面解析Android性能优化,含腾讯、阿里、百度、京东、美团、爱奇艺等大厂实战解析

前言 安卓开发大军浩浩荡荡,经过十多年的发展。红利期已过,现在是增量有限,存量厮杀,从争夺用户到争夺时长。不管是用户也好、企业也好,都对 App 的用户体验和性能提出了更高的要求。 如果你已经有 2 - 3 年以上开发经验还不懂的怎么去优化自己的项目,那么想迈进中高级工程师这道门槛是不可能了。而这道门槛,说实话学习成本还是挺高的。 性能优化也是企业考察一个高级 Android 工程师技术水平的重要维度。特别是诸多大厂在这方面尤为看重,毕竟就算0.1%的瑕疵,影响的将是百万级、千万级的用户体验! 为什么要进行

xiaokangss的博客 2067

每天认识一个组件:Redis

Redis 是一个以内存为主要数据存储介质的数据结构服务器。它既可以用作缓存,也可以承担计数器、排行榜、会话存储、分布式协调、消息传递和实时数据处理等职责。

weixin_47983718的博客 315
上一篇: SpringCloud四个注册中心的比较
下一篇: 互联网技术团队如何搭建自己的管理体系
qianshanding0708
博客等级 码龄11年 427粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值