zoukankan      html  css  js  c++  java
  • Redis Pipelining

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

  • 相关阅读:
    【内推】平安产险大数据测试开发工程师,15-30k!
    python中的正则表达式(re模块)
    C#中ArrayList和string,string[]数组的转换
    C# 中的sealed修饰符学习
    面试题目记录
    C#中Internal class与静态类说明
    转载 C#使用Salt + Hash来为密码加密
    转载C# 对象转Json序列化
    使用https时,网站一些内容不能正常显示的问题
    转载 JQuery.data()方法学习
  • 原文地址:https://www.cnblogs.com/dbf-/p/11170225.html
Copyright © 2011-2022 走看看