【面试场景题-Redis中String类型和map类型的区别】
今天在面试中碰到一个场景题:在 Redis 中存储 100 万用户数据时,使用 String 类型和 Hash(Map)类型的主要区别是什么?体现在以下几个方面:
1. 存储结构与内存占用
String 类型
- 存储方式:每个用户的每个字段单独存储为一个键值对。
例如:user:123:name→ “Alice”,user:123:age→ “30”。 - 内存开销:
- 每个键会产生额外的元数据(如 Redis 键对象、值对象、指针等),导致内存碎片化。
- 存储 100 万用户,若每个用户有 10 个字段,则会产生 1000 万个键,内存占用较高(尤其是元数据开销)。
Hash 类型
- 存储方式:每个用户的所有字段存储为一个 Hash 结构。
例如:user:123→{name: "Alice", age: "30"}。 - 内存优化:
- Redis 对 Hash 使用 ziplist 编码(当字段数 ≤
hash-max-ziplist-entries且字段值大小 ≤hash-max-ziplist-value时),内存更紧凑。 - 存储 100 万用户,每个用户有 10 个字段,仅需 100 万个键,元数据开销显著降低。
- Redis 对 Hash 使用 ziplist 编码(当字段数 ≤
结论:
Hash 类型在字段较少时内存占用更优(尤其启用 ziplist 时),而 String 类型因键数量爆炸会导致更高的内存消耗。
2. 操作效率
String 类型
- 读取/写入单个字段:
GET user:123:name或SET user:123:name "Alice",直接高效。 - 读取用户所有字段:
需要多次GET操作(或使用MGET管道),网络和 I/O 开销较大。 - 更新多个字段:
需多次SET,无法保证原子性。
Hash 类型
- 读取/写入单个字段:
HGET user:123 name或HSET user:123 name "Alice",效率与 String 接近。 - 读取用户所有字段:
通过HGETALL user:123单次操作获取全部字段,效率更高。 - 更新多个字段:
支持HMSET或HSET原子性操作多个字段。 - 批量操作:
天然支持批量字段操作(如HMGET、HMSET),减少网络开销。
结论:
Hash 类型在多字段读写、批量操作上更高效,适合需要频繁访问用户完整数据的场景。
3. 适用场景
String 类型的优势
- 独立过期时间:每个字段可单独设置过期时间(如缓存某些字段)。
- 简单值存储:适合存储无需结构化的独立数据(如计数器、缓存片段)。
- 大字段存储:单个字段值较大时(如 JSON 序列化字符串),直接读写更方便。
Hash 类型的优势
- 结构化数据:天然适合存储对象的多个属性。
- 内存敏感场景:字段数较少时,内存占用更低。
- 原子性操作:支持
HINCRBY、HMSET等原子操作,适合需要事务性的场景。
4. 其他注意事项
- 序列化开销:
- 若使用 String 存储序列化后的 JSON 对象,修改单个字段需反序列化→修改→再序列化,而 Hash 可直接修改字段。
- 集群模式:
- 在 Redis 集群中,Hash 的所有字段属于同一个分片,而多个 String 键可能分布在不同的分片,影响事务和管道操作。
- 过期时间:
- Hash 只能对整个键设置过期时间,而 String 可对每个字段单独设置。
总结建议
- 优先使用 Hash 类型:
如果用户数据字段较多(如 10-100 个)、需要频繁读取完整数据或批量操作字段,Hash 类型在内存和性能上更优。 - 考虑 String 类型:
如果字段需要独立过期、字段值较大(如长文本),或字段数极少(如仅 1-2 个),String 类型更灵活。
根据实际业务场景选择合适的数据结构,可显著优化 Redis 的性能和资源利用率。
相关文章:
【面试场景题-Redis中String类型和map类型的区别】
今天在面试中碰到一个场景题:在 Redis 中存储 100 万用户数据时,使用 String 类型和 Hash(Map)类型的主要区别是什么?体现在以下几个方面: 1. 存储结构与内存占用 String 类型 存储方式:每个用…...
List附加对象
List里面的某个对象需要修改,赋值 可以使用ALL或者ForEach,All的话,不能直接使用赋值对象只能赋值对象的某个字段 static void Main(string[] args){List<UserData> UserDatas new List<UserData>{new UserData { Id 1, Name …...
VLLM专题(三十六)—自动前缀缓存
PagedAttention 的核心思想是将每个请求的 KV 缓存划分为 KV 块。每个块包含固定数量的标记(tokens)对应的注意力键(keys)和值(values)。PagedAttention 算法允许将这些块存储在非连续的物理内存中,从而通过按需分配内存来消除内存碎片。 为了自动缓存 KV 缓存,我们利…...
相机光学(四十七)——相纸材质
1. 光面相纸 光面相纸表面光滑,亮度高,反光性好,能够呈现出清晰、鲜艳的图像效果,适合用于表现色彩艳丽、反差要求较高的题材,如产品照、艺术照和风景照。然而,这种相纸容易沾上指纹和灰尘。 2. 绒面相纸…...
数据表100多字段如何写mapper文件的xml
编写一个包含100多个字段的插入语句通常涉及到使用<mapper>标签来定义映射规则,特别是在使用MyBatis这样的持久层框架时。 1. 定义<mapper>命名空间 order表 <mapper namespace"com.example.mapper.orderMapper"><!-- 插入语句 --…...
只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
当消费电子领域普遍追求“更轻更薄”的设计美学时,遨游三防平板不止于此,还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中,三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足,常因环境…...
拉取镜像太慢?一文解决!
# 拉取 Docker 镜像太慢?一文解决!🚀在国内使用 Docker 拉取镜像时,可能会遇到速度慢甚至失败的情况。别担心!本文带你快速优化 Docker 拉取方法!🔥01 | 确保 Docker Hub 登录认证 🔐…...
基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析
作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…...
(分块)洛谷 P2801 教主的魔法 题解
之前学过 莫队 算法,其运用了分块思想;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a(一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai∈[1,1000])。要求执行 q q q 次操作&…...
[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)
[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_{i} Di 个单位时间,即它最早可以于 T i T_{i} Ti 时刻…...
信创系统极速文件查找:locate 命令详解
原文链接:信创系统极速文件查找:locate 命令详解 Hello,大家好啊!今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统(如 统信 UOS、麒麟 KOS)中,查找…...
C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)
C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原) 文章目录 C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…...
PostgreSQL:语言基础与数据库操作
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
蓝桥杯学习——二叉树+奇点杯题目解析
基础认知 一、二叉树种类: 1.满二叉树。记深度k,节点数量2^k-1。 2.完全二叉树:除了底层,其余全满,底部从左到右连续。 3,平衡二叉搜索树:左子树和右子树高度差不大于1。 二、存储方式&…...
基于django+vue的购物商城系统
开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…...
AI安全、大模型安全研究(DeepSeek)
DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…...
卷积神经网络 - 汇聚层
卷积神经网络一般由卷积层、汇聚层和全连接层构成,本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进 行特征选择,降低特征数量,从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…...
蓝桥杯备赛-贪心-管道
问题描述 有一根长度为 lenlen 的横向的管道,该管道按照单位长度分为 lenlen 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的,位于 LiLi 的阀门会在 SiSi 时刻打开,并不断让水流入管道。 对…...
论文分享:PL-ALF框架实现无人机低纹理环境自主飞行
在室内仓库、地下隧道等低纹理复杂场景中,无人机依赖视觉传感器进行自主飞行时,往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题,重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架:…...
Nodejs使用redis
框架:koa,通过koa-generator创建 redis: 本地搭建,使用默认帐号,安装说明地址以及默认启动设置:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中间件&#x…...
GitHub 超火的开源终端工具——Warp
Warp 作为近年来 GitHub 上备受瞩目的开源终端工具,以其智能化、高性能和协作能力重新定义了命令行操作体验。以下从多个维度深入解析其核心特性、技术架构、用户评价及生态影响力: 一、背景与核心团队 Warp 由前 GitHub CTO Jason Warner 和 Google 前…...
计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?
时下,计算机视觉深度学习正在重塑美颜技术,通过智能人脸检测、AI滤镜、深度美肤、实时优化等方式,让美颜效果更加自然、精准、个性化。 那么,美颜SDK如何结合深度学习来优化美颜和滤镜功能?本文将深入解析AI在美颜技术…...
应用商店上新:Couchbase Enterprise Server集群
可移植的冗余数据平台,这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 Couchbase是一种高性能NoSQL数据库,专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…...
Redis解决缓存击穿问题——两种方法
目录 引言 解决办法 互斥锁(强一致,性能差) 逻辑过期(高可用,性能优) 设计逻辑过期时间 引言 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对…...
前端 Blob 详解
前端 Blob 详解 1. 什么是 Blob? Blob(Binary Large Object)表示二进制大对象,用于存储二进制数据。在前端开发中,Blob 常用于处理文件、图像、视频等二进制数据。 2. 创建 Blob 可以通过 Blob 构造函数创建 Blob …...
Debezium + Kafka-connect 实现Postgres实时同步Hologres
基于 Debezium Kafka 的方案实现 PostgreSQL 到 Hologres 的实时数据同步,是一种高可靠性、高扩展性的解决方案。以下是详细的实现步骤: 1. 方案架构 Debezium:捕获 PostgreSQL 的变更数据(CDC),并将变更…...
JavaScript性能优化的12种方式
当涉及到JavaScript性能优化时,有几个关键的方面需要考虑。下面是一些常见的JavaScript性能优化技巧和实践: 减少DOM操作: 频繁的DOM操作会导致重绘和重新布局,影响性能。建议将多个DOM操作合并为一个操作,或者使用Do…...
在Ubuntu上安装MEAN Stack的4个步骤
在Ubuntu上安装MEAN Stack的4个步骤为:1.安装MEAN;2.安装MongoDB;3.安装NodeJS,Git和NPM;4.安装剩余的依赖项。 什么是MEAN Stack? 平均堆栈一直在很大程度上升高为基于稳健的基于JavaScript的开发堆栈。…...
集成学习之随机森林
目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。(基学习器是分类模型) 2、回归问题集成。(基学习器是回归模型) 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…...
