Redis Pipelining
2024-08-28 09:56:05
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。
Redis 官方文档:https://redis.io/topics/pipelining
提高性能
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
管道技术最显著的优势是提高了 redis 服务的性能。
Redis 事务
简介
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
命令行
在不使用 Pipelining 时,执行多条命令是一条一条依次执行的
redis 127.0.0.1:6379> INCR X
(integer) 1
redis 127.0.0.1:6379> INCR X
(integer) 2
redis 127.0.0.1:6379> INCR X
(integer) 3
redis 127.0.0.1:6379> INCR X
(integer) 4
使用 Pipelining 后,可以一次执行多条命令
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> INCR X
QUEUED
redis 127.0.0.1:6379> INCR X
QUEUED
redis 127.0.0.1:6379> INCR X
QUEUED
redis 127.0.0.1:6379> INCR X
QUEUED
redis 127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) (integer) 4
通过 Python
一个程序取数据,一个程序放数据,放入数据和修改数据之间间隔 3s
示例:
import time
import redis
pool = redis.ConnectionPool(host='localhost', port=6379)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set('num', '1')
time.sleep(3)
pipe.set('num', '2')
pipe.execute()
先启动,用来监听数据:
import redis
import time
pool = redis.ConnectionPool(host='localhost', port=6379)
r = redis.Redis(connection_pool=pool)
num = None
r.delete('num') # 删除之前的数据
while not num or num == '1':
num = r.get('num')
time.sleep(1)
if num:
print(num.decode())
else:
print('no data')
通过运行结果看到并没有获得第一次的数据,而是直接获得修改后的数据
命令
DISCARD
: 取消事务,放弃执行事务块内的所有命令
EXEC
: 执行所有事务块内的命令
MULTI
: 标记一个事务块的开始
UNWATCH
: 取消 WATCH 命令对所有 key 的监视
WATCH
: 监视一个或多个 key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
最新文章
- 读书笔记--SQL必知必会09--汇总数据
- BootStrap table使用
- python 模块包裹
- js原生方法传参的细节(面试必问)
- Hibernate中saveOrUpdate()和merge()的区别
- 腾讯优测优分享 | 探索react native首屏渲染最佳实践
- Eclipse 调整代码颜色的地方
- unity3d中获得物体的尺寸(size)
- HTML+CSS 整站 步骤
- 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中
- python多线程实现售票
- HTTP的长连接,你不知道的连接。。。
- C++ 精英化趋势
- day13-迭代器及生成器
- linux下tomcat的https访问
- B - Glider Gym - 101911B(二分)
- Liblinear and Libsvm-rank训练数据的bash代码
- Linux的Namespace与Cgroups介绍
- <;4>;Lua表
- 【每日一学】pandas_透视表函数&;交叉表函数
热门文章
- 15.flag在index里
- BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
- python第三次作业-mooc笔记
- 用OC实现双向链表:构造链表、插入节点、删除节点、遍历节点
- 敏捷软件开发_实例2<;四>;
- C#程序员在老项目中用到VB遇到的一次坑
- 1.java容器基本内容
- VectorMap.js 矢量地图库 – 快速入门
- 【转载】每个 Android 开发者必须知道的消息机制问题总结
- 个人项目-WC.exe (Java实现)