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

8、Redis的HyperLogLog、事务Multi、管道Pipeline,以及Redis7.0特性

一、高级数据结构:HyperLogLog(基数统计)

核心特性
  1. 数据结构实质

    • 底层存储为 String 类型,用于海量数据去重计数
    • 牺牲精确性换取超高空间效率(标准误差 0.81%)。
  2. 核心原理

    • 伯努利实验 + 极大似然估计:通过计算二进制串首个 1 的位置(概率 $ \approx \frac{1}{2^n} $)估算基数。
    • 分桶优化:将数据哈希后分散到多个桶(默认 16384 桶),避免单一估计值偏差,提升精度。
  3. 应用场景

    • UV(用户访问量)统计:替代 SET 存储用户ID,内存占用极低(例:100万数据约 12KB)。
    • PV(页面访问量):需用计数器(如 INCR),HyperLogLog 不适用。

操作命令
命令作用示例
PFADD key value [value...]添加元素PFADD uv:page1 "user1" "user2"
PFCOUNT key [key...]统计基数PFCOUNT uv:page1 → 返回 2
PFMERGE destkey srcKey [srcKey...]合并多个键PFMERGE uv:total uv:page1 uv:page2
注意事项
  • 重复插入自动去重PFADD 相同值不影响统计结果。
  • 内存优势:100万数据内存占用约 12KB(16384 桶 × 6bit/桶)。

二、Redis事务Multi

1. 基本事务操作
  • 开启事务MULTI → 返回 OK,进入命令队列模式。
  • 命令入队:后续命令返回 QUEUED,暂存服务端缓存。
  • 提交执行EXEC 一次性执行队列中所有命令。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET name "Alice"
QUEUED
127.0.0.1:6379(TX)> INCR counter
QUEUED
127.0.0.1:6379(TX)> EXEC  # 提交事务
1) OK
2) (integer) 1

2. 事务错误处理
错误类型表现处理方式
命令语法错误(如 SETT key value入队时即报错,EXEC 拒绝执行全体命令回滚
运行时错误(如对字符串执行 ZADD错误命令失败,其他命令正常执行无回滚(部分成功)
# 运行时错误示例(类型不匹配)
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET msg "hello"  # 正确命令
QUEUED
127.0.0.1:6379(TX)> ZADD msg 100 "world"  # 对字符串执行 ZADD
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK                   # SET 执行成功
2) (error) WRONGTYPE... # ZADD 执行失败

3. Watch 命令(乐观锁)
  • 作用:监视一个或多个 Key,若在 MULTI-EXEC 期间被其他客户端修改,则事务失败。
  • 流程
    1. WATCH key 监视 Key。
    2. MULTI 开启事务 → 若 Key 被修改,事务自动失效。
    3. EXEC 返回 (nil) 表示执行失败。
# 客户端1
127.0.0.1:6379> WATCH balance
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> DECRBY balance 50  # 扣款 50# 客户端2(在 EXEC 前修改 balance)
127.0.0.1:6379> INCRBY balance 100  # 增加余额# 客户端1提交事务
127.0.0.1:6379(TX)> EXEC
(nil)  # 因 balance 被修改,事务失败

4. 事务使用建议
  • 避免使用 Redis 事务
    不支持回滚、运行时错误仅部分失败,不符合 ACID。
  • 替代方案
    • Lua 脚本(原子执行复杂逻辑)。
    • 7.0 函数库(支持分布式限流、原子下单等)。

三、Pipeline管道

1. 核心概念
  • 本质客户端技术,用于优化网络传输效率。
  • 原理:将多个命令打包成单次网络请求发送给 Redis 服务端,服务端按顺序执行后,将结果一次性返回客户端。
  • 与事务区别
    特性Pipeline事务 (MULTI/EXEC)
    执行层面网络传输优化服务端命令队列
    原子性❌ 命令独立执行⚠️ 队列整体执行(非严格原子)
    错误处理失败命令不影响其他语法错误全体回滚,运行时错误部分失败
    性能影响⬆️ 显著提升吞吐量⬇️ 增加服务端内存压力

2. 工作流程
1. 打包命令:
SET a 1
GET b
INCR c
2. 顺序执行所有命令
3. 批量返回:
OK
'valueb'
2
客户端
服务端
执行结果
3. 性能优势
  • 减少网络延迟
    N 条命令的耗时 ≈ 1次网络往返 + N 条命令执行时间
    (对比普通模式:N次网络往返 + N条命令时间)
  • 基准测试(本地环境示例):
    命令数量普通模式耗时Pipeline 耗时提升倍数
    1,000100ms5ms20×
    10,0001000ms50ms20×

4. 使用示例
命令行演示
# 开启Pipeline(使用echo和nc工具)
(echo -en "SET key1 hello\r\nGET key1\r\nINCR counter\r\n"; sleep 1) | nc 127.0.0.1 6379# 返回结果(一次性接收):
+OK
$5
hello
:1

5. 适用场景
  1. 批量数据导入

  2. 聚合查询优化

  3. 与事务结合使用


6. 注意事项
  • 非原子性:其他客户端命令可能在 Pipeline 执行期间插入
  • 内存控制:避免单次 Pipeline 包含过多命令(建议分批)

四、Pipeline vs Mult

特性PipelineMulti
本质客户端批量发送命令(网络优化)服务端事务机制
原子性命令队列整体执行
错误处理命令独立执行/失败语法错误全体回滚,运行时部分失败
组合使用可将 MULTI/EXEC 放入 Pipeline 减少网络往返

五、Redis 7.0 新特性

  1. 分片 AOF
    • 将 AOF 文件拆分为多个碎片,提升持久化效率和恢复速度。
  2. 函数库(Redis Functions)
    • 支持预加载 Lua 脚本为函数,实现复杂原子操作(如分布式限流器)。
  3. 命令扩展
    • ZMPOP(阻塞式弹出有序集合元素)、ZINTERCARD(交集基数统计)等。

总结

组件核心价值适用场景
HyperLogLog极低内存消耗统计海量 UV去重计数(误差容忍场景)
事务Multi简单命令组合执行需谨慎使用(推荐 Lua 替代)
Pipeline提升批量命令网络吞吐量批量操作优化
http://www.dtcms.com/a/320155.html

相关文章:

  • DoubleTrouble靶机
  • 【R语言】重新绘制高清MaxEnt的单因素响应曲线图像
  • 最佳左前缀法则(Optimal Left-Prefix Rule)
  • 【Dijkstra】 Shortest Routes I
  • 5种将Android联系人传输到电脑的方法
  • 《C语言》函数练习题--4
  • Debain12 api方式部署redis服务
  • 【高等数学】第八章 向量代数与空间解析几何——第二节 数量积 向量积 混合积
  • 耐压击穿测试在不同行业中的具体应用有哪些差异?
  • Clock斗篷技术:助力跨境电商营销推广的智慧策略
  • 当文档包含表格时,如何结合大模型和OCR提取数据?
  • C语言指针:补充
  • Day 34:GPU训练与类的call方法
  • [特殊字符] 未来图钉式 AI 时代的智能生态布局:副脑矩阵与人机共振的系统构想
  • USB2.0 和 USB3.0 枚举对比
  • 数据标注之数据集的类型与如何标注
  • Ubuntu24.04的“errors from xkbcomp are not fatal to the X server”终极修复方案
  • 【驱动】RK3576-Debian系统使用ping报错:socket operation not permitted
  • 3_steels_detect_CSDN_20250807_165405
  • spring cache(二)核心接口
  • Claude Code MCP 网络搜索配置命令
  • Qwen3-235B-A22B-Instruct-2507模型介绍
  • 【更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。】
  • 【网络编程】一请求一线程
  • 【洛谷题单】--分支结构(一)
  • 《网络空间测绘技术白皮书》
  • Docker容器强制删除及文件系统修复完整指南
  • 8. 字符串转换整数 (atoi)
  • 大模型LL04 微调prompt-Tuning方法入门(背景与发展)
  • 【自动驾驶】《Sparse4Dv3》代码学习笔记