Redis系列--新数据类型详解

2023-10-29

一、Bitmaps

一、简介

计算机存储数据时,都是以二进制位表示,Redis提供了Bitmaps这个“数据类型”可以实现对位的操作。

(1)Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。

(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量(是从零开始算的)。

二、命令

1、setbit

setbit<key><offset><value>设置Bitmaps中某个偏移量的值(0或1)

2、getbit

getbit<key><offset>获取Bitmaps中某个偏移量的值

二、HyperLogLog

一、简介

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

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

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

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

二、命令

(1)pfadd <key>< element> [element ...]   添加指定元素到 HyperLogLog 中

(2)pfcount<key> [key ...] 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可

三、Geospatial

一、简介

Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。

二、命令

(1)geoadd<key>< longitude><latitude><member> [longitude latitude member...]   添加地理位置(经度,纬度,名称)

(2)geopos  <key><member> [member...]  获得指定地区的坐标值

(3)geodist<key><member1><member2>  [m|km|ft|mi ]  获取两个位置之间的直线距离,后面跟着的是单位。

m:米 、km:千米 、ft:英尺 、mi:英里

(4)geohash key member 用于获取一个或多个位置元素的geohash值

 (5)georadius 以给定的经纬度为中心,返回建包含位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。输入的是经纬度

(6)georadiusbymember:找出制定范围内的元素,中心点是由给定的位置元素决定的,输入的是中文

 四、Stream类型

一、是什么

一、redis5.0之前的痛点

redis消息队列的两种方案

1、使用List实现消息队列

List实现方式其实就是点对点的模式。按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),所以常用来做异步队列来使用,将需要延后处理的任务结构体序列化成字符串塞进redis的列表,另一个线程从这个列表中轮训获取数据进行处理。

 2、Pub/Sub

redis发布订阅有一个缺点就是消息无法持久化,如果出现网络断开、Redis宕机,消息就会全部丢失,而且也没有ack机制保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了。

二、 redis5.0之后新增了一个更强大的stream数据结构(redis版的消息中间件+阻塞队列)

二、能干嘛

实现消息队列,他支持消息的持久化、支持自动生成全局唯一id、支持ack确认消息的模式、支持消费者组模式等,让消息队列更加的稳定可靠

一、底层结构

 二、基础命令

1、队列相关命令

1、XADD:

前提:消息id必须必上一个id大,默认用星号表示自动生成规矩(*用于命令中让系统自动生成id,类似于mysql技术主键自动增长类型)

Stream的消息内容结构:类似于hash结构,是以key-value键值对的形式存在

2、XRANGE:用于获取消息列表(可以制定范围),忽略删除的消息

start:表示开始值;-:表示最小值(XRANGE stream名  start(-)end(+))

end:表示结束值;+:表示最大值

count:表示最多获取多少个值

3、XREVRANGE:反转

4、XDEL:删除消息内容,按照消息id进行删除;XDEL stream名 消息id

5、XLEN:用于获取Stream队列的长度

6、XTRIM:用于对Stream的长度进行截取。

MAXLEN:允许的最大长度,对流进行修剪限制长度

MINID:允许的最小id,从某个id开始比该id值小的将会被抛弃。

7、XREAD:

用于获取消息(阻塞/非阻塞),只返回大于指定ID的消息

 非阻塞

阻塞

  

2、消费者相关命令

 1、XGROUP CREATE :用于创建消费者组

 2、XREADGROUP GROUP 

1、“>”,表示从第一条尚未被消费的消息开始读取

2、消费者groupA内的消费者consumer1从mystream消息队列中读取所有消息

3、不同消费者组的消费者可以消费同一条消息

 4、消费者组的目的

 5、ack

3、XPENDING

1、查询每个消费者组内所有消费者【已读,但尚未确认】的消息

2、查看某个消费者具体读了那些数据

3、XACK:向消息队列确认消息处理已完成

 4、XINFO:用于打印Stream\Consumer\Group

 3、四个特殊符号 

1、-、+:最小、最大可能出现的id

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

3、>:用于XREADGROUP命令,表示迄今为止还没有发送给组中使用者的,会更新消费者组的最后id

4、*:用于XADD命令,让系统自动生成消息id

五、bitField:位域

 一、是什么

 二、干什么

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

 栗子:

例如hello这个单词,会转化为ASCII码,拿到对应的二进制进行存储,如果需要改变其中的一个单词,只需要改变对应位上的数据即可(数据都是0或1),快捷直接且高效。

1、位域修改

也就是官网讲的,对数组中任意偏移进行访问

 2、溢出控制

三、基础语法 

一、 BITFIELD key [GET type offset]

 二、 BITFIELD key [SET type offset value]

三、BITFIELD key [INCRBY type offset increment],默认情况下INCRBY使用参数为WRAP

 四、溢出控制OVERFLOW [WRAP|SAT|FAIL]

1、WRAP:使用回绕方法处理有符号整数和无符号整数溢出情况

 2、SAT:使用饱和计算方法处理溢出,下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值

3、FAIL:将拒绝执行那些会导致上溢或下溢情况出现的计算,并向用户返回空值,表示计算未执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis系列--新数据类型详解 的相关文章

  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • Firebase 数据库结构 - 需要建议

    我知道这个问题可能被视为基于意见的问题 但是我认为值得讨论正确构建数据库的方法 我在 Swift 中开发 iOS 应用程序 并决定使用 firebase 作为我的后端服务 让我们从应用程序描述开始 该应用程序旨在为图书阅读体验提供跟踪和社交
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 带有版本控制的 json 数据存储

    问题定义 有一个Java服务器存储JSON可以映射到 Java 类的数据 Java 类可能会发生变化 目标是能够更新 Java 类并且仍然能够解码JSON旧版本的数据到新版本的 Java 对象 应该有一个良好的版本控制系统 例如 能够向 J
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 检查 DynamoDB 中是否存在表的最佳方法是什么?

    检查 DynamoDb 中是否存在表的最佳方法是什么 如果代码是 PHP 语言 我将不胜感激 要么活跃 要么不活跃 稍后作为错误代码 400 的各种情况的示例添加 检查表是否存在很容易 它可以有以下之一 表状态 gt 创建 活动 删除或更新
  • OT 和 CRDT 之间的区别

    有人可以简单地向我解释一下操作转换和 CRDT 之间的主要区别吗 据我了解 两者都是允许数据在分布式系统的不同节点上无冲突地收敛的算法 在哪种用例中您会使用哪种算法 据我了解 OT主要用于文本 而CRDT更通用 可以处理更高级的结构 对吧
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 在不知道对象键的情况下进行 Cosmos DB 查询

    单个文档示例 id xxxxxx properties a prop type names value John b prop type score value 5 5 c prop type names value Steve 问题 如何
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无

随机推荐

  • python3+flask 开发web(一)

    1 环境准备 1 安装Python https www python org 2 安装python ide pycharm https www jetbrains com pycharm 3 安装flask 安装好了python 电脑就自动
  • 如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试

    GDB The GNU Project Debugger 是 Linux 系统下调试 C 和 C 程序的主要神兵 Vim教程网 https vimjc com 介绍多种方式下使用 GDB 启动进程调试的方法和命令 要使得 C 和 C 程序能
  • varchar和char的区别

    1 char n 和varchar n 中括号中n代表字符的个数 并不代表字节个数 所以当使用了中文的时候 UTF8 意味着可以插入m个中文 但是实际会占用m 3个字节 即 n限制了存储多长的值 但是所占用的空间大小不一致 例如varcha
  • 使用 Amazon Rekognition API 进行文本检测和 OCR

    使用 Amazon Rekognition API 进行文本检测和 OCR 这篇博客将介绍如何 使用Amazon Rekognition API 进行文本检测和 OCR 包括如何创建 Amazon Rekognition密钥 安装boto3
  • Java 中的集合框架有哪些?(十四)

    Java 中的集合框架包含了各种不同类型的集合和数据结构 用于存储和处理数据 这些集合和数据结构可以提高程序的性能和可读性 并且可以方便的进行数据操作和算法实现 本文将介绍 Java 中的集合框架 以及各种不同类型的集合和数据结构 Java
  • Vue父子组件传值---- $listeners子传父的父

    最近在写vue子组件给父组件传值时 一不小心写了五个组件 这个时候用到了子组件给父组件传值 其中不乏子组件跨过它的父组件 给它的父组件的父组件传值 也就是给它的爷爷传值 听到这里是不是快晕了 来 上干货 这是demo1 也是最底层的子组件
  • JavaSE - 集合类-单列集合框架

    JavaSE 集合类 单列集合框架 本节学习目标 了解Java单列集合框架结构 了解并掌握Collection接口及其方法 了解并掌握List集合 接口 及其方法 了解并掌握Set集合 接口 及其方法 了解并掌握Queue集合 接口 及其方
  • 【Hexo github】进行SSH认证时报错git操作提示git@github.com: Permission denied (publickey)(已解决)

    进入git bash界面然后 SSH keys 1 git config global list 2 git config global user name yourname git config global user email ema
  • Vue3+swiper5 异步请求数据后轮播图出现无分页器小圆点和无法滑动的问题,如果有默认图片则从最后一张切换到第一张时会展示默认图片

    一 场景描述 异步请求获取到11张图片 页面播图无分页器小圆点和无法正常滑动 package json devDependencies vue cli plugin babel 4 5 13 vue cli plugin router 4
  • 30,31-添加类功能视图

    这节分两部分 一 如何将代码从关卡蓝图转到类蓝图中 二 如何在类蓝图中切换灯光 1 通过判断和灯的距离切换灯光 2 通过文本提示切换灯光 先看第一个问题 如何将代码从关卡蓝图转到类蓝图中 其实这个很好理解 关卡蓝图相当于main 函数 关卡
  • Springboot + MySQL+ JPA Ⅳ find自带方法详解

    find是CRUD中的R 是使用得最多的方法 此篇先整理下自带的find方法 不需要在dao层写对应接口 后续会整理下拓展方法 一 getById 通过id进行单个查询 跟findById差不多 返回值类型不一样 service层 Tran
  • sqli-labs: Less 21-65 通关教程

    第二十一关 cookie注入 YOUR COOKIE uname RHVtYg and expires Sat 16 Jul 2016 08 32 26 注 RHVtYg 是 Dumb 经Base64加密后的值 和上关又是差不多 base6
  • python匹配ip地址

    ip地址是用3个 号作为分隔符 分割4个数字 每个数字的取值在 0 255 一般日志文件中的ip地址都是有效的ip地址 不需要我们再去验证 因此 若从日志文件中提取ip 那么可以简单写成这样 gt gt gt import re gt gt
  • unity2022.1.8之后版本的新的输入行为控制对象变化

    文章目录 unity2022 1 8之后版本的新的输入行为控制对象变化 怎么导入 如何使用 unity2022 1 8之后版本的新的输入行为控制对象变化 我们先了解大概的逻辑 我们要设置触发行为的方式并且让他和对象的行为绑定 再将行为和对象
  • A complete log of this run can be found in

    安装element ui时遇到的问题 解决方法 接下来测试一下 问题解决
  • 使用OpenCV的GrabCut算法去除图像背景

    使用OpenCV的GrabCut算法去除图像背景 图像分割是计算机视觉中的重要任务之一 它可以将图像分割成不同的区域 并对这些区域进行进一步的分析和处理 其中一种常用的图像分割方法是GrabCut算法 它是一种基于图割的迭代算法 可以有效地
  • 对象引用与对象存放的地址和区别

    在java的学习当中 很多时候并没有能很好分清把对象和对象的引用 如果没能很好认识分清这两者的关系 就可能会很难理解一些指针的移动的代码 JAVA基本类型的变量的时其变量名及值 变量名及值是两个概念 是放在方法栈中 引用类型所声明的变量 该
  • 【mySQL】C++ 操作mySQL

    目录 通过mySQL 库 简介 安装和配置 linux环境 WIN32环境 C 调用mysql 通过Mysql connector c 库 前言 Connector C 使用 3 4 静态库和动态库 动态库 创建项目和配置 代码编写 使用中
  • C51定时器与计数器(学习笔记)

    1 什么是定时器与计数器 1 定时器与计数器都是soc当中的一个内部外设 计数器顾名思义是用来计数的 就和我们的秒表一样 假如定时20秒 当我们按下秒表开始计数时 数秒的过程就是计数 计时器 当秒表数到20时 定时器 就自动暂停 2 工作模
  • Redis系列--新数据类型详解

    一 Bitmaps 一 简介 计算机存储数据时 都是以二进制位表示 Redis提供了Bitmaps这个 数据类型 可以实现对位的操作 1 Bitmaps本身不是一种数据类型 实际上它就是字符串 key value 但是它可以对字符串的位进行