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

  • 相关阅读:
    一次与客户端合作的走坑之旅!
    ecplise打不开提示Eclipse中...No java virtual machine was found...
    eclipse配置tomcat,让java web项目运行起来!
    Tomcat v9.0 Could not publish to the server. java.lang.IndexOutOfBoundsException
    Certbot让网站拥有免费https证书
    Nginx访问权限配置
    hexo博客pure主题解决不蒜子计数不显示的问题
    Mono.Cecil 修改目标.NET的IL代码保存时报异常的处理。
    [转载]斐讯K2 A2版免TTL刷BREED不死Bootloader
    各种UserAgent的列表
  • 原文地址:https://www.cnblogs.com/dbf-/p/11170225.html
Copyright © 2020-2023  润新知