Redis中的数据结构详解

文章目录

  • Redis中的数据结构详解
    • 一、引言
    • 二、Redis 数据结构
      • 1、String(字符串)
        • 1.1、代码示例
      • 2、List(列表)
        • 2.1、代码示例
      • 3、Set(集合)
        • 3.1、代码示例
      • 4、Hash(散列)
        • 4.1、代码示例
      • 5、ZSet(有序集合)
        • 5.1、代码示例
    • 三、使用示例
      • 1. 缓存用户会话
      • 2. 实现实时排行榜
      • 3. 消息队列实现
      • 4. 去重和计数
      • 5. 购物车实现
    • 四、总结

Redis中的数据结构详解

一、引言

Redis 是一个开源的高性能键值对数据库,它支持多种类型的数据结构,如字符串、列表、集合、散列和有序集合等。这些数据结构使得 Redis 不仅可以用来缓存数据,还可以用来实现消息队列、排行榜、实时分析等功能。本文将详细介绍 Redis 中的这些数据结构及其使用场景和代码示例。

二、Redis 数据结构

在这里插入图片描述
在这里插入图片描述

1、String(字符串)

字符串是 Redis 中最基本的数据结构,它可以存储任何类型的数据,如文本、图片、序列化对象等。Redis 内部使用简单动态字符串(SDS)来实现字符串,相比于 C 语言的原生字符串,SDS 提供了更好的性能和安全性。

1.1、代码示例
// 设置字符串值
jedis.set("name", "Kimi");
// 获取字符串值
String name = jedis.get("name");
System.out.println(name);
// 增加整数的值
jedis.incr("age");
System.out.println(jedis.get("age"));

2、List(列表)

列表是 Redis 提供的有序集合,可以存储多个字符串元素,支持在两端添加或移除元素。列表的底层实现可以是双向链表、压缩列表或快速列表。

2.1、代码示例
// 将元素添加到列表左侧
jedis.lpush("java-frameworks", "Spring");
// 获取列表中的所有元素
List<String> frameworks = jedis.lrange("java-frameworks", 0, -1);
System.out.println(frameworks);

3、Set(集合)

集合是 Redis 提供的无序集合,可以存储多个不重复的字符串元素。集合的底层实现可以是压缩列表或整数集合。

3.1、代码示例
// 向集合中添加元素
jedis.sadd("developers", "Alice", "Bob");
// 获取集合中的所有元素
Set<String> developers = jedis.smembers("developers");
System.out.println(developers);

4、Hash(散列)

散列是 Redis 提供的键值对集合,可以存储多个字段值对。散列的底层实现可以是哈希表、压缩列表。

4.1、代码示例
// 向散列中添加字段值对
Map<String, String> user = new HashMap<>();
user.put("name", "Kimi");
user.put("age", "30");
jedis.hmset("user", user);
// 获取散列中的所有字段值对
List<String> userValues = jedis.hmget("user", "name", "age");
System.out.println(userValues);

5、ZSet(有序集合)

有序集合是 Redis 提供的按照分数排序的集合,可以存储多个不重复的元素。有序集合的底层实现可以是压缩列表或跳跃表。

5.1、代码示例
// 向有序集合中添加元素
jedis.zadd("hackers", 1940, "Alan Kay");
// 获取有序集合中的元素
Set<String> hackers = jedis.zrange("hackers", 0, -1);
System.out.println(hackers);

三、使用示例

1. 缓存用户会话

// 用户登录后,将用户信息缓存到 Redis 中
jedis.set("user:" + userId, serializedUserInfo);

2. 实现实时排行榜

// 给用户增加积分,并更新排行榜
jedis.zincrby("leaderboard", 10, "user:" + userId);

3. 消息队列实现

// 生产者将消息推送到列表
jedis.rpush("messageQueue", message);

// 消费者从列表中获取消息
String message = jedis.lpop("messageQueue");

4. 去重和计数

// 将用户点赞行为记录到集合中,自动去重
jedis.sadd("likes:article:" + articleId, "user:" + userId);

// 统计文章点赞数
Long likesCount = jedis.scard("likes:article:" + articleId);

5. 购物车实现

// 向用户的购物车中添加商品
jedis.hset("cart:" + userId, "item:" + itemId, "1");

// 获取用户购物车中的所有商品
Map<String, String> cartItems = jedis.hgetAll("cart:" + userId);

这些示例展示了 Redis 数据结构在实际应用中的灵活性和高效性,可以帮助开发者在不同的业务场景中实现高性能的数据存储和处理。

四、总结

Redis 的数据结构丰富多样,适用于不同的应用场景。通过合理选择和使用这些数据结构,可以充分发挥 Redis 的性能优势,实现高效的数据处理。本文通过代码示例详细介绍了 Redis 中的五种基本数据结构,希望能够帮助读者更好地理解和使用 Redis。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Redis——数据结构/如何使用/代码示例
  • Redis-5种基本数据结构详解
  • Redis 常用的数据结构简介与实例测试【Redis 系列二】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机的错误计算(一百六十六)

摘要 探讨 MATLAB 关于算式 的计算误差。 例1. 已知 计算 直接贴图吧&#xff1a; 然而&#xff0c;16位的正确结果为 -0.9765626220703239e-21&#xff08;ISRealsoft 提供&#xff09;。这样&#xff0c;MATLAB输出的有效数字的错误率为 (16-2)/16 87.5% . 注&…

大模型时代的具身智能系列专题(十五)

Shubhangi Sinha团队 Shubhangi Sinha是康奈尔大学计算机科学系助理教授。在加入康奈尔大学之前&#xff0c;Tapo 是华盛顿大学计算机科学与工程专业的 NIH Ruth L. Kirschstein NRSA 博士后研究员。他在佐治亚理工学院获得了机器人学博士学位。他之前还曾在迪士尼研究中心工作…

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…

C++网络编程之多播

概述 在移动互联网时代&#xff0c;随着多媒体应用的日益普及&#xff0c;如何高效地将数据传输给多个接收者成为了网络通信领域的一个重要课题。多播&#xff08;英文为Multicast&#xff09;作为一种高效的网络通信方式&#xff0c;可以将数据同时发送到多个接收者&#xff0…

计算机毕业设计Python音乐推荐系统 机器学习 深度学习 音乐可视化 音乐爬虫 知识图谱 混合神经网络推荐算法 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

直播技术-Android基础框架

目录 &#xff08;一&#xff09;直播间架构 &#xff08;二&#xff09;核心任务调度机制 &#xff08;1&#xff09;复制从滑动直播间加载流程 &#xff08;2&#xff09;核心任务调度机制-代码设计 &#xff08;3&#xff09;核心任务调度机制-接入指南 (三&#xff0…

『 Linux 』数据链路层 - MAC帧/以太网帧

文章目录 MAC帧/以太网帧局域网的通信原理 MAC帧/以太网帧 MAC帧也叫做以太网帧,通常情况下MAC帧也是一个更广义的语术,用来描述数据链路层,即OSI模型的第二层的一种数据帧格式,这种格式包括其他如WI-FI,令牌环,帧中继等数据链路层所使用的数据帧; 以太网帧是具体使用的一种MAC…

LightRAG开源了…结合本地ollama实现股票数据接口Akshare智能问答

LightRAG是由香港大学研究团队推出的一种检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统。该系统通过整合图结构索引和双层检索机制&#xff0c;显著提升了大型语言模型在信息检索中的准确性和效率。LightRAG 不仅能够捕捉实体间的复杂依赖关系…

LabVIEW引用类型转换问题

一、问题描述 在LabVIEW中&#xff0c;refnum&#xff08;引用编号&#xff09;用于引用各种资源&#xff0c;如文件、队列、控件等。这些引用是与具体类型相关的&#xff0c;通常情况下&#xff0c;LabVIEW会根据引用的类型自动进行处理。然而&#xff0c;当不同类型的引用需…

Redis五大基本类型——Set集合命令详解(命令用法详解+思维导图详解)

目录 一、Set集合类型介绍 二、常见命令 1、SADD 2、SMEMBERS 3、SISMEMBER 4、SCARD 5、SRANDMEMBER 6、SPOP 7、SMOVE 8、SREM ​编辑 9、集合间操作 &#xff08;1&#xff09;SINTER &#xff08;2&#xff09;SINTERSTORE &#xff08;3&#xff09;SUNION…

HTMLCSS:彩色灵动气泡效果

效果演示 这段代码是一个HTML文档&#xff0c;包含了内联的CSS样式&#xff0c;用于创建一个具有动画效果的网页背景&#xff0c;其中包含多个彩色浮动的气泡元素。 HTML <div class"container"><div class"bubble"><span></spa…

[工具分享] 根据Excel数据根据Word文档模板,批量创建生成Word文档并重命名,方便快速查找打印

前几天交楼的小姐姐要多份Word文档合同打印给客户&#xff0c;那么100份就需要修改100次 上面好多都是模板的制式文件&#xff0c;里面的部分数据都是要根据实际值来变动的&#xff0c; 那么有没有快速的方法来操作呢&#xff0c;还是只能一个个手动的改&#xff0c;又容易出…

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入

1.使用命令新建三个.c文件vi main.c&#xff0c;vi input.c&#xff0c;vi caclcu.c&#xff0c;两个.h文件vi input.h&#xff0c;vi caclcu.h 2.vi Makefile&#xff1a;新建Makefile文件&#xff0c;输入一下内容 注意&#xff1a;命令列表中每条命令前用TAB键&#xff0c;不…

【初阶数据结构和算法】leetcode刷题之设计循环队列

文章目录 一、实现循环队列1.大致思路分析2.循环队列的结构定义和初始化结构定义初始化 3.循环队列的判空和判满判空和判满难点分析判空判满 4.循环队列的入队列和出队列入队列出队列 5.循环队列取队头和队尾元素取队头元素取队尾元素 6.循环队列的销毁7.最后题解源码 一、实现…

Otter 安装流程

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着公司的发展&#xff0c;订单库的数据目前已达到千万级别&#xff0c;需要进行分表分库&#xff0c;就需要对数据进行迁移&#xff0c;我们使用了otter&#xff0c;这里简单整理下&#xff0c;otter 的安装过程&#xff0c;希望对…

#Java-常用API-BigInteger、BigDecima、正则表达式

1.BigInteger BigInteger可以表示非常大范围的整数&#xff0c;理论上来说无限大 a.构造方法 构造方法说明public BigInteger(int num, Random rnd)获取随机大整数,范围 : [0 ~ 2的num次方 - 1]public BigInteger(String val)获取指定的大整数public BigInteger(String val,…

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化。在这种情况下&#xff0c;可以使用一种”中介对象“来管理对象间的关联关系&#xff0c;避免…

cursor 使用经验分享

cursor 是一款基于 VSCode 的 AI 优先编辑器&#xff0c;如果你还没有体验过它&#xff0c;我强烈建议看完这篇&#xff0c;因为 cursor 真的在改变编程游戏的规则&#xff0c;在了解 cursor 前&#xff0c;可以先思考一下我们日常在编程环节都做哪些事情&#xff0c;我日常开发…