Java面试八股之Redis有哪些数据类型?底层实现分别是什么

news2024/9/20 12:43:05
  1. Redis有哪些数据类型?底层实现分别是什么

Redis数据类型概述

Redis作为一款键值存储系统,提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途:

String(字符串)

存储单个键值对,支持增删改查、自增、截取等操作。

应用场景:计数器、缓存、分布式锁等。

底层实现:Redis字符串是动态字符串(SDS),其内部结构包含长度、已用长度和字节数组。

编码方式:Redis对字符串值的存储采用多种编码,如:

REDIS_ENCODING_INT:当值为整数且在一定范围内时,直接存储整数值,节省空间。

REDIS_ENCODING_EMBSTR:对于短字符串,使用embstr编码,将字符串与结构体紧凑存储在同一块连续内存中,减少内存分配次数。

REDIS_ENCODING_RAW:长字符串或非整数值使用raw编码,即传统的简单动态字符串。

List(列表)

有序的字符串列表,支持两端插入、弹出、范围查询等操作。

应用场景:消息队列、最新N个元素列表等。

底层实现:列表有两种编码方式,分别是:

ziplist(压缩列表):对于元素数量少且元素长度较短的列表,使用连续内存存储,节省空间。

linkedlist(双端链表):当列表元素数量或长度超过一定阈值时,转为双端链表实现,保证操作的高效性。

Set(集合)

无序的字符串集合,不允许重复成员,支持添加、删除、成员关系判断等操作。

应用场景:标签系统、唯一性检查、交并差集运算等。

底层实现:集合也有两种编码:

intset(整数集合):当集合中所有元素都是整数且范围适当时,使用整数集合存储,空间效率高。

hashtable(哈希表):当集合包含非整数元素或元素数量超过一定阈值时,转化为哈希表实现,提供快速的增删查操作。

Sorted Set(有序集合)

类似集合,但每个成员附带一个分数,依据分数进行排序。

支持添加、删除、按分数范围查询、排名、聚合操作等。

应用场景:排行榜、带权重的标签系统、Top N查询等。

底层实现:有序集合基于ziplist或skiplist(跳跃表)编码:

ziplist:小型有序集合,使用压缩列表存储,元素按分数排序。

skiplist:大型有序集合,使用跳跃表实现,提供O(log N)的插入、删除、查找等操作,同时保留了集合成员的顺序。

Hash(哈希)

键值对的集合,每个键值对由field-value组成。

支持增删改查单个field,批量操作整个哈希。

应用场景:对象属性存储、购物车等。

底层实现:哈希同样存在两种编码:

ziplist:对于小规模哈希(字段数量和值长度较小),使用压缩列表存储,紧凑且高效。

hashtable:当哈希的字段数量或值长度超过阈值时,转化为哈希表实现,提供快速的字段查找和更新。

Bitmaps(位图)

功能:Bitmaps允许以位(bit)为单位存储数据,非常适合用来表示稀疏的二进制状态,如用户签到、统计用户行为等。

应用案例:用户签到系统

假设有一个网站需要记录用户每天的签到情况。对于每个用户,我们可以使用一个唯一的用户ID作为键名,用Bitmaps来表示其连续365天的签到状态。每天签到时,使用SETBIT命令将对应日期的位设置为1。查询用户在过去一周是否有连续签到,则可通过BITCOUNT命令计算过去7天的位图中值为1的位数。

底层实现:在Redis中,位图实际上是基于字符串(String)类型实现的,每个字节(8位)对应字符串中的一个字符。通过对字符串执行位操作命令(如SETBIT, GETBIT, BITCOUNT, BITOP等),可以高效地进行位的增删查改。

HyperLogLog

功能:HyperLogLog是一种概率数据结构,用于估算集合中不重复元素(基数)的大致数量,而不需要存储所有元素。它以极小的空间开销(通常几百字节)提供接近精确的计数,适用于大规模唯一计数场景,如网站独立访客统计、唯一事件计数等。

应用案例:网站独立访客统计

在一个网站中,需要统计每天访问的独立访客数,但不想为每个访客保存完整的访问记录。可以为每天创建一个HyperLogLog键,每当有新的访客访问时,将其唯一标识符(如IP地址或用户代理字符串的哈希值)添加到当天的HyperLogLog中。使用PFADD命令添加元素,PFCOUNT命令获取估计的独立访客数。

底层实现:HyperLogLog使用特定的哈希函数和概率算法估计基数,不直接存储元素,而是维护一个内部状态来近似计数。

Geospatial Indexes(地理位置索引)

功能:Redis提供了对地理位置数据的支持,可以存储经纬度坐标,并进行距离查询、范围查询(如“附近的人”功能)、地理围栏(如“在某区域内的人”)等操作。

应用案例:“附近的人”功能

在社交应用中,用户可以查看当前位置附近的其他在线用户。为每个用户存储其经纬度坐标,使用GEOADD命令将用户位置添加到地理位置索引中。当查询时,使用GEORADIUS或GEORADIUSBYMEMBER命令查找指定半径内的其他用户。

底层实现:使用有序集合(Sorted Set)存储地理位置数据,成员为地理位置的标识符,分值为经过特定公式转换后的经纬度坐标,以此实现空间索引。

Streams(流)

功能:Redis Streams是一种用于存储和处理时间序列数据的数据结构,特别适用于构建消息队列、活动日志、审计跟踪等应用场景。它支持多消费者消费同一数据流的不同部分,并具备消息持久化、消息ID生成、消息分片(Consumer Group)等功能。

应用案例:订单事件日志

在电商系统中,使用Redis Stream记录订单相关的事件,如订单创建、支付成功、发货等。每个事件作为一个消息,包含事件类型、发生时间、订单ID等信息。消费者(如后台任务、实时分析服务)通过XREAD或XREADGROUP命令订阅并处理这些事件。

底层实现:Stream数据结构在内部以键值对的形式存储,键为Stream的名字,值为一个特殊的字典结构,包含多个消息列表(每个消息列表代表一个分片)以及相关元数据。

如果大家需要视频版本的讲解,欢迎关注我的B站:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsNearbyAlmostDuplicate(self, nums, k, t):from sortedcontainers import SortedSetst SortedSet()left, right 0, 0res 0while right < len(nums):if right - left > k:st.remove(nums[left]…

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

攻防世界 Web_python_template_injection(flask模版注入)

学习文章&#xff1a;https://www.freebuf.com/column/187845.html https://blog.csdn.net/weixin_54515836/article/details/113778233 flask的渲染方法有render_template和render_template_string两种。 render_template()是用来渲染一个指定的文件的。使用如下 return re…

时序分解 | Matlab基于ESMD极点对称模态分解

时序分解 | Matlab基于ESMD极点对称模态分解 目录 时序分解 | Matlab基于ESMD极点对称模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ESMD&#xff08;Extreme-point Symmetric Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;用于提取信号中的模…

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

2-30 基于matlab的神经网路下身份证号码识别算法

基于matlab的神经网路下身份证号码识别算法&#xff0c;二值化、膨胀处理、边界区域划分、身份证字符分割&#xff0c;字符识别算法&#xff0c;输出识别结果。并保存识别结果。程序已调通&#xff0c;可直接运行。 2-30 神经网络 身份证识别 图像处理 - 小红书 (xiaohongshu.c…

Python强大的数据转换功能库之awswrangler使用详解

概要 在现代数据工程和数据科学领域,AWS(亚马逊云服务)是一个非常重要的平台。它提供了丰富的服务,包括S3、Glue、Redshift等,这些服务在数据存储、处理和分析中发挥了关键作用。Python的awswrangler库是一个强大的工具,旨在简化与AWS服务的交互。awswrangler库提供了一…

Python | Leetcode Python题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution:def calculate(self, s: str) -> int:n len(s)stack []preSign num 0for i in range(n):if s[i] ! and s[i].isdigit():num num * 10 ord(s[i]) - ord(0)if i n - 1 or s[i] in -*/:if preSign :stack.append(…

机器学习笔记之监督学习

基本概念 用于训练模型的数据集称为&#xff1a;训练集 成本函数/代价函数&#xff1a;指示模型的运行情况&#xff0c;用于衡量训练数据与该直线的拟合程度。将预测值和目标值做差&#xff0c;该差值也被称为“损失值”。 例如我们需要计算平均的平方误差来衡量 成本函数/…

日常学习-20240710

1、一次一千万条数据插入和删除案例&#xff1a; 第一次&#xff1a;插入--批量插入&#xff0c;每次插入5000条数据&#xff0c;总耗时28min,数据无异常 删除--通过sql语句一次性删除&#xff0c;总耗时1h52min;一次删除的数据过多导致mysql的备份恢复文件极其庞大&#xff0…

百度搜索框制作HTML+CSS

样品图 自制效果图&#xff08;附注释&#xff09; <!DOCTYPE html> <html lang"en"><head><!-- 定义文档的字符编码为UTF-8&#xff0c;以支持中文等多语言字符 --><meta charset"UTF-8" /><!-- 设置页面在不同设备上的…

【Python 基础】控制流 - 2

程序执行 在第1篇的 hello.py 程序中,Python 开始执行程序顶部的指令,然后一条接一条往下执行。“程序执行”(或简称“执行”)这一术语是指当前被执行的指令。如果将源代码打印在纸上,在它执行时用手指指着每一行代码,你可以认为手指就是程序执行。 但是,并非所有的程…

【Linux】进程的基本概念(已经进程地址空间的初步了解)

目录 一.什么是进程 进程和程序的区别 Linux查看进程 进程的信息 fork函数 二.进程状态 操作系统上进程状态的概念 运行 阻塞 挂起 Linux中的进程状态 R状态 S状态和D状态 T状态 t状态 X状态 Z状态 三.进程的优先级 修改进程优先级 四.环境变量 常见的环境变量 PATH HOME PW…

夏日智启:我的Datawhale AI夏令营探索之旅

前言 最近几年&#xff0c;AI&#xff08;人工智能&#xff09;的发展呈现出了前所未有的迅猛势头&#xff0c;其影响力和应用范围不断扩大&#xff0c;深刻地改变着我们的生活、工作和社会结构。尤其是AI大模型技术&#xff0c;国内外可谓是“百模大战”&#xff0c;百舸争流…

【Python 基础】控制流 - 1

控制流 你已经知道了单条指令的基本知识。程序就是一系列指令。但编程真正的力量不仅在于运行&#xff08;或“执行”&#xff09;一条接一条的指令&#xff0c;就像周末的任务清单那样。根据表达式求值的结果&#xff0c;程序可以决定跳过指令&#xff0c;重复指令&#xff0…

线性代数|机器学习-P22逐步最小化一个函数

文章目录 1. 概述2. 泰勒公式3. 雅可比矩阵4. 经典牛顿法4.1 经典牛顿法理论4.2 牛顿迭代法解求方程根4.3 牛顿迭代法解求方程根 Python 5. 梯度下降和经典牛顿法5.1 线搜索方法5.2 经典牛顿法 6. 凸优化问题6.1 约束问题6.1 凸集组合 Mit麻省理工教授视频如下&#xff1a;逐步…

实验-ENSP实现防火墙区域策略与用户管理

目录 实验拓扑 自己搭建拓扑 实验要求 实验步骤 整通总公司内网 sw3配置vlan 防火墙配置IP 配置安全策略&#xff08;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9: 00- 18:00)可以访问&#xff0c;生产区的设备全天可以访问&#xff09; 配置nat策…

26.Labview波形图、XY图、强度图使用精讲

我们如何使用Labview显示曲线或者制作出下面这种我们想要的曲线并随着我们输入值的变化而变化呢&#xff1f; 本文详细讲解一下每种波形图的使用方式&#xff0c;帮助大家深入了解波形图的使用技巧。 文章中的所有程序已上传到下面链接中&#xff0c;下载地址(建议先转存)&am…

利用量子信息推进计算

利用量子信息推进计算 编译 李升伟 我们重点介绍 2024 年美国物理学会 3 月会议上关于量子计算和量子算法的热烈讨论&#xff0c;并邀请能够显著推动量子信息科学领域向前发展的论文提交。 美国物理学会 (APS) 三月会议可以说是世界上最大的年度物理学会议之一&#xff0c;今…

N32G45XVL-STB之lvgl的应用实例

目录 概述 1 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 1.3 MCU IO与Touch PIN对应关系 2 N32G45x移植 LVGL 2.1 移植步骤 2.2 注意点 2.2.1 UI刷新函数 2.2.2 主函数中调用 3 LVGL的应用Demo 3.1 功能描述 3.2 代码实现 3.3 测试 N32G45XVL-STB之lv…