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

Redis十大数据类型详解

Redis(一)


十大数据类型

redis字符串(String)
  • string是redis最基本的类型,一个key对应一个value

  • string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象

  • 一个redis中字符串value最多可以是512M

redis列表(List)
  • 有序:列表中的元素是有序的,这意味着你可以按照插入的顺序来获取元素。

  • 可重复:与集合(Set)不同,列表允许元素重复。

  • 灵活:列表可以在头部(左边)或尾部(右边)添加或删除元素。

  • 底层是一个双向链表,最多可以包含2^32-1个元素(每个列表超过40亿个元素)

redis哈希表(Hash)
  • 键值对集合:哈希表存储的是键值对,其中键(field)和值(value)都可以是字符串。

  • 灵活性:哈希表允许你存储多个字段和值,非常适合表示对象

  • 高效性:由于哈希表的内部实现(如压缩链表或哈希表),Redis能够快速地执行哈希表的增删改查操作。

  • Redis中每个hash可以存储2^32-1键值对(40多亿)

redis集合(set)
  • 无序性:集合中的元素是无序的,即不保证元素的插入顺序。

  • 唯一性:集合中的元素是唯一的不允许有重复的元素

  • 动态性:集合可以动态地添加或删除元素

  • Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

  • 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)

redis有序集合(zset)
  • 有序性每个元素都会关联一个double类型的分数,集合中的元素按照分数进行排序,分数越低,排名越靠前。

  • 唯一性:集合中的元素是唯一的,不允许有重复的元素。但是,多个元素可以有相同的分数。

  • 动态性:有序集合可以动态地添加、删除或更新元素及其分数。

  • zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1

redis地理(GEO)

Redis的地理(GEO)功能提供了一种存储地理位置信息并进行地理空间查询的方法。Redis使用GeoHash算法将二维的经纬度坐标编码为一维的字符串,从而实现对地理位置的快速查询和计算。

  • 存储地理位置:可以存储地理位置的经纬度信息(坐标信息)

  • 距离计算:可以计算两个地理位置之间的距离

  • 范围查询:可以查询指定范围内的地理位置

  • 性能高效:由于使用了GeoHash算法,Redis的地理功能在性能上非常高效。

redis基数统计(HyperLogLog)

Redis的基数统计(HyperLogLog)是一种用于估算数据集合中不重复元素数量的算法。与传统的集合数据结构(如Redis的Set)相比,HyperLogLog在存储空间和计算效率上具有显著优势,尤其是在处理大规模数据集时。

  • 存储空间小:HyperLogLog使用极少的存储空间来估算集合的基数(即不重复元素的数量)。即使在存储数亿个不重复元素时,HyperLogLog也能保持较小的内存占用,或者说计算基数所需的空间总是固定且是很小的。

  • 计算效率高:HyperLogLog的基数估算操作非常快速,几乎可以在常数时间内完成。

  • 估算精度虽然HyperLogLog提供的是基数的估算值而非精确值,但其估算精度通常足够高,可以满足大多数应用场景的需求。在标准误差范围内(通常为0.81%),HyperLogLog的估算值非常接近实际基数。

  • HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

  • 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比

redis位图(bitmap)

Redis的位图(Bitmap)是一种使用位数组来存储和操作二进制数据的数据结构。位图中的每一位可以表示一个数据点的存在状态(0或1),这使得位图在处理大量数据时非常高效,尤其是在需要快速进行存在性检查或统计操作的情况下。简而言之就是由0和1状态表现的二进制位的bit数组

  • 空间效率:位图使用位数组来存储数据,因此可以非常高效地利用存储空间。例如,一个位图可以轻松地表示数百万个数据点的存在状态,而占用的内存空间却非常少。

  • 操作速度:由于位图的内部实现通常基于高效的位操作算法,因此位图上的操作(如设置、清除、检查位等)通常非常快速。

  • 灵活性:位图可以灵活地表示各种类型的数据点,只要这些数据点可以被映射到一个唯一的索引上。例如,你可以使用位图来表示用户的登录状态、商品的库存状态,判断Y/N状态,其现实生活中的实例为,软件的签到,打卡等等。

redis位域(bitfield)

Redis的位域(Bitfield)功能允许你在位图(Bitmap)上进行更复杂的位操作,如读取、写入和递增特定长度的位字段。使得Redis能够更高效地处理二进制数据。

  • bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。

  • 灵活性强:位域操作允许你指定要操作的位字段的长度(从1位到64位),这使得你可以在位图上表示不同类型的数据(如布尔值、整数、浮点数等)。

  • 高效性:位域操作通常在单个命令中完成多个位的读写操作,从而减少了网络往返次数和Redis服务器的处理时间。

  • 原子性:位域操作是原子的,这意味着它们在执行过程中不会被其他命令打断,从而保证了数据的一致性和完整性。

redis流(Stream )

Redis流(Stream)是Redis 5.0版本引入的一种新的数据结构,主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失

  • 消息序列化:流中的每条消息都有一个唯一的ID,这个ID通常是由Redis自动生成的,但也可以由客户端指定。消息ID是有序的,因此流中的消息是按顺序排列的。

  • 消费者组:流支持消费者组的概念,允许多个消费者协作处理流中的消息。每个消费者组都有自己的消费进度(即已处理的消息ID),并且可以将消息分配给不同的消费者进行处理。

  • 持久化:流支持AOF(Append Only File)和RDB(Redis Database Backup file)两种持久化方式,确保消息在Redis重启后不会丢失。

  • 消息确认:消费者可以显式地确认已经处理的消息,这样Redis就可以将这些消息从流中删除或标记为已处理。

redis常见数据类型操作命令获取

官网英文:Commands | Docsicon-default.png?t=O83Ahttp://redis.io/commands/

中文:

Redis 命令icon-default.png?t=O83Ahttps://redis.com.cn/redis-commands.html

redis通用命令

命令作用
keys *查看当前库中所有key
exsis key判断某个key是否存在
type key查看指定key的数据类型
del key删除指定的key数据
unlink key非阻塞删除,仅仅将keys从keyspace元数据中删除,正真的删除会在后续异步中操作
ttl key查看还有多少秒过期,-1代表永不过期,-2代表已经过期
expire key seconds为指定的key设置过期时间
move key dbindex[0~15]将当前数据库的key移动到给定的数据库db当中
select dbindex[0~15]切换数据库【0~15】,默认为0
dbsize查看当前数据库key的数量
fiushdb清空当前库
flushall通杀全部库

字符串类型string

  • 同时设置/获取多个键值:MSET key value 【key value...】,MGET key 【key...】

还有一些组合形式如:msetnx/msetxx...

  • 数值增减(前提是一定要是数字):

    递增:INCR key

    增加指定数字:INCRBY key increment

    递减:DECR key

    减少指定整数:DECR key decrement

  • GETSET:先get返回旧值再set设置新值

列表类型List

  • 添加和查询数据:LPUSGH(从左端添加)/RPUSH(从右端添加)/LRANGE(查询指定索引范围内的元素)

  • 删除元素:LPOP(从左端弹出一个元素并返回其值)/RPOP(从右端弹出一个元素并返回其值)

  • 删除number个值等于v1的元素:LREM key number v1

  • 截取指定范围内的值后再赋值给key:LTRIM key beginindex endindex

  • 将源列表中的元素弹到目的列表中:RPOPLPUSH 源列表 目的列表

  • 修改指定索引的值:LSET key index value

  • 在指定的元素前/后添加指定的元素:LINSERT key before/after 旧值 插入的新值

哈希类型Hash

  • 添加和查询数据:HSET/HGET

  • 批量添加和查询数据:HMSET/HMGET/HGETALL(查询全部)

  • 删除指定的value值:HDEL

  • 获取某个key内的全部数量:HLEN

  • 判断key中是否存在对应字段:HEXSIS key

  • 获取key中的所有filed/filed对应的value:HKEYS/HVALUES

  • 在对应的value值上增加:HINCRBY/HINCRBTFLOAT

  • 当key不存在时添加key:HSETNX

集合类型set

打字太累了,这里偷一下懒,哈哈~

如果觉得不详细,请移步至官网操作手册,地址在常用命令处

有序集合类型zset

位图类型bitmap

偏移量从o开始

用String类型作为底层数据结构实现的一种统计二值状态的数据类型

位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。

命令作用时间复杂度
setbit key offset(偏移位) val(0/1)给指定的key的值的第offset赋值valO(1)
getbit key offset获取指定key的第offset位O(1)
bitcount key start end返回指定key中【start end】中为1的数量O(n)
bittop operation destkey key对不同的二进制存储数据进行位运算(AND,OR,NOT,XOR)O(n)

基数统计类型HyperLogLog

去重复,统计功能的基数估计算法就是HyperLogLog

地理空间类型GEO

本质上就是zset的衍生形态,存入一个value值其还配备了对应的经纬度坐标(将zset中的score进行了替换)

命令作用
GEOADD添加经纬度坐标
GEOPOS返回经纬度
GEOHASH返回坐标的geohash表示
GEODIST返回两个位置之间的距离
GEORADIUS以半径为中心,查找附近的相关坐标
GEORADIUSBYMEMBER以半径为中心,查找附近坐标(可以使用中文)

流类型stream

Redis消息队列的2种方案:

List实现消息队列:

pub/sub(发布订阅):

原理图

1Message Content消息内容
2Consumer group消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者
3Last_delivered_id游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
4Consumer消费者,消费组中的消费者
5Pending_ids消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理

队列相关指令:

消费组相关命令:

4个特殊符号:

  • -+:最小和最大可能出现的id

  • $:表示只消费新的消息,当前流中最大的id,可用于将要到来的消息

  • 大于号(>):用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息

  • *:用于XADD命令中,让系统自动生成id

位域类型bitfield

将一个Redis字符串看作为是一个由二进制位组成的数组并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改

相关文章:

Redis十大数据类型详解

Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…...

Open FPV VTX开源之betaflight配置

Open FPV VTX开源之betaflight配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充 - 飞控固件版本 1. 源由 飞控嵌入式OSD - ardupilot配置使用betaflight配套OSD图片。 Choose correct font depending on Flight Controller SW. ──> /usr/share/fonts/├──> font_btfl…...

AT32 bootloader程序与上位机程序

从8051到stm32, 从串口下载到JLINK调试,从keil到arm-none-eabi-gcc,从"Hello wrold"到通信协议,一路起来已学会很多,是时候写一下bootloader了。 基本原理 单片机代码编译完后可以生成".hex"和".bin"文件&…...

数据结构与算法之栈: LeetCode 151. 反转字符串中的单词 (Ts版)

反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string/ 描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 返回 单词 顺序颠倒且 单词 之间用单个空…...

使用 configparser 读取 INI 配置文件

使用 configparser 读取 INI 配置文件 适合于读取 .ini 格式的配置文件。 配置文件示例 (config.ini): [DEFAULT] host localhost port 3306 [database] user admin password secret import configparser# 创建配置解析器 config configparser.ConfigParser()# 读取配…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...

RK3588-NPU pytorch-image-models 模型编译测试

RK3588-NPU pytorch-image-models 模型编译测试 一.背景二.操作步骤1.下载依赖2.创建容器3.安装依赖4.创建脚本A.生成模型名列表B.生成ONNX模型C.生成RKNN模型D.批量测试脚本 一.背景 测试RK3588-NPU对https://github.com/huggingface/pytorch-image-models.git中模型的支持程…...

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中,从宏观层面来看,新技术的落地速度不断加快,各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析,企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…...

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…...

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说,命令的各个部分含义如下: …...

深入解析 ZooKeeper:分布式协调服务的原理与应用

1.说说 Zookeeper 是什么? ZooKeeper 是一个开源的分布式协调服务,由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务,例如命名、配置…...

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也…...

对当前日期进行按年、按月、按日的取值

对当前日期进行按年、按月、按日的取值。 其规则为: 按年 为当前日期到来年同一日期的前一天(2024-12-01到2025-11-30)。 按月 为当前日期到下个月的同一日期的前一天 (2024-12-01 到 2024-12-31)。 按日 为当前日…...

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放,导致系统内存逐渐耗尽,最终可能造成程序崩溃或性能下降。在C中,内存泄漏通常发生在使用new或malloc等分配内存的操作时,但没有正确地使用delete或free来释放这块内存。 在日常开发过程…...

Http 响应状态码 前后端联调

http 响应状态码 :是服务器在处理HTTP请求时返回的状态信息,用于表示请求的处理结果 1xx : 信息性状态码 100 Continue: 服务器已收到请求头部,客户端应继续发送请求体。 101 Switching Protocols : 切换协议。服务器已理解客户端的请求&a…...

48_Lua错误处理

在编写Lua应用时,都可能会遇到不可预见的错误,而错误处理是确保程序稳定性和健壮性的关键环节。有效的错误处理不仅能防止程序崩溃,还能提供有用的反馈信息给开发者或最终用户,从而提高应用程序的质量。本文将详细介绍Lua中的错误处理机制。 1.错误类型 Lua中的错误类型主…...

shell脚本回顾1

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 一、 ll /tmp/size.log &>/dev/null if [ $? -eq 0 ];then cat /tmp/size.log else touch /tmp/size.log echo date > /tmp/size.log fi二、 if …...

【3】管理无线控制器

1.概述 本文主要介绍AireOS WLC的管理。WLC的管理可以通过CLI和GUI两种方式,而CLI主要分为console接入、telnet以及SSH的登录管理;GUI的管理分为HTTP和HTTPS。 2.CLI的管理 通过console实现的CLI管理这里就单独进行说明了,只要能找到设备的console接口,通过一般的RJ45接…...

SOME/IP 协议详解——服务发现

文章目录 1. Introduction (引言)2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General(概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项(Co…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地

NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...

从数据报表到决策大脑:AI重构电商决策链条

在传统电商运营中,决策链条往往止步于“数据报表层”:BI工具整合历史数据,生成滞后一周甚至更久的销售分析,运营团队凭经验预判需求。当爆款突然断货、促销库存积压时,企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景:为什么需要代理?​​ 最近在技术社区看到这样的求助: "公司服务器在国内,但业务需要调用OpenAI接口,直接访…...

C#学习12——预处理

一、预处理指令: 解释:是在编译前由预处理器执行的命令,用于控制编译过程。这些命令以 # 开头,每行只能有一个预处理指令,且不能包含在方法或类中。 个人理解:就是游戏里面的备战阶段(不同对局…...

Linux——TCP和UDP

一、TCP协议 1.特点 TCP提供的是面向连接、可靠的、字节流服务。 2.编程流程 (1)服务器端的编程流程 ①socket() 方法创建套接字 ②bind()方法指定套接字使用的IP地址和端口。 ③listen()方法用来创建监听队列。 ④accept()方法处理客户端的连接…...

Android Settings 数据库生成、监听与默认值配置

一、Settings 数据库生成机制​ ​传统数据库生成(Android 6.0 前)​​ ​路径​:/data/data/com.android.providers.settings/databases/settings.db​创建流程​: ​SQL 脚本初始化​:通过 sqlite 工具创建数据库文件…...

Monorepo架构: 项目管理模式对比与考量

关于 monorepo 相关概念及项目管理模式 在软件开发中,尤其是前端项目,我们会涉及到不同的项目管理模式,这里先介绍几个重要的概念“monorepo”是当前较为热门的一种项目管理方式,虽然很多人可能听说过,但可能在实际项…...

js 比较两个对象的值,不相等就push对象的key

在JavaScript中,比较两个对象(object)的值并找出不相等的key,可以通过多种方法实现。下面是一些常用的方法: 方法1:使用JSON.stringify 这种方法适用于简单的对象,其中对象的值是基本类型或可…...

阿里云Alibaba Cloud安装Docker与Docker compose【图文教程】

个人记录 进入控制台,找到定时与自动化任务 进入‘安装/卸载扩展程序’ 点击‘安装扩展程序’ 选择docker社区版,点击下一步与确定,等待一会 安装成功 查询版本 查询docker sudo docker version查询docker compose sudo docker compo…...

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制: 准备阶段 - 提议者向所有接受者发送准备请求,请求中包含一个唯一的编号。 - 接受者收到请求后,会检查编号,如果编号比它之前见过的都大,就会承…...