2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

本文主要是介绍2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

引言

Stream 类型

Geospatial 类型

HyperLogLog 类型

Bitmaps 类型

Bitfields 类型


引言

  • Redis 最关键(应用广泛、频繁使用)的五个数据类型
  1. String
  2. List
  3. Hash
  4. Set
  5. ZSet

  • 下文介绍的数据类型一般适合在特定的场景中使用!

Stream 类型

  • Stream 类型可理解为一个阻塞队列,可用记录和模拟实时的事件

什么是事件?

  • 有些操作,我们无法知道它啥时候会出现,所以只能等到这个事情出现了之后,再采取相应的动作来处理该事件

实例理解

  • JavaScript 中包含有 点击事件、键盘事件、窗口大小改变、位置改变事件 等
  • epoll 是 Linux 中特定的 I/O 多路复用机制,用于监视多个文件描述符的事件,每当 网卡 或 socket 上有可读可写的数据时,epoll 便会使用 事件回调机制 来通知应用程序

总结:

  • 官方文档的意思为 steam 类型可以用来模拟实现这种事件传播的机制

应用场景

  • stream 类型是 Redis 作为消息队列的重要支撑,属于 List 类型中 blpop 和 brpop 命令的升级版

Geospatial 类型

  • Geospatial 类型是指一组用于存储地理空间信息(地理位置)的数据结构和相关操作
  • 该类型主要用来存储坐标的(经纬度)

应用场景

  • 存储了一些坐标点后,便可让用户给定一个坐标,然后从刚才存储的坐标点中进行相应的查找
  • 比如 按照半径、矩形区域 等

  • 此处我们指定了一个坐标,并想要查找附近的美食此时地图上便会标识出符合要求的坐标位置

HyperLogLog 类型

  • HyperLogLog 类型不是 Redis 专有的类型,属于一种思想方法!
  • HyperLogLog 类型可用于 估算 集合中的不重复元素的个数

应用场景

  • Set 类型存在一个应用场景,即统计服务器的 UV (用户的访问次数)

明确:

  • 使用 Set 类型固然可以统计 UV,但是当 UV 的数据量非常大时,使用 Set 类型便会消耗很多内存空间

实例理解

  • 使用 Set 类型存储 userId,且单个 userId 按 8 字节算
  • 1亿 UV ——> 8 亿字节 ——> 0.8G ——> 800MB
  • 使用 Set 类型存储一亿个 userId 便需要消耗 800MB 的内存空间
  • 如果使用 HyperLogLog 类型,则最多消耗 12KB 的内存空间,便可实现上述效果!

重点理解:

  • 之所以 Set 类型要消耗这么大的空间,是因为 Set 类型需要存储每个元素
  • 而 HyperLogLog 类型却无需存储元素的内容,也能判断当前元素是否为重复元素
  • 因为 HyperLogLog 类型会提取新增元素的特征,并利用该特征来判断后续新增的元素是否为重复元素!

通俗理解:

  • HyperLogLog 类型适合用来计数,即记录出当前集合有多少个不同元素,但无法告诉你这些元素的内容是什么

注意:

  •  HyperLogLog 类型并不具有 100% 的精确性,即存在一定的误差
  • 官方文档描述误差大概为 0.81%

Bitmaps 类型

  • Bitmaps 类型使用 bit 位来表示整数

  • 位图(bitmaps)本质上还是一个集合,属于 Set 类型针对整数的特化版本
  • 其目的也还是为了节省空间,且也因为计算机进行位运算一般都是比较高效的

问题:

  • 相比于使用 Bitmap 类型,使用 HyperLogLog 类型更节省空间呀?

明确:

  • HyperLogLog 类型即可以存储数字,也可以存储字符串,但是 不存储元素内容,仅有计数效果
  • 因为 Hyperloglog 类型在存储元素的时候,提取特征的过程 是不可逆的!
  • 而 Bitmap 类型是实实在在存储了元素,即 可以通过遍历精确知道哪些元素已经存储

总结:

  • 通常我们首选还是使用 Set 类型,因为 Set 类型更加通用!
  • 如果存在这种极端的特定场景,再进而考虑使用 Bitmap 类型、Hyperloglog 类型

Bitfields 类型

  • Redis 的位域(bitfields)允许您设置、递增和获取任意位长度的整数值
  • 位域(bitfields)相较于之前的 String 、Hash 类型来说,其目的也是为了节省空间!

辅助理解:

  • C 语言中的位域 是一种结构体成员的特殊用法,允许你在内存中以位为单位对数据进行紧凑的存储

  • 位域 本质上是让我们进行精确位操作的一种方法

重点理解:

  • Bitfields 类型与 C 语言中的位域非常相似
  • Bitfields 类型可以理解成一串二进制序列(字节数组)
  • 程序员可以将这个字节数组中的某几个位赋予特定的含义,并且可以针对这某几个位进行 读取、修改、算数运算等相关操作

实例理解

  • 此处我们需要针对页游初始化新玩家的 金币数
  • 因此我们可以给每个玩家均分配一个位域,以此来表示每个玩家的 金币数
  • 此处假设每个新玩家初始状态均有 1000 金币
> BITFIELD player:1:stats SET u32 #0 1000
1) (integer) 0
  • 使用 BITFIELD 命令来进行操作
  • "player:1:stats" 为 key 值 
  • "SET" 属于 BITFIELD 命令下的一个子命令
  • "u32" ——> unsigned 32 ——> 无符号操作 32 个 bit 位
  • "#0" 相当于一个标签,此处表示 金币数
  • "1000" 设置的初始值 1000 金币

这篇关于2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565989

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda