pipeline解决Redis频繁命令往返导致的性能瓶颈
发表于|更新于|后端
|浏览量:
客户端和服务端交互模型

Redis 的 pipeline 交互模型





Redis pipeline 与原生批量mset等等命令对比
- 原生批量命令是原子性,pipeline 是非原子性的
- 原生批量命令一次只能执行一种命令,pipeline 支持批量执行不同命令
- 原生批命令是服务端实现,而 pipeline 需要服务端与客户端共同完成
需要注意:
- Redlis 事务是具有隔离性的,在执行过程中不会穿插执行其他客户瑞发送的命令
- 使用 pipeline 组装的命令个数不能太多,不然数据量过大
- pipeline 会按照指令缓冲的顺序执行,但是可能会穿插其他客户端发送来的命令,即时序性不一定能够保证
- pipeline 执行中间某一个指令出现异常,将会继续执行后续的指令,即不能保证原子性
文章作者: 褚成志
相关推荐
2026-04-09
Redis监控
视图预览阿里云 Redis 标准版指标展示,包括CPU 使用率,内存使用率,磁盘读写,网络流量,每秒访问次数等 版本支持操作系统支持:Linux 前置条件 服务器 <安装 Datakit> 服务器 <安装 Func 携带版> 阿里云 RAM 访问控制账号授权 RAM 访问控制 登录 RAM 控制台 https://ram.console.aliyun.com/users 新建用户:人员管理 - 用户 - 创建用户 保存或下载 AccessKey ID 和 AccessKey Secret 的 CSV 文件 (配置文件会用到) 用户授权 (只读访问所有阿里云资源的权限) 安装配置说明: 示例 Linux 版本为:CentOS Linux release 7.8.2003 (Core) 通过一台服务器采集所有阿里云 Redis 标准版数据 部署实施脚本市场 登录 Func,地址 http://ip:8088 开启脚本市场,管理 - 实验性功能 - 开启脚本市场模块 **依次添加 **三个脚本集 观测云集成 (核心包) 观测云...
2026-04-09
布隆过滤器
布隆过滤器布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时,在布隆过滤器里做个标记,这样下次查询数据是否在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,说明不在数据库中。 第一步,使用 N 个哈希函数分别对数据做哈希计算,得到 N 个哈希值; 第二步,将第一步得到的 N 个哈希值对位图数组的长度取模,得到每个哈希值在位图数组的对应位置。 第三步,将每个哈希值在位图数组的对应位置的值设置为 1; 查询的时****候只要有一个为 0,就认为数据 x 不在数据库中。 没有的一定没有,有的也可能没有 黑名单,爬虫去重 只有加入和查询,不要求删除, 极大减少内存, 但是必须允许一定程度的失误率,会误杀好人,但是不会漏杀坏人 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你** “某样东西****一定不存在或者可能存在****”。** 如果存在那就是可能存在(hash的碰撞) 如果不存在那就一定不存在 相比于传统的...
2026-04-09
Redis核心数据类型的底层编码(C源码)(重要)
Redis K-V 底层设计原理:字典hashtablekey:string val:string、hash、list、set、sorted set map 就是字典,还要支持海量数据的存储,查找和插入删除(hashtable) hashtable 里面 hash(key) % hashtable.size ,最后的得到的就是[0, hashtable.size - 1] hash碰撞的时候,线性探测或者链表法。Redis 使用的是链表法 注意这个hashtable里面的value的类型是五种常见类型谁都可以放,因为最后都是使用指针指向的,value的包装类里面会执行是什么数据类型。 redisDb–dict–dictht–dictEntry–redisObject Redis 渐进式rehash及动态扩容机制如图所示, 扩容时机:在使用的容量是大小的一样的时候就会扩容, 扩容大小:扩容的时候变为原来的2倍, 渐进式迁移:新建数组之后,数据迁移的时候,一个链表上的数据是一个桶为单位转移的,不能一下全部转移会导致单线程阻塞,所以有了渐进式rehash的设计,dict字典包...
2026-04-09
Redis实现分布式锁以及Redis客户端比较
若锁存在,且唯一标识匹配:则先将锁重入计数减1local counter = redis.call(‘hincrby’, KEYS[1], ARGV[3], -1);if (counter > 0) then – 锁重入计数减1后还大于0:表明当前线程持有的锁还有重入,不能进行锁删除操作,但可以友好地帮忙设置下过期时期 redis.call(‘pexpire’, KEYS[1], ARGV[2]); return 0;else – 锁重入计数已为0:间接表明锁已释放了。直接删除掉锁,并广播解锁消息,去唤醒那些争抢过锁但还处于阻塞中的线程 redis.call(‘del’, KEYS[1]); redis.call(‘publish’, KEYS[2], ARGV[1]); return 1;end; return nil; 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455...
2026-04-09
Redis不同数据类型代码场景实践
string博客不好的实现12345jedis.set("key1", "value1");jedis.get("key1");jedis.del("lock_test");jedis.incr("blog_id_counter");Long key = jedis.incrBy("key", 1); 1jedis.set("lock_test", "value_test", SetParams.setParams().nx()); 12345678Long publishBlogResult = jedis.msetnx("article:1:title", "学习Redis", "article:1:content", "如何学好redis的使用", "art...
2026-04-09
Redis删除特定的前缀
redis没有提供可以直接使用的,需要自己封装: 不能使用keys ,而是使用scan Redis命令对应的命令: 12345redis-cli --raw keys "*prefix*" | xargs redis-cli del# SCAN cursor [MATCH pattern] [COUNT count]redis-cli --scan --pattern "*prefix*" | xargs -L 2000 redis-cli del# 其中xargs -L指令表示xargs一次读取的行数,也就是每次删除的key数量,一次读取太多xargs会报错 类似的SCAN命令,对于Redis不同的数据类型还有另外几个SSCAN、HSCAN和ZSCAN,使用方法类似: sscan ops-coffee 0 MATCH v1* java 实现123456789101112131415161718192021222324252627282930313233343536//redis-cli --raw keys "ops-coff...
公告
👋 你好,我是褚成志,一名专注于云原生与后端架构的工程师。
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
