【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…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
