Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

服务端处理命令,并将结果返回给客户端。

Redis 官方文档:https://redis.io/topics/pipelining

提高性能

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

管道技术最显著的优势是提高了 redis 服务的性能。

Redis 事务

简介

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  1. 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

命令行

在不使用 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 被其他命令所改动,那么事务将被打断

最新文章

  1. 读书笔记--SQL必知必会09--汇总数据
  2. BootStrap table使用
  3. python 模块包裹
  4. js原生方法传参的细节(面试必问)
  5. Hibernate中saveOrUpdate()和merge()的区别
  6. 腾讯优测优分享 | 探索react native首屏渲染最佳实践
  7. Eclipse 调整代码颜色的地方
  8. unity3d中获得物体的尺寸(size)
  9. HTML+CSS 整站 步骤
  10. 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中
  11. python多线程实现售票
  12. HTTP的长连接,你不知道的连接。。。
  13. C++ 精英化趋势
  14. day13-迭代器及生成器
  15. linux下tomcat的https访问
  16. B - Glider Gym - 101911B(二分)
  17. Liblinear and Libsvm-rank训练数据的bash代码
  18. Linux的Namespace与Cgroups介绍
  19. <4>Lua表
  20. 【每日一学】pandas_透视表函数&交叉表函数

热门文章

  1. 15.flag在index里
  2. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
  3. python第三次作业-mooc笔记
  4. 用OC实现双向链表:构造链表、插入节点、删除节点、遍历节点
  5. 敏捷软件开发_实例2<四>
  6. C#程序员在老项目中用到VB遇到的一次坑
  7. 1.java容器基本内容
  8. VectorMap.js 矢量地图库 – 快速入门
  9. 【转载】每个 Android 开发者必须知道的消息机制问题总结
  10. 个人项目-WC.exe (Java实现)