【Redis】十大数据类型(下篇)
文章目录
- redis位图(bitmap) --- 底子还是string
- 基本命令图示
- `setbit key offset value` setbit 键 偏移位 只能零或者1
- `getbit key offset` 查看
- 获取字符串长度 `strlen`
- 统计key中包含1的个数 `bitcount key`
- `bitop` 统计两个比特key是否都为1
- 技术落地:打卡签到,频繁修改数据库的,结果只有0和1
- redis基数统计(HyperLogLog) --- 底子是string
- UV:Unique Visitor,独立访客;统计搜索词条
- 基数统计算法
- 基数
- 基本命令图示
- 基数落地:天猫统计亿级UV
- redis地理空间 (GEO) --- 底子上是有序集合
- 获取经纬度
- 添加经纬度坐标 `GEOADD key 经度1 纬度1 位置名称1 经度2 纬度2 位置名称2...`
- 处理中文乱码
- `GEOPOS key value1 value2` 从键里面返回所有给定位置元素的位置 (经度和纬度)
- `GEODIST key value1 value2 [m | km | ft | mi] ` 返回两个给定位置之间的距离
- `GEORADIUS key 经度 纬度 10km...` 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素
- `GEORADIUSBYMEMBER key value 10km ...` 跟GEORADIUS类似
- `GEOHASH key value1 value2` 返回一个或多个位置元素的 Geohash 表示
- redis流 (Stream) --- 自成一脉stream
- 底层结构与原理
- 基础命令图示
- 特殊符号
- 向队列添加消息到队列末尾 `XADD key * id 1 cname z3`
- 范围检索 `XRANGE key start end [COUNT count]`
- `XREVRANGE KEY + - `
- `XDEL key MQID` 按照主键删除
- `XLEN key` 消息队列长度
- 截取 `XTRIM key maxlen|minlen 2`
- 读取消息(阻塞、非阻塞),只会返回ID大于某值的消息 `XREAD [COUNT count] stream key ID`
- 消费组执行-`XGROUP`
- 消费组执行-`XREADGROUP GROUP`
- 重要问题-ACK机制
- `XPENDING` 查询每个消费组内所有消费者 r已读取、但尚未确认]的消息
- `XACK` 向消息队列确认消息处理已完成
- `XINFO stream key` 打印出详情信息
- redis位域(bitfield)
- 应用、用途 --- 位域修改、溢出控制
- 基本语法 `BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]`
- `BITFIELD key [GET type offset]`
- `BITFIELD key [SET type offset value]`
- `BITFIELD key [INCRBY type offset increment]`
- `溢出控制OVERFLOW [WRAPISAT|FAIL]`
redis位图(bitmap) — 底子还是string
由0和1状态表现的二进制位的bit数组
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。

-
基本命令图示

-
setbit key offset valuesetbit 键 偏移位 只能零或者1Bitmap的偏移量是从零开始算的

-
getbit key offset查看 -
获取字符串长度
strlen不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容

-
统计key中包含1的个数
bitcount key
-
bitop统计两个比特key是否都为1
-
技术落地:打卡签到,频繁修改数据库的,结果只有0和1
redis基数统计(HyperLogLog) — 底子是string
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
记录的不是数据本身,而是统计数;是去重脱水后的真实数据
统计本身也存在些许误差,误差范围在0.81%
-
UV:Unique Visitor,独立访客;统计搜索词条
-
基数统计算法

-
基数
是一种数据集,去重复后的真实个数

-
基本命令图示


-
基数落地:天猫统计亿级UV
redis地理空间 (GEO) — 底子上是有序集合
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括
添加地理位置的坐标。
获取地理位置的坐标。
计算两个位置之间的距离。
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
核心思想就是将球体转换为平面,区块转换为一点


-
获取经纬度
百度提供的api:https://api.map.baidu.com/lbsapi/getpoint/
-
添加经纬度坐标
GEOADD key 经度1 纬度1 位置名称1 经度2 纬度2 位置名称2...
处理中文乱码

-
GEOPOS key value1 value2从键里面返回所有给定位置元素的位置 (经度和纬度)
-
GEODIST key value1 value2 [m | km | ft | mi]返回两个给定位置之间的距离ft:英尺;mi英里

-
GEORADIUS key 经度 纬度 10km...以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 descWITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。 WITHCOORD: 将位置元素的经度和维度也一并返回。 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大 COUNT 限定返回的记录数。
-
GEORADIUSBYMEMBER key value 10km ...跟GEORADIUS类似
-
GEOHASH key value1 value2返回一个或多个位置元素的 Geohash 表示geohash算法生成的base32编码值


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


-
基础命令图示


-
特殊符号
符号 含义 -、+最小和最大可能出现的Id $$表示只消费新的消息,当前流中最大的id,可用于将要到来的信息>用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后ID *用于XADD命令中,让系统自动生成id -
向队列添加消息到队列末尾
XADD key * id 1 cname z3-
消息ID必须要比上个 ID 大
-
默认用星号表示自动生成规矩
*用于XADD命令中,让系统自动生成 id
-
客户端显示传入规则:
Redis对于ID有强制要求,格式必须是时间戳-自增Id这样的方式,且后续ID不能小于前一个ID
-
-
范围检索
XRANGE key start end [COUNT count]- 用于获取消息列表 (可以指定范围忽略删除的消息
- start 表示开始值,-代表最小值
- end 表示结束值,+代表最大值
- count 表示最多获取多少个值

-
XREVRANGE KEY + -与XRANGE 的区别在于,获取消息列表元素的方向是相反的,end在前,start在后
-
XDEL key MQID按照主键删除
-
XLEN key消息队列长度
-
截取
XTRIM key maxlen|minlen 2
允许的最小id,从某个id值开始比该id值小的将会被抛弃

-
读取消息(阻塞、非阻塞),只会返回ID大于某值的消息
XREAD [COUNT count] stream key ID
非阻塞

阻塞

-
消费组执行-
XGROUP
- $表示从Stream尾部开始消费
- 0表示从Stream头部开始消费
- 创建消费者组的时候必须指定 ID, ID 为 0 表示从头开始消费,为 $ 表示只消费新的消息,队尾新来
-
消费组执行-
XREADGROUP GROUP-
>表示从第一条尚未被消费的消息开始读取 -
消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息

-
但是,不同消费组的消费者可以消费同一条消息

-
负载均衡
让组内的多个消费者共同分担读取消息,所以,我们通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的

-
-
重要问题-ACK机制

-
XPENDING查询每个消费组内所有消费者 r已读取、但尚未确认]的消息查询每个消费组内所有消费者 r已读取、但尚未确认]的消息

查看某个消费者具体读取了哪些数据

下面抓图所示:consumer2已读取的消息的 ID是1659430293537-0
- 一旦消息1659430293537-0被consumer2处理了consumer2就可以使用 XACK 命令通知 Streams,然后这条消息就会被删除

-
XACK向消息队列确认消息处理已完成

-
XINFO stream key打印出详情信息
redis位域(bitfield)
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
将一个Redis字符串看作是一个由二进制位组成的数组并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改

-
应用、用途 — 位域修改、溢出控制

hello 等价于 0110100001100101011011000110110001101111
-
基本语法
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
-
BITFIELD key [GET type offset]hello 等价于 0110100001100101011011000110110001101111


-
BITFIELD key [SET type offset value]
-
BITFIELD key [INCRBY type offset increment]
-
溢出控制OVERFLOW [WRAPISAT|FAIL]-
WRAP:使用回绕 (wrap around) 方法处理有符号整数和无符号整数的溢出情况

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

-
FAIL:命令将拒绝执行那些会导致上溢或者下溢情况出现的计算并向用户返回空值表示计算未被执行

-
相关文章:
【Redis】十大数据类型(下篇)
文章目录redis位图(bitmap) --- 底子还是string基本命令图示setbit key offset value setbit 键 偏移位 只能零或者1getbit key offset 查看获取字符串长度 strlen统计key中包含1的个数 bitcount keybitop 统计两个比特key是否都为1技术落地:打卡签到,频…...
【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”
【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第一大问代码分享(后续更新LSTMinformer多元预测多变量模型) PS: 代码全写有注释,通俗易懂,包看懂!!!&…...
Python入门到高级【第一章】
预计更新第一章. Python 简介 Python 简介和历史Python 特点和优势安装 Python 第二章. 变量和数据类型 变量和标识符基本数据类型:数字、字符串、布尔值等字符串操作列表、元组和字典 第三章. 控制语句和函数 分支结构:if/else 语句循环结构&#…...
【泰凌微TLSR8258 zigbee】OTA升级操作方法
目录 程序启动模式多地址启动模式Bootloader 启动模式多地址启动模式 Flash 分布Bootloader 启动模式Flash分布模式OTA升级OTA初始化OTA ServerOTA ClientOTA升级固件生成程序启动模式 在介绍OTA升级操作方法前,我们先介绍一下程序的启动模式,以及不同启动模式的优缺点。 多…...
网络基础设施监控
在过去的几十年里,网络基础设施在规模和功能方面都变得复杂起来。不断增长的业务需求和不断增长的技术能力推动了这种快速增长,监控网络基础设施以确保其最佳性能和最大效率已成为任何希望成为行业领跑者的组织不可或缺的优先事项。 什么是网络基础设施…...
OPNET Modeler 例程——创建一个包交换网络
文章目录一、例程简介二、创建新的包格式三、创建新的链路模型四、创建中心交换节点模型五、创建中心交换节点的进程模型六、创建周边节点模型七、创建周边节点进程模块八、创建网络模型九、收集统计量十、配置并仿真总结一、例程简介 本例程将仿真一个简单的包交换网络&#…...
JSON 基础结构
什么是JSON JSON,说白了就是JavaScript用来处理数据的一种格式,这种格式非常简单易用。 JSON,大部分都是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进行处…...
雷达基础知识
雷达频率划分 以下是按照频率和波长划分雷达频段的表格: 波段名称频率范围(GHz)波长范围(cm)应用领域VHF0.03 - 0.3100 - 10气象雷达、空管雷达、航空雷达UHF0.3 - 3100 - 10航空雷达、海上雷达、地面雷达、火控雷达…...
【二阶锥规划】考虑气电联合需求响应的气电综合能源配网系统协调优化运行【IEEE33节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
qt 编译器 调试器
电脑版本:win10 64位 qt版本:based on Qt 5.14.0(msvc 2017, 32位) Qt Creator 4.11.0 qt安装包:qt-opensource-windows-x86-5.9.9.exe 安装过程一路next,安装完成后,默认使用的…...
低代码平台助力AIGC:让人工智能技术更加普及和高效
今年人工智能的风是吹了一波又一波,从ChatGPT到文心一言,短短四个多月的时间,GPT完成了从3.0、3.5到4.0的推新发布,一步步刷新了民众对于目前人工智能技术发展的认知底线,让人们直观地感受到了人工智能技术的蓬勃发展。…...
Qt中Model/View结构
Qt中Model/View结构 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存…...
中纬ZOOM35全站仪参数和使用说明书
免棱镜测程采用全新EDM,明显提升测距功能。极细可见激光免棱镜测程最高可达1000m,同等测程下无棱镜精度较高。 绝对编码度盘中纬静态条码式码盘测角,开机无需初始化,利用同样技术的徕卡全站仪,测角精度可高达0.5&#…...
【Note5】网络,并发/IO,内存,linux/vi命令,正则,Hash,iNode,文件查找与读取,linux启动/构建
文章目录1.局域网:CSMA/CD2.互联网:ARP,DHCP,NAT3.TCP协议:telnet,tcpdump,syn/accept队列4.HTTPS协议:摘要(sha、md5、crc)。win对文件进行MD5校验用自带的c…...
华为MRS_HADOOP集群 beeline使用操作
背景 由于项目测试需要,计划在华为hadoop集群hive上创建大量表,并且每表植入10w数据,之前分享过如何快速构造hive大表,感兴趣的可以去找一下。本次是想要快速构造多表并载入一些数据。 因为之前同事在构造相关测试数据时由于创建…...
PCB模块化设计10——PCI-E高速PCB布局布线设计规范
目录PCB模块化设计10——PCI-E高速PCB布局布线设计规范1、PCI-E管脚定义2、PCI-E叠层和参考平面3、 PCB设计指南1、阻抗要求2、线宽线距3、长度匹配4、走线弯曲角度5、测试点、过孔、焊盘6、AC去耦电容放置方法7、金手指和连接器的注意事项8、其他的注意事项PCB模块化设计10——…...
Java简介
Java简介 Java是一种面向对象的编程语言,由Sun Microsystems于1995年发布。Java设计的初衷是为了开发可移植、高性能的应用程序。Java代码可以在不同的操作系统上运行,包括Windows、Linux、Mac等。 Java是一种广泛使用的编程语言,用于开发各…...
python框架有哪些,常用的python框架代码
Python的应用已经相当广泛了,可以做很多事情,而 Python本身就是一个应用程序,我们也可以说 Python是一个高级语言。由于 Python有很多包,所以我们不能把所有的 Python包都了解一下,也不能把所有的包都读一遍࿰…...
jsp设计简单的购物车应用案例
代码解释 <%request.setCharacterEncoding("UTF-8");if (request.getParameter("c1")!null)session.setAttribute("s1",request.getParameter("c1"));if (request.getParameter("c2")!null)session.setAttribute("…...
VueX是什么?好处?何时使用?
VueX相关1、VueX是什么?2、使用VueX统一管理状态的好处3、什么样的数据适合存储到Vuex中?1、VueX是什么? VueX是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。 如果没有VueX…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
