Redis(127)Redis的内部数据结构是什么?

作者:Victor356日期:2025/11/16

Redis 是一个高性能的内存数据库,其底层实现依赖于多种数据结构。这些数据结构不仅决定了 Redis 的高性能,也使得 Redis 在处理不同类型的数据时能够保持高效。下面详细介绍 Redis 的内部数据结构,并结合具体代码示例进行解释。

1. 字符串(String)

字符串是 Redis 中最基本的数据类型。它不仅可以存储文本,还可以存储二进制数据,如图像或序列化对象。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisStringExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            // 设置字符串键值
7            jedis.set("key", "value");
8            
9            // 获取字符串键值
10            String value = jedis.get("key");
11            System.out.println("Stored string in redis: " + value);
12        }
13    }
14}
15

2. 哈希(Hash)

哈希类型是一个键值对集合,类似于 Java 的 HashMap。哈希特别适合存储对象。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisHashExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String userKey = "user:1000";
7            
8            // 设置哈希字段
9            jedis.hset(userKey, "name", "John");
10            jedis.hset(userKey, "age", "30");
11            
12            // 获取哈希字段
13            String name = jedis.hget(userKey, "name");
14            String age = jedis.hget(userKey, "age");
15            
16            System.out.println("Name: " + name);
17            System.out.println("Age: " + age);
18        }
19    }
20}
21

3. 列表(List)

列表是一个有序的字符串列表,可以从列表的两端进行压入和弹出操作,类似于 LinkedList。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisListExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String listKey = "taskQueue";
7            
8            // 从列表左侧压入
9            jedis.lpush(listKey, "Task1", "Task2", "Task3");
10            
11            // 从列表右侧弹出
12            String task = jedis.rpop(listKey);
13            System.out.println("Popped task: " + task);
14            
15            // 获取列表所有元素
16            System.out.println("Remaining tasks: " + jedis.lrange(listKey, 0, -1));
17        }
18    }
19}
20

4. 集合(Set)

集合是一个无序的字符串集合,用于高效地进行添加、删除和查找操作。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisSetExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String setKey = "userRoles";
7            
8            // 添加集合元素
9            jedis.sadd(setKey, "admin", "editor", "viewer");
10            
11            // 获取集合所有元素
12            System.out.println("User roles: " + jedis.smembers(setKey));
13            
14            // 判断元素是否存在
15            boolean isAdmin = jedis.sismember(setKey, "admin");
16            System.out.println("Is admin: " + isAdmin);
17        }
18    }
19}
20

5. 有序集合(Sorted Set)

有序集合是一个带有分数的字符串集合,集合中的元素按分数进行排序,适用于实现排行榜等功能。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisSortedSetExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String sortedSetKey = "leaderboard";
7            
8            // 添加有序集合元素
9            jedis.zadd(sortedSetKey, 100, "user1");
10            jedis.zadd(sortedSetKey, 200, "user2");
11            jedis.zadd(sortedSetKey, 150, "user3");
12            
13            // 获取有序集合元素
14            System.out.println("Leaderboard: " + jedis.zrevrangeWithScores(sortedSetKey, 0, -1));
15        }
16    }
17}
18

6. 位图(Bitmap)

位图是一种特殊类型的字符串,可以对字符串中的单个位进行操作,适用于实现布隆过滤器等功能。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisBitmapExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String bitmapKey = "user:active";
7            
8            // 设置某个位为1
9            jedis.setbit(bitmapKey, 1, true);
10            jedis.setbit(bitmapKey, 3, true);
11            
12            // 获取某个位的值
13            boolean isActive = jedis.getbit(bitmapKey, 1);
14            System.out.println("User is active at position 1: " + isActive);
15            
16            // 统计位图中值为1的位数
17            long activeUserCount = jedis.bitcount(bitmapKey);
18            System.out.println("Active user count: " + activeUserCount);
19        }
20    }
21}
22

7. HyperLogLog

HyperLogLog 是一种用于基数估算的概率性数据结构,适用于大规模去重计数。

示例代码

1import redis.clients.jedis.Jedis;
2
3public class RedisHyperLogLogExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            String hllKey = "uniqueVisitors";
7            
8            // 添加元素
9            jedis.pfadd(hllKey, "user1", "user2", "user3", "user2");
10            
11            // 估算基数
12            long uniqueCount = jedis.pfcount(hllKey);
13            System.out.println("Unique visitors: " + uniqueCount);
14        }
15    }
16}
17

8. 流(Stream)

流是 Redis 5.0 引入的数据结构,适用于处理日志和消息队列。

示例代码

1import redis.clients.jedis.Jedis;
2import redis.clients.jedis.StreamEntryID;
3
4import java.util.HashMap;
5import java.util.Map;
6
7public class RedisStreamExample {
8    public static void main(String[] args) {
9        try (Jedis jedis = new Jedis("localhost", 6379)) {
10            String streamKey = "mystream";
11            
12            // 添加流元素
13            Map<String, String> entry = new HashMap<>();
14            entry.put("name", "Alice");
15            entry.put("message", "Hello, World!");
16            jedis.xadd(streamKey, StreamEntryID.NEW_ENTRY, entry);
17            
18            // 读取流元素
19            List<Map.Entry<String, List<StreamEntry>>> streamEntries = jedis.xread(StreamEntryID.UNRECEIVED_ENTRY, streamKey);
20            for (Map.Entry<String, List<StreamEntry>> streamEntry : streamEntries) {
21                System.out.println("Stream: " + streamEntry.getKey());
22                for (StreamEntry entry : streamEntry.getValue()) {
23                    System.out.println("Entry ID: " + entry.getID());
24                    System.out.println("Fields: " + entry.getFields());
25                }
26            }
27        }
28    }
29}
30

上述代码展示了 Redis 中几种主要数据结构的使用示例。每种数据结构都有其特定的用途和优势,可以根据具体需求选择合适的数据结构来实现高效的数据存储和操作。


Redis(127)Redis的内部数据结构是什么?》 是转载文章,点击查看原文


相关推荐


基于STM32与RS485总线的串口通信
listhi5202025/11/14

一、硬件架构设计 1. 硬件连接示意图 STM32(F103C8T6) MAX485芯片 LabVIEW PC - - USART1_TX → DI → RO (MAX485) USART1_RX ← RO → DI (MAX485) DE/RE → GPIOA.8 → DE/RE (控制) GND → GND 3.3V → VCC 2. 关键元器件选型 元件型号作用MCUSTM32F103C8T6主控芯片R


电脑硬盘数据恢复原理及核心技术解析
电脑小白技术2025/11/13

数据恢复技术的核心在于理解文件删除的底层逻辑。当文件被删除时,操作系统并未立即清除数据,而是将文件占用的空间标记为可覆盖。这意味着,只要这些空间未被新数据覆盖,文件就有机会被恢复。数据恢复技术通过扫描硬盘,寻找这些被标记为可覆盖但尚未被覆盖的数据块,从而实现文件的恢复。 在实际应用中,数据恢复技术已成功帮助无数人找回误删的重要文件。无论是个人用户还是企业,数据恢复技术都发挥着不可替代的作用。通过本文,我们将深入探讨数据恢复技术的原理、方法及其应用案例,带您了解这一神秘而实用的技术。 硬盘


AR眼镜基于上下文智能识别:电力运维高效规范操作应用方案|阿法龙XR云平台
北京阿法龙科技有限公司2025/11/12

传统电力运维依赖人工经验判断设备状态、查阅纸质、移动端手册,存在操作效率低、信息不对称、误操作风险高等痛点。随着AR技术与AI算法的融合升级,AR 眼镜已从被动显示提示向主动智能识别演进。依托AI图像识别、上下文语义理解技术,实现开关、仪表、设备状态的自动识别与精准交互,辅助运维人员规范操作流程、提升巡检效率,降低人为失误导致的安全风险。 AR终端采用轻量化AR眼镜,集成高清摄像头、麦克风,支持双手解放操作。本方案的算法核心包含设备识别模型(训练开关、仪表、互感器等电力设备特征库)、状态解析模


快速定位bug,编写测试用例
程序员小远2025/11/10

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快    作为一名测试人员如果连常见的系统问题都不知道如何分析,频繁将前端人员问题指派给后端人员,后端人员问题指派给前端人员,那么在团队里你在开发中的地位显而易见 ,口碑、升值、加薪那应该是你遥不可及的梦。 但是作为测试人员来说,尽管你不能深入的去分析问题,但是你能发现系统存在的问题,这点也是值得肯定的,所以继续加油! 所以今天给大家分享的主题是:"怎么快速定位bug" 一、定位问题的重要性 很多测试人员可能会说,我


编写微服务api
CV_J2025/11/8

1.创建实体类模块 2.导入lombok <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> 3.添加实体类 packag


使用CameraX 1.5进行高速拍摄和慢动作视频拍摄
稀有猿诉2025/11/5

本文译自「High-Speed Capture and Slow-Motion Video with CameraX 1.5」,原文链接android-developers.googleblog.com/2025/10/hig…,由Leo Huang发布于2025年10月28日。 清晰捕捉快速运动的画面是现代相机应用的关键特性。这可以通过高速拍摄来实现——即以 120 或 240 fps 等速率采集帧。这种高保真拍摄可用于两种截然不同的用途:创建高帧率视频以进行逐帧的详细分析,或生成慢动作视


MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统
罗西的思考2025/10/31

MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统 0x00 概要 0x01 Task和Event 1.1 可执行任务 1.2 事件 0x02 生成CUDA代码 2.1 生成代码 2.2 注册代码 2.3 获取代码 0x03 生成任务图 3.1 入口 3.2 runtime.cc主体 3.3 建立依赖关系 3.4 输出代码 0xFF 参考 0x00 概要 此处的”转译系统“包含两部分: 把计算图转换为任务图。 将 Mir


目标使用过期的TLS1.0 版协议
oneslide2025/10/29

文章目录 目标使用过期的TLS1.0 版协议详细描述解决办法启用测试办法注意事项 目标主机支持RSA密钥交换详细描述解决办法 目标使用过期的TLS1.0 版协议 详细描述 该插件连接到目标主机服务,检测到目标服务加密通信使用的SSL加密算法。 远程服务利用旧版 TLS 加密流量。 解决办法 启用 TLS 1.2 和/或 1.3 支持,禁用 TLS 1.0 支持 nginx样例配置如下: server { list


LabVIEW开发双光子成像
LabVIEW开发2025/10/26

双光子成像技术作为一种先进的光学成像手段,广泛应用于生物医学研究领域,尤其适用于活体细胞与组织的成像研究。LabVIEW软件在双光子成像系统中的应用,涵盖系统设计、数据采集、图像处理及用户界面开发等核心环节。 双光子原理 双光子成像技术基于双光子吸收效应:当两个光子近乎同时被荧光分子吸收时,可激发该分子产生荧光。该技术的核心优势在于能够实现深层组织的高分辨率成像 —— 较长波长的光在生物组织中散射程度更低,从而具备更强的组织穿透能力。 LabVIEW开发 在双光子成像系统中,La


有哪些开源项目提供即插即用的 qss 模板文件
hmoexyz2025/10/23

有哪些开源项目提供即插即用的 qss 模板文件 Qt 的 .qss(Qt Style Sheet)文件类似于 CSS,用于自定义 Qt 应用的界面样式。虽然 Qt 官方没有一个专门的 QSS 模板库,但社区中确实存在一些优秀的开源项目提供了丰富的 QSS 样式模板,可直接使用或作为参考。 以下是几个值得一看的开源项目或资源: 🎯 1. QtTheme 项目地址:https://github.com/hubenchang0515/QtTheme 简介:纯 qss 的 Qt 主题。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0