喜马拉雅 Redis 与 Pika 缓存使用军规

news2025/7/20 12:42:29

作者:喜马拉雅 董道光

宣言:缓存不是万金油,更不是垃圾桶!!!

缓存作为喜马拉雅至关重要的基础组件之一,每天承载着巨大的业务请求量。一旦缓存出现故障,对业务的影响将非常严重。因此,确保缓存服务的稳定和高效运行始终是我们的重要目标。

下面是我们对喜马缓存历史故障复盘后总结的一套缓存使用规范,在此分享给大家,希望小伙伴们能在缓存选型和使用的过程中少踩坑。

1. 缓存选型

1.1 缓存类型介绍

喜马线上缓存类型主要有 4 种:

1. redis 主从模式:官方原版

2.codis-redis:豌豆荚开源,redis 集群解决方案

3. 云数据库 redis:redis-cluster 容器化部署

4.xcache:基于 codis、pika、redis 自研的一套海量 KV 存储解决方案

1.2 缓存使用模式介绍

使用模式主要分为 2 种:

1.cache 模式:数据不需要持久化,实例恢复不需要加载数据,扩缩容不需要迁移数据

2.store 模式:数据需要持久化,实例恢复需要加载数据,扩缩容需要迁移数据

下面是对各种类型缓存做了简单对比:

2. 缓存使用军规

2.1 缓存类型使用规范

1)redis 集群模式首选云数据库 redis,海量 KV 存储首选 xcache

云数据库 redis 采用官方 redis cluster 模式,容器化部署,支持故障自动恢复和弹性伸缩,是当前 redis 集群的主推方案,但不支持数据持久化,如果必须要做数据持久化,并且对延时要求非常高,可以使用 codis redis。数据量非常大,并且对延时要求不是特别高,可以选择 xcache。

2)redis 不要当 db 使用,如果数据一定要做持久化,可以选择 xcache

redis 当 db 使用,故障恢复数据很慢,严重影响 SLA。并且如果主从全部挂掉,slave 机器无法恢复时,数据就会完全丢失。xcache 天然支持数据持久化

3)不要使用客户端分片模式

客户端分片模式不具备高可用和弹性伸缩能力,建议使用真正的集群模式,如 codis-redis、云数据库 redis、xcache

4)集群模式不支持 lua、redisson 客户端,如果业务必须使用,只能选择 redis 主从模式

5)redis 单节点容量不要超过 10GB,xcache 单节点容量不要超过 200GB

redis 单节点容量太大时,实例重启会比较慢,影响恢复时长

2.2 键值设计规范

1)key 尽量保持简洁性、可读性、可管理性

在保证语义的前提下,控制 key 的长度;以业务名 (或数据库名) 为前缀 (防止 key 冲突),用冒号分隔,比如业务名:表名:id;不要包含特殊字符

2)拒绝 bigkey,防止网卡流量过高、慢查询

string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000

3)避免热点 key

热 key 会导致数据倾斜,以及单节点压力过大。建议业务侧将热 key 打散

4)控制 key 生命周期

缓存不是垃圾桶,最好对 key 都设置 ttl,并且将 key 的 ttl 打散,避免 key 集中过期

2.3 命令使用规范

1)慎用全量操作命令

禁用 `keys *` 命令,尽量不使用 hgetall、smembers 等命令。在获取 key 下的多个元素时,使用相应的 scan 命令,一次获取少量元素,分多次获取,建议一次 scan 不要超过 200 个

2)控制 mset、mget、hmset、hmget、*scan、*range 等命令单次操作元素数量,建议不要超过 200

3)控制 pipeline 中命令的数量,建议不要超过 100

4)redis 删除 key 时,不要用 del 命令,使用 unlink 命令

del 一个大 key 会直接导致 redis 卡住。使用 unlink 命令可以异步删除 key,不会对 redis 主线程产生影响,因此也不会影响业务流量

5)set 和 expire 命令合并成 setex 命令,减少服务端写压力

6)evalsha 代替 eval

redis-cluster 集群中使用 evalsha 代替 eval,减少网络 IO,同时也减小 redis 网络 IO 压力提高性能

2.4 业务缓存架构规范

1)redis 不要使用逻辑 db,只使用默认 db 0

可以通过实例隔离,不同业务的数据保存到不同的实例中。(只有 redis 主从可以选择逻辑 db,集群模式默认都使用 db0)

2)避免多业务复用同一缓存资源

不同业务的数据使用不同的集群,S 级应用不要和 B 级应用混用,过多业务复用同一资源要做拆分。业务尽量提供 rpc 接口给其它业务调用,而不是直接让其它业务访问数据源(如一个业务写,一个业务读)

3)xcache 尽量使用 string 类型

xcache 支持 string,hash,ehash,list,set,zset 六种数据类型,ehash 数据类型是对 hash 数据类型的扩展,支持对 field 设置过期时间。xcache 中 string 类型是速度最快的,其他数据类型都是由 string 进行组合变换而实现,六种数据的性能如下:

string > hash > set > ehash > list > zset

建议:尽量使用 string 类型

4)减少 lua 脚本使用

集群模式对 lua 支持有限制,必须保证 lua 中操作的 key 被 sharding 到同一个节点。所以尽量减少对 lua 的使用

5)lua 脚本中不跑复杂逻辑

复杂逻辑放在业务代码中,而不是 lua 脚本中

6)采用高效序列化方法和压缩方法

为了节省内存,如果 value 较大时,可以使用压缩工具(如 snappy 或 gzip),把数据压缩后再写入 redis

7)避免批量任务、定时任务、周期任务流量太大影响在线业务

批量任务、定时任务、周期任务业务上要做限速

8)业务变更,存储流量模型变化要先评估

业务模型变化,QPS、容量增加,O (N) 命令增多等都要先评估当前缓存是否抗的住,做到灰度上线,持续观察(尤其是流量高峰期)

9)不用的资源尽早申请回收

休眠资源回收不仅可以降低业务的存储成本,还可以把资源分配给真正需要的业务,可谓是双赢

补充:OpenAtom 开源大赛 Pika 赛题放出,奖金 50 万,请扫描如下二维码进行 报名

大家也可以添加 Pika 助手,加入 Pika 微信群,了解更多动态消息:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经销商沟通难题怎么破?破解之道看这里!

01 经销商:生产商的得力帮手,消费者的贴心管家 经销商是指在市场经济中,负责将生产商生产的产品或提供的服务转售给最终消费者的中间商。在现代商业环境中,经销商在产品分销链条中扮演着重要的角色,他们促进了产品的快…

Python 自然语言处理 文本分类 地铁方面留言文本

将关于地铁的留言文本进行自动分类。 不要着急,一步步来。 导入需要的库。 import numpy as np import pandas as pd import jieba # 分词 import re # 正则 from fnmatch import fnmatch # 通配符 from sklearn.preprocessing import LabelEncoder from sklearn…

数据分析面试题(2023.09.08)

数据分析流程 总体分为四层:需求层、数据层、分析层和结论层 一、统计学问题 1、贝叶斯公式复述并解释应用场景 公式:P(A|B) P(B|A)*P(A) / P(B)应用场景:如搜索query纠错,设A为正确的词,B为输入的词,那…

世和基因亮相2023服贸会,中国精准检测技术走向世界

9月6日,2023中国国际服务贸易交易会在北京圆满收官,本届服贸会围绕“开放引领发展,合作共赢未来”年度主题,吸引了全球领先的创新技术和科研成果亮相盛会,累计入场近28万人。 作为国内肿瘤精准医学头部企业&#xff0…

pdfjs在线预览组件的使用

前言 pdfjs在线预览组件。 原生浏览器预览pdf文件,存在pdf xss跨站攻击风险。推荐使用pdfjs第三方组件在线预览pdf文件。 如何使用 下载 官方插件下载地址:https://mozilla.github.io/pdf.js/getting_started/ 安装 把下载的文件复制到项目中 使用pd…

Docker详解,7分钟学会

大家好,欢迎来到停止重构的频道。 本期我们讨论docker。 docker的好处是可以隔离环境,多容器间环境隔离互不影响。 而且得益于优秀的镜像机制,可以用于手工快速部署。 我们按这样的顺序展开讨论: 1、 docker的工作原理 2、 …

jvm 程序计算器 程序计数器是否溢出 程序计数器是做什么的 java程序计数器会内存溢出吗 程序计数器作用与用处 jvm内存模型 jvm合集(一)

1. jvm内存模型: 内存模型: 程序计数器 堆 栈 本地方法栈 方法区 2. java代码编译为class文件,由类加载器加载到jvm,然后由解释器,jit即时编译到机器码,机器码再到cpu执行 3. 程序计数器: 是一块较小的内存…

Excel相关笔记

1、找出B列中A列没有的数据并放在C列 公式:IF(ISNA(VLOOKUP(B1,$A 1 : 1: 1:A$4,1,FALSE)),B1,“”)

索尼 toio™ 应用创意开发征文 | 如何用Python控制Q宝进行机器人擂台赛

你是否曾经想过,如果能用编程来控制真实的物体,那该有多有趣?如果能让一个小方块按照你的指令来移动、旋转、闪烁,那该有多酷?如果能让一个小方块和其他小方块互动,那该有多神奇?这些想法&#…

Jmeter系列-插件安装(5)

前言 jmeter4.0以上,如现在最新的5.2.1版本是有集成插件的只需要在官网下载 plugins-manager.jar 包,放在jmeter安装路径的lib/ext目录下即可使用:https://jmeter-plugins.org/install/Install/但并不能满足所有需求,仍然需要安装…

CSS读书笔记

——————————————精华部分—————————————— 1、选择器 (1)基本选择器: 标签选择器 body{} 类选择器 class .class名称{} ID选择器 id #id名称{} 优先级:ID选择器 > 类选择器 > 标签选择器 &am…

乐鑫 ESP-Mesh-Lite:轻松覆盖更大范围,连接更多设备

乐鑫科技 (688018.SH) 基于 Wi-Fi 协议推出了 Mesh 组网方案 ESP-Mesh-Lite,支持更多设备在更大范围内轻松联网。这一创新性的 Wi-Fi Mesh 技术通过构建灵活、可靠的物联网组网方案,使用户可以享受到快速、稳定且安全的 Wi-Fi 覆盖,不再受到设…

解耦只是一个巧合?

本文分享一篇在IJCAI2023看到的文章:Overlooked Implications of the Reconstruction Loss for VAE Disentanglement 首先回顾下VAE,其loss函数有两项,一项是重构误差,另一项是正则项: L r e c ( x , x ^ ) E q ϕ (…

GPU编程(基于Python和CUDA)(四)——Mandelbort集

系列文章目录 GPU编程(基于Python和CUDA)(一)——零基础安装pycuda GPU编程(基于Python和CUDA)(二)——显示GPU信息 GPU编程(基于Python和CUDA)(…

excel功能区(ribbonx)编程笔记--3 editbox与状态按钮togglebutton控件

从上次发布编程笔记2后,反响还不错,短短一个星期,访问量就达到了1500,说明虽然这个只是有写古老,但是再实际的工作中,excel的编程功能还是有或多人关注的,还不是很小众,比如我就是平时的统计就是使用excle,为了更好的实现自动统计,会添加部分vba代码到里面,就像我的…

直播|DITA内容发布工具解析 - 问答总结

9月6日,我们进行了一场名为“DITA内容发布工具解析”的直播。通过直播,大家了解到: DITA-OT简介 默认输出效果 定制以后输出效果 发布过程与样式定制 在问答环节,大家进行了热烈沟通。我将几个大家关心的问题和答复总结如下&…

图像文件的操作MATLAB基础函数使用

简介 MATLAB中的图像处理工具箱体统了一套全方位的标准算法和图形工具,用于进行图像处理、分析、可视化和算法开发。这里仅仅对常用的基础函数做个使用介绍。 查询图像文件的信息 使用如下函数 imfinfo(filename,fmt) 函数imfinfo返回一个结构体的info&#xff…

27.方向标

题目 描述 一位木匠收到了一个木制指示牌的订单。每块木板必须与前一块垂直对齐,要么与前一个箭头的基部对齐,要么与相反的一侧对齐,在那里用特制的螺钉固定。两块木板必须重叠。木匠将设计师发送的草图编码成了一个整数序列,但…

达梦数据库MAIN表空间导致磁盘满问题的处理和总结

前言 在达梦数据库使用中,建议对数据库表空间使用进行规划,业务用户创建单独的表空间使用。 如果不创建单独的用户表空间会遇到什么问题呢?通过下面的问题和测试说明合理的表空间规划是有必要的。 问题 某开发项目组使用DM8 1-2-192 版本。…