当前位置: 首页 > news >正文

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(1)存在性检查标签系统
ZSetziplist/skiplist2^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.4MB122KB95%
100万240MB12MB95%

2.2 HyperLogLog基数统计

误差率测试数据

数据规模HLL内存占用实际误差率计算速度
1万UV12KB0.81%0.2ms
千万UV12KB0.61%0.3ms

实战限制

  • 单个HLL的计数上限为18,446,744,073,709,551,616
  • 不支持删除单个元素

三、底层编码机制揭秘

3.1 编码自动转换阈值

数据类型编码类型转换条件内存优化效果
Hashziplistfield数量 ≤ 512 且值大小 ≤ 64B节省40%空间
ZSetziplist元素数量 ≤ 128 且值大小 ≤ 64B节省35%空间
Listquicklist单个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 StreamKafka
吞吐量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 常见设计误区

  1. 滥用String存储JSON
    ❌ 问题:修改部分字段需要全量读写
    ✅ 方案:使用Hash存储对象字段

  2. 用List实现消息队列
    ❌ 问题:缺乏消费确认机制
    ✅ 方案:迁移到Stream类型

  3. ZSet存储超大集合
    ❌ 问题:超过10万成员时性能骤降
    ✅ 方案:拆分多个ZSet+分片查询

5.2 性能陷阱检测

# 慢查询监控
SLOWLOG GET 10  # 获取最近10条慢查询# 大Key扫描
redis-cli --bigkeys --memkeys

六、最佳实践指南

6.1 内存优化组合拳

  1. 压缩神器

    • 对长文本使用LZ4压缩算法
    • Hash字段采用msgpack序列化
  2. 过期策略

config set maxmemory 4gb
config set maxmemory-policy allkeys-lfu
  1. 分片方案

    # 一致性哈希分片示例
    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数据类型的正确选择需要综合考量:

  1. 数据特征:读写模式、生命周期、关联关系
  2. 性能要求:吞吐量、延迟敏感性、一致性级别
  3. 资源约束:内存容量、网络带宽、持久化成本

建议在开发阶段使用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 是一个自由奔放的艺术家&#xff0c;它在创作&#xff08;编写代码&#xff09;时不受太多约束&#xff0c;非常灵活&#xff0c;但有时也容易犯错且难以调试。而 TypeScript 就像是给这位艺术家配备了一套精确的工具和规范…...

flink-cdc同步数据到doris中

1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题&#xff0c;因为后面发现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 负载均衡器配置及常见问题解析

引言 在云原生时代&#xff0c;Kubernetes 已经成为容器编排的事实标准。AWS EKS (Elastic Kubernetes Service) 作为一项完全托管的 Kubernetes 服务&#xff0c;简化了在 AWS 上运行 Kubernetes 的复杂性。Istio 作为服务网格领域的佼佼者&#xff0c;为微服务提供了流量管理…...

Golang教程

1. go 环境与命令 1.1 go 环境搭建 SDK 安装 Go 官网&#xff1a;golang.orgGo 中文社区&#xff1a;https://studygolang.com/dlGo API文档&#xff1a;https/golang.org 或 https://studygolang.com/pkgdoc 目录 api &#xff1a;api 存放bin&#xff1a;go命令src&#…...

AI 百炼成神:线性回归,预测房价

我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...

企业软件合规性管理:构建高效、安全的软件资产生态

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

每日一题——编辑距离

编辑距离 参考资料题目描述示例 解题思路动态规划&#xff08;DP&#xff09;方法 代码实现复杂度分析示例详解示例1&#xff1a;"nowcoder" → "new"示例2&#xff1a;"intention" → "execution" 总结与心得 参考资料 建议先参考下…...

TensorFlow项目GPU运行 安装步骤

以下是在 Linux 系统 下搭建完整 GPU 加速环境的详细流程&#xff08;适配 CUDA 11.2 和 Python 3.9&#xff09;&#xff1a; 1. 前置检查 1.1 验证 NVIDIA 驱动 # 检查驱动版本&#xff08;需 ≥ 450.80.02&#xff09; nvidia-smi 输出示例&#xff1a; CUDA Version: 11.2…...

c++进阶———继承

1.引言 在一些大的项目中&#xff0c;我们可能要重复定义一些类&#xff0c;但是很麻烦&#xff0c;应该怎么办呢&#xff1f;举个简单的例子&#xff0c;我要做一个全校师生统计表&#xff0c;统计学号&#xff0c;教师编号&#xff0c;姓名&#xff0c;年龄&#xff0c;电话…...

FreeSwitch的mod_translate模块详细,附带场景案例及代码示例

mod_translate 模块详细介绍 mod_translate 是 FreeSWITCH 中的一个拨号计划应用程序模块&#xff0c;用于对电话号码或字符串进行格式转换和翻译。它可以根据预定义的规则对输入的内容进行匹配和转换&#xff0c;常用于号码格式化、路由选择、号码屏蔽等场景。 主要功能 号码…...

前端504错误分析

前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...

在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证

文章目录 一、引言二、什么是 JSON Web 令牌&#xff1f;三、什么是 JSON Web 令牌结构&#xff1f;四、设置 JWT 令牌身份验证4.1 创建新的 .NET 8 Web API 项目4.2 安装所需的 NuGet 软件包4.3 创建 JWT 配置模型4.4 将 JWT 配置添加到您的 appsettings.json 中4.5 为 Config…...

基于python实现机器学习的心脏病预测系统

以下是一个基于 Python 实现的简单心脏病预测系统代码示例&#xff0c;我们将使用 Scikit - learn 库中的机器学习算法&#xff08;这里以逻辑回归为例&#xff09;&#xff0c;并使用公开的心脏病数据集。 步骤&#xff1a; 数据加载与预处理&#xff1a;加载心脏病数据集&a…...

使用 NVM 随意切换 Node.js 版本

安装nvm https://github.com/coreybutler/nvm-windows/releases nvm安装详细教程&#xff08;卸载旧的nodejs&#xff0c;安装nvm、node、npm、cnpm、yarn及环境变量配置&#xff09;-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. 通配选择器 作用&#xff1a;可以选中所有的 HTML 元素。 语法&#xff1a; * { 属性名: 属性值; } 举例&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" …...

idea-代码补全快捷键

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

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...