Redis数据类型全景解析:从底层编码到应用反模式
一、核心数据类型矩阵
1.1 基础类型对比表
类型 | 底层结构 | 最大容量 | 时间复杂度 | 典型场景 |
---|---|---|---|---|
String | SDS/Embstr/Raw | 512MB | O(1)读写 | 缓存/计数器 |
List | QuickList(ziplist) | 2^32-1元素 | 头尾操作O(1) | 消息队列 |
Hash | ziplist/hashtable | 2^32-1键值对 | O(1)平均 | 对象存储 |
Set | intset/hashtable | 2^32-1成员 | O(1)存在性检查 | 标签系统 |
ZSet | ziplist/skiplist | 2^32-1元素 | O(logN)查询 | 排行榜 |
二、扩展类型实战解析
2.1 Bitmap位图运算
存储优化技巧:
# 用户签到系统示例
SETBIT user:10001:202310 5 1 # 第5天签到
BITCOUNT user:10001:202310 # 当月签到总数
BITOP OR total_sign 202310_* # 合并多用户签到状态
空间节省对比:
用户量 | 传统DB存储 | Bitmap存储 | 压缩率 |
---|---|---|---|
1万用户 | 2.4MB | 122KB | 95% |
100万 | 240MB | 12MB | 95% |
2.2 HyperLogLog基数统计
误差率测试数据:
数据规模 | HLL内存占用 | 实际误差率 | 计算速度 |
---|---|---|---|
1万UV | 12KB | 0.81% | 0.2ms |
千万UV | 12KB | 0.61% | 0.3ms |
实战限制:
- 单个HLL的计数上限为18,446,744,073,709,551,616
- 不支持删除单个元素
三、底层编码机制揭秘
3.1 编码自动转换阈值
数据类型 | 编码类型 | 转换条件 | 内存优化效果 |
---|---|---|---|
Hash | ziplist | field数量 ≤ 512 且值大小 ≤ 64B | 节省40%空间 |
ZSet | ziplist | 元素数量 ≤ 128 且值大小 ≤ 64B | 节省35%空间 |
List | quicklist | 单个ziplist节点 ≤ 8KB | 平衡读写效率 |
配置建议:
# redis.conf 调优示例
hash-max-ziplist-entries 1024 # 适当放宽限制
zset-max-ziplist-value 128 # 根据值长度调整
3.2 内存碎片优化策略
# 内存碎片率计算
mem_fragmentation_ratio = used_memory_rss / used_memoryif ratio > 1.5:执行MEMORY PURGE # 主动清理碎片
elif ratio < 1:触发swap风险警报
四、高阶类型应用场景
4.1 Stream消息队列设计
与Kafka对比:
特性 | Redis Stream | Kafka |
---|---|---|
吞吐量 | 10万/秒 | 百万/秒 |
持久化 | RDB/AOF | 分区副本 |
消费者组 | 原生支持 | 原生支持 |
回溯消费 | 支持 | 支持 |
典型应用 | 实时通知 | 日志收集 |
ACK机制示例:
XADD orders * product "iPhone15" price 7999
XGROUP CREATE orders group1 $
XREADGROUP GROUP group1 consumer1 COUNT 1 STREAMS orders >
4.2 GEO地理位置查询
精度测试数据:
GEOHASH长度 | 精度范围 | 适用场景 |
---|---|---|
6位 | ±0.61km | 城市级服务 |
8位 | ±19m | 商圈推荐 |
10位 | ±0.6m | 精准导航 |
复合查询示例:
GEORADIUSBYMEMBER users:geo "user123" 5 km ASC COUNT 10
WITHCOORD WITHDIST WITHHASH
五、数据类型选择反模式
5.1 常见设计误区
-
滥用String存储JSON
❌ 问题:修改部分字段需要全量读写
✅ 方案:使用Hash存储对象字段 -
用List实现消息队列
❌ 问题:缺乏消费确认机制
✅ 方案:迁移到Stream类型 -
ZSet存储超大集合
❌ 问题:超过10万成员时性能骤降
✅ 方案:拆分多个ZSet+分片查询
5.2 性能陷阱检测
# 慢查询监控
SLOWLOG GET 10 # 获取最近10条慢查询# 大Key扫描
redis-cli --bigkeys --memkeys
六、最佳实践指南
6.1 内存优化组合拳
-
压缩神器:
- 对长文本使用
LZ4
压缩算法 - Hash字段采用
msgpack
序列化
- 对长文本使用
-
过期策略:
config set maxmemory 4gb
config set maxmemory-policy allkeys-lfu
-
分片方案:
# 一致性哈希分片示例 def get_shard(key):crc = binascii.crc32(key.encode()) & 0xffffffffreturn crc % 1024 # 分为1024个slot
6.2 监控指标看板
指标名称 | 健康阈值 | 告警触发条件 |
---|---|---|
内存使用率 | <70% | >85%持续5分钟 |
命令每秒操作数 | <5000 | >10000持续10秒 |
连接数 | <1000 | >2000 |
网络输入流量 | <50MB/s | >100MB/s持续1分钟 |
结语
Redis数据类型的正确选择需要综合考量:
- 数据特征:读写模式、生命周期、关联关系
- 性能要求:吞吐量、延迟敏感性、一致性级别
- 资源约束:内存容量、网络带宽、持久化成本
建议在开发阶段使用OBJECT ENCODING key
命令验证底层编码,通过MEMORY USAGE
分析存储效率。记住:没有最好的数据类型,只有最适合业务场景的设计方案。
相关文章:
Redis数据类型全景解析:从底层编码到应用反模式
一、核心数据类型矩阵 1.1 基础类型对比表 类型底层结构最大容量时间复杂度典型场景StringSDS/Embstr/Raw512MBO(1)读写缓存/计数器ListQuickList(ziplist)2^32-1元素头尾操作O(1)消息队列Hashziplist/hashtable2^32-1键值对O(1)平均对象存储Setintset/hashtable2^32-1成员O(…...

(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...
TypeScript跟js,es6这些的区别
TypeScript 一、TypeScript 是什么 想象 JavaScript 是一个自由奔放的艺术家,它在创作(编写代码)时不受太多约束,非常灵活,但有时也容易犯错且难以调试。而 TypeScript 就像是给这位艺术家配备了一套精确的工具和规范…...

flink-cdc同步数据到doris中
1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题,因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…...

Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
引言 在云原生时代,Kubernetes 已经成为容器编排的事实标准。AWS EKS (Elastic Kubernetes Service) 作为一项完全托管的 Kubernetes 服务,简化了在 AWS 上运行 Kubernetes 的复杂性。Istio 作为服务网格领域的佼佼者,为微服务提供了流量管理…...
Golang教程
1. go 环境与命令 1.1 go 环境搭建 SDK 安装 Go 官网:golang.orgGo 中文社区:https://studygolang.com/dlGo API文档:https/golang.org 或 https://studygolang.com/pkgdoc 目录 api :api 存放bin:go命令src&#…...
AI 百炼成神:线性回归,预测房价
我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...

企业软件合规性管理:构建高效、安全的软件资产生态
引言 在数字化转型的浪潮下,企业的软件使用方式日益多元化,涉及云端、订阅制、永久授权及浮动许可等多种模式。然而,随着软件资产的增多,企业面临着合规性管理的严峻挑战:非法软件使用、许可证管理不当、软件资产闲置…...

每日一题——编辑距离
编辑距离 参考资料题目描述示例 解题思路动态规划(DP)方法 代码实现复杂度分析示例详解示例1:"nowcoder" → "new"示例2:"intention" → "execution" 总结与心得 参考资料 建议先参考下…...
TensorFlow项目GPU运行 安装步骤
以下是在 Linux 系统 下搭建完整 GPU 加速环境的详细流程(适配 CUDA 11.2 和 Python 3.9): 1. 前置检查 1.1 验证 NVIDIA 驱动 # 检查驱动版本(需 ≥ 450.80.02) nvidia-smi 输出示例: CUDA Version: 11.2…...

c++进阶———继承
1.引言 在一些大的项目中,我们可能要重复定义一些类,但是很麻烦,应该怎么办呢?举个简单的例子,我要做一个全校师生统计表,统计学号,教师编号,姓名,年龄,电话…...
FreeSwitch的mod_translate模块详细,附带场景案例及代码示例
mod_translate 模块详细介绍 mod_translate 是 FreeSWITCH 中的一个拨号计划应用程序模块,用于对电话号码或字符串进行格式转换和翻译。它可以根据预定义的规则对输入的内容进行匹配和转换,常用于号码格式化、路由选择、号码屏蔽等场景。 主要功能 号码…...
前端504错误分析
前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...

在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证
文章目录 一、引言二、什么是 JSON Web 令牌?三、什么是 JSON Web 令牌结构?四、设置 JWT 令牌身份验证4.1 创建新的 .NET 8 Web API 项目4.2 安装所需的 NuGet 软件包4.3 创建 JWT 配置模型4.4 将 JWT 配置添加到您的 appsettings.json 中4.5 为 Config…...
基于python实现机器学习的心脏病预测系统
以下是一个基于 Python 实现的简单心脏病预测系统代码示例,我们将使用 Scikit - learn 库中的机器学习算法(这里以逻辑回归为例),并使用公开的心脏病数据集。 步骤: 数据加载与预处理:加载心脏病数据集&a…...
使用 NVM 随意切换 Node.js 版本
安装nvm https://github.com/coreybutler/nvm-windows/releases nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)-CSDN博客 验证 NVM 是否安装成功-查看版本 nvm --version安装指定版本的 Node.js nvm i…...

【Prometheus】prometheus结合pushgateway实现脚本运行状态监控
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
SpringBoot 项目配置动态数据源
目录 一、前言二、操作1、引入依赖2、配置默认数据库 13、定义数据源实体和 Repository4、定义动态数据源5、配置数据源6、定义切换数据源注解7、定义切面类8、使用注解切换数据源 一、前言 通过切面注解方式根据不同业务动态切换数据库 二、操作 1、引入依赖 <dependen…...

CSS基本选择器
1. 通配选择器 作用:可以选中所有的 HTML 元素。 语法: * { 属性名: 属性值; } 举例: <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" …...

idea-代码补全快捷键
文章目录 前言idea-代码补全快捷键1. 基本补全2. 类型匹配补全3. 后缀补全4. 代码补全 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差,…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...