Redis数据结构(选型)

本文介绍了Redis中五种主要数据结构(String、Set、List、Hash、SortedSet)的特点,并结合实际案例探讨了它们在广告系统中的具体应用场景。作者还分享了选择合适的数据结构时需要考虑的因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者: 码蹄疾
毕业于哈尔滨工业大学。 小米广告第三代广告引擎的设计者、开发者;
负责小米应用商店、日历、开屏广告业务线研发;
主导小米广告引擎多个模块重构;
关注推荐、搜索、广告领域相关知识;

redis数据结构

String

String
这应该是应用最广泛的了,简单的 key-value 类型。value 不仅可以是 String,也可以是数字。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。

Set

Set

利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。Redis 非常人性化的为集合提供了求交集、并集、差集等操作。

Set 和 String 是在广告系统中使用最广泛的redis数据结构。

List

List

Hash

Hash

Sorted Set

和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

数据结构选型

一定要Set吗?

网上的文章讲到这里的时候都会说Redis的Set提供了一些方便的交集、并集、差集的操作。但是实际上我们在生产环境的时候不会用这些操作,数据库一般是系统压垮的最后一根稻草,如果数据库垮了,基本就是系统GG了。补救办法基本没有。所以,选型的时候能让服务器做的,就不会让数据库做,所以交集、并集、差集这些操作会放在服务器的内部逻辑去做。如果服务器撑不住,大不了就加机子嘛。

Set vs String

我们系统中,大多数时候是用key/value的结构。从某种意义上他们两个在逻辑上可以实现等价。

1. key -> "value1,value2,value3,value4"
2. key -> Set(value1,value2,value3,value4)

第一种我们直接用string,只不过value的获取完我们自己分割。用哪种还是看你们的业务场景。Set的缺点是比string占用更多的空间;优点是天然的是value之间是不会重复的。
1. 我们线上系统用户已经安装的app是多个地方上报的,我们就用Set去存储,每次上报就直接更新就可以,如果这时候我们用的是String就不太适合,因为要读一次redis,做一次去重,再写入;
2. 我们线上使用的已经曝光的广告不想让用户看到这个功能我们就用的是String,因为我们每次下发的广告已经从逻辑上保证了不是重复的.

热门阅读

<think>嗯,用户这次直接提出了关于Redis数据迁移的具体需求,包括方法、工具和教程。结合用户提供的四份引用材料,可以清晰地看到用户需要的是系统化的迁移方案对比和实操指导。用户应该是个运维工程师或者后端开发者,正在面临实际的Redis迁移需求。从引用材料来看,redis-shake和redis-migrate-tool是重点推荐的两种工具。用户引用[3]里的竞品对比非常关键,这张对比表正好能解决用户的工具选型困惑。注意到用户引用的教程提到“不停机迁移”,这暗示用户可能在生产环境操作,对业务连续性要求较高。需要重点突出四个核心工具的区别点:redis-shake的优势在于支持增量迁移和数据校验,redis-migrate-tool强在多线程速度,而Redis原生复制适合主从架构。用户引用的脚本方法(db10到db0那个)虽然给出代码但明确标注“性能差”,这个细节很重要,要在回答中强调其局限。用户提到的“方法四”主从同步迁移其实暗藏版本陷阱,引用[3]明确指出官方主从同步要求同版本,这点必须作为重要提醒。教程部分应该包含两个层面:工具操作流程(如redis-shake配置文件模板)和通用注意事项(比如大key预处理)。补充一点引用材料没提到的:当遇到Tair模块时,要特别说明redis-shake的兼容性优势(引用[2]提到支持TairString等模块)。最后关于监控的建议来自引用[3]的Prometheus集成项,这对生产环境很重要。</think> 以下是Redis数据迁移的完整方案,综合工具选型、操作步骤和关键注意事项: --- ### **一、主流迁移工具对比** 根据引用[3]的竞品分析,核心工具特性如下: | **工具** | 迁移模式 | 集群支持 | 数据校验 | 断点续传 | 适用场景 | |------------------------|--------------|----------|----------|----------|--------------------------| | **redis-shake** (阿里) | 全量+增量 | ✅ 自动槽位 | ✅ MD5 | ✅ | 跨版本迁移/云服务迁移 | | **redis-migrate-tool** | 全量 | ✅ 需手动分片 | ❌ | ❌ | 大规模集群快速迁移 | | **Redis Replication** | 实时增量同步 | ✅ | ❌ | ✅ | 同版本主从架构迁移 | --- ### **二、迁移方法详解** #### **1. redis-shake操作流程**(引用[2][4]) ```bash # 下载编译(需Go环境) git clone https://gitcode.com/gh_mirrors/re/redis-migrate-tool cd redis-shake && make # 配置文件模板(sync_mode=sync实现增量) vim redis-shake.conf source.address = "旧Redis_IP:6379" target.address = "新Redis_IP:6379" sync_mode = "sync" # 全量+增量模式 # 启动迁移 ./redis-shake -conf redis-shake.conf ``` **优势**:支持跨云迁移(阿里云/AWS等)、数据过滤脚本、Prometheus监控集成 #### **2. 原生主从同步**(引用[4]) ```shell # 在新节点执行(需版本一致) redis-cli -h 新节点IP > SLAVEOF 旧节点IP 6379 # 建立主从 > INFO replication # 确认同步状态 > SLAVEOF NO ONE # 完成后解耦 ``` **注意**:迁移期间旧节点需开启持久化,避免重启导致数据丢失 #### **3. 脚本迁移**(仅小规模数据) 引用[4]提供的Python脚本**局限性**: - 单线程性能差(10万key迁移约需5分钟) - 不支持复杂数据类型(Stream/Geo等) - 无重试机制(网络波动导致中断) --- ### **三、关键实践建议** 1. **版本兼容性**(引用[2][3]) - redis-shake支持Redis 2.8~7.2,推荐优先使用 - 主从同步要求主从节点版本完全一致 2. **集群迁移策略** - **分片迁移**:使用`redis-migrate-tool`时手动计算slot分布(引用[3]) - **槽位校验**:迁移后执行`redis-cli --cluster check 新节点IP`验证数据完整性 3. **业务影响最小化** - 增量同步时源库建议开启`client-output-buffer-limit`避免缓冲区溢出 - 在业务低峰期触发全量同步(RDB生成过程可能阻塞主线程) 4. **迁移后验证** ```shell # 抽样对比key数量 redis-cli -h 旧节点 dbsize redis-cli -h 新节点 dbsize # 使用redis-full-check校验差异(阿里开源工具) ./redis-full-check -s 旧IP -t 新IP --parallel=4 ``` --- ### **四、典型问题解决方案** - **迁移中断**:redis-shake自动记录`sync_checkpoint.file`恢复位置(引用[3]) - **大Key阻塞**:提前用`redis-cli --bigkeys`扫描并拆分(如Hash超过10MB) - **云服务限制**:阿里云Tair实例需开通白名单IP访问(引用[2]) > 迁移前务必**备份源库数据**:`redis-cli SAVE`或配置`bgsave` --- ### 📚 相关问题 1. Redis 6.0多线程对迁移工具有性能提升吗? 2. 迁移过程中如何监控Redis内存和QPS波动? 3. 跨地域迁移遇到高延迟该如何优化? 4. Tair模块的自定义数据结构迁移需要特殊处理吗? 5. 迁移失败回滚的标准操作流程是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值