python使用redis做缓存_Python中的Redis客户端缓存(二)

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

处理失效

无效消息如何发送到被追踪的客户端取决于客户端正在使用的Redis序列化协议(RESP)。早期版本的Redis使用RESP2,但是它的后续版本RESP3已经存在于Redis 6中,并且Redis 7将完全不支持旧协议。

RESP3包含许多新功能,包括服务器在客户端现有连接上“推送”除了实际回复内容的附加信息。此通道用于在使用服务器辅助的客户端缓存功能时传递无效通知。

然而,由于RESP3比较新,目前只有少数客户端支持它,因此RSACSC也可以与RESP2一起工作。由于RESP2缺乏“推送”能力,RSACSC使用Redis中对PubSub的现有支持向相关方广播失效消息。

管理器的作用是处理失效和插槽映射的键。下面是它的样子:

管理器初始化会生成一个连接池,从该连接池为PubSub创建自己的客户端以及通过应用程序请求的任何后续缓存连接。它还维护一个名为slots的字典,该字典将一个slot number映射到它所保存的一组键名。最后,它维护LRU缓存实现的Cache类。

start()方法通过在单独的线程中监听invalidate PubSub通道来启动管理器,这并不奇怪。在该通道上截获的消息由_handler()方法处理。它依次调用invalidate()方法以使请求的插槽无效:

失效是要一个接一个地从相应的插槽集合中弹出键,然后从缓存中删除它们。最后,管理器暴露了一个工厂方法get_connection(),使用它来获取新的缓存连接:

一些评估

这篇文章并不是关于基准测试或Python本身的性能,但是理解该机制的影响是很重要的。为此,我在2019 MacBook Pro上使用了benchmark.py脚本,其中一个Redis实例使用默认值在本地运行(除了我关闭了快照功能)。

在执行测试之前,基准脚本用1000个键填充数据库,并将缓存管理器的容量设置为100。然后它运行几个计时测试来测量性能。对于两种类型的连接,每个测试都重复五次:常规连接和缓存连接。

第一个测试的结果实际上证明了缓存的一个缺点:缓存未命中。在这个测试中,我们对整个数据库中的每个键只读取一次,因此每次访问本地缓存都会导致未命中:

请注意,只计算最后一次运行的平均值,因此系列测试中的每一次都被视为热身。上面的平均值显示,每1000次读取,缓存未命中导致读取增加近13ms,大约18%的延迟增加。

但是,在适合缓存的数据集上重复测试(也就是说,只有100个键显示了更令人鼓舞的结果)。虽然第一次缓存运行显示延迟增加,但随后的运行中延迟减少两个数量级:

下一个测试名为eleven_reads,因为它会将数据库中的每个键读取一次,同时读取其他10个始终相同的键。这个高度集成的用例提供了缓存好处的一个更显著的证明(尽管这本身不是目的)。

最后一个测试加入了一个额外的写入操作,这将触发部分缓存的失效。缓存的延迟略有增加,这既是因为额外的write命令,也是因为需要重新提取缓存的内容:

部分思考

花时间缓存是有用处的。您可能已经熟悉了Redis的Keyspace notifications,它们是关于keyspace的事件,例如对PubSub通道上发送的键的修改。实际上,Keyspace notifications的使用方式与Redis服务器辅助客户端缓存的使用方式几乎相同,能获得类似的结果。

由于PubSub不是一种可靠的消息传输方式,使用Keyspace notifications或基于RESP2的RSACSC都可能导致失效通知丢失和内容过时。然而,随着RESP3的出现,只要连接处于活动状态,RSACSC通知就会被发送。任何断开连接都可以通过本地缓存重置轻松处理。

将RESP3从PubSub广播移到特定于连接的通知还意味着客户端将只获得感兴趣的插槽的失效通知。这意味着用于通信的资源消耗更少。

不管使用的是不是RESP版本,客户端作者都可以使用RSACSC进行缓存,而不仅仅是获取整个字符串。该机制不用了解用于存储密钥值的实际数据结构,因此所有核心Redis类型和模块声明的任何自定义类型都可以与之一起使用。

此外,客户机不仅可以缓存键值元组,还可以缓存请求及其响应(同时追踪所涉及的键)。这样做可以缓存GETRANGE返回的子字符串、通过LRANGE获得列表元素或任何其他类型的查询。

关于Redis的CRC64函数的一点笔记

我知道我不想在这个练习中实现CRC函数。我以为Python已经为我准备好了。

要查找哪个CRC Redis正在使用,只需查看它的源代码--在src/crc64.c文件开头:

我对“Python CRC64-jones”进行了快速搜索,在浏览完文档之后,我选择pip安装crcmod,这样我就可以使用它预定义的crc-64-jones摘要。

过了一段时间,我发现了我的东西不起作用的原因。通过对文档的仔细检查发现,crcmod使用了一个不同的多项式。他们在一起,你能看出区别吗?

此外,crcmod坚决拒绝使用Redis的多项式,并声称:

当然,后来我放弃并移植了Redis CRC64实现。不是困难任务:一个拷贝粘贴,几个搜索替换,一行实际代码重写。如果要使用RSACSC,请确保使用的CRC64实现签出到0xe9c6d914c4b8d9ca。

英文原文:https://engineering.redislabs.com/posts/redis-assisted-client-side-caching-in-python/

译者:QL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中有哪些函数关系,C语言中有哪些常用的函数

C语言中有哪些常用的函数发布时间:2020-11-17 17:01:32来源:亿速云阅读:107作者:小新这篇文章主要介绍C语言中有哪些常用的函数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要…

akka es/cqrs_在Akka中实现主从/网格计算模式

akka es/cqrs主从模式是容错和并行计算的主要示例。 模式背后的想法是将工作划分为相同的子任务,然后将其委派给从属。 这些从属节点或实例将处理工作任务,并将结果发送回主节点。 然后主节点将编译从所有从节点接收到的结果。关键是从节点仅知道如何处理…

05 HTML字符串转换成jQuery对象、绑定数据到元素上

1 要求 将一段 HTML脚本 封装成一个字符串&#xff0c;将这个字符串转换成一个jQuery对象&#xff1b;然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str <div id"box01">hello world</div>; //定义一个字符串 利用jQuery框架将字符…

python迭代器使用_Python迭代器的用法

我们在前面使用过语句“for x in列表对象”&#xff0c;这就表示列表对象是可迭代的(Iterable)。那么如何判断某个对象是否可迭代呢&#xff1f;答案是可以使用collections.Iterable类来判断。如下面的代码所示&#xff0c;列表是可迭代的&#xff0c;整数是不可迭代的&#xf…

c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...

佩尔方程讲解连接&#xff1a;若一个丢番图方程具有以下的形式&#xff1a;且为正整数&#xff0c;则称此方程为佩尔方程(英文&#xff1a;Pells equation 德文&#xff1a;Pellsche Gleichung) 若是完全平方数&#xff0c;则这个方程式只有解(实际上对任意的&#xff0c;都是解…

在Java EE 7中自动配置JMS资源

JMS 2.0&#xff08;Java EE 7平台的一部分&#xff09;引入了许多不错的功能 。 其中之一是能够声明JMS资源以进行自动部署。 Java EE 7之前的版本 使用Resource注入连接工厂 使用Resource查找目标位置&#xff08;队列/主题&#xff09; 拉出Session对象并使用它创建Messa…

python关键词提取源码_Python 结巴分词 关键词抽取分析

关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期&#xff0c;当时还不支持全文搜索的时候&#xff0c;关键词就可以作为搜索这篇论文的词语。因此&#xff0c;目前依然可以在论文中看到关键词这一项。除了这些&#xff0c;关键词…

安卓欢迎界面和activity之间的跳转问题

使用安卓的UI界面&#xff0c;就不得不了解activity&#xff0c;由于actvity就像是一个form表单一样&#xff0c;全部的UI都呈如今这里&#xff0c;他能够承载全部的UI控件。INtent就是一个中继站一样。他负责组件之间的沟通。以下我们来说一下一个actvity跳转到还有一个actvit…

C语言输出最后一个空格去掉,新人提问:如何将输出时每行最后一个空格删除...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

android 9.0 https 适配,如何适配 Android 9.0? 在 Android 9.0 上发生 SSL handshake timed out 异常怎么解决...

Android 9.0 开始&#xff0c;默认不允许明文传输&#xff0c;所以在建立网络连接时会使用 https 连接&#xff0c;同时进行安全认证。如果应用没有做对应处理&#xff0c;即会发生上述异常。解决方法有两种&#xff1a;一. 在应用里声明允许明文传输.1. 在应用的 res/xml 文件…

java 7.函数-递归_带有谓词的Java中的函数样式-第1部分

java 7.函数-递归您一直在听到将要席卷全球的函数式编程&#xff0c;而您仍然坚持使用普通Java&#xff1f; 不用担心&#xff0c;因为您已经可以在日常Java中添加一些功能样式。 此外&#xff0c;它很有趣&#xff0c;可以节省许多代码行并减少错误。 什么是谓词&#xff1f; …

大话oraclerac集群、高可用性、备份与恢复_数腾Oracle RAC数据库灾备解决方案

“一个系统包含很多模块&#xff0c;数据库、前端、缓存、搜索、消息队列等&#xff0c;每个模块都需要做到高可用&#xff0c;才能保证整个系统的高可用。”数据库作为现代信息社会的基石&#xff0c;几乎所有的计算机应用软件都构建于数据库系统之上&#xff0c;对于数据库而…

Python学习笔记(随机数)

random模块的作用是产生随机数。 import random num random.randint(1,100) random.randint(a, b)可以生成一个a到b间的随机整数&#xff0c;包括a和b。 a、b都必须是整数&#xff0c;且必须b≥a。当等于的时候&#xff0c;比如&#xff1a; random.randint(3, 3) 的结果就永远…

android.mk 比较字变量,粉丝投稿 | 谈谈Android.mk

原标题&#xff1a;粉丝投稿 | 谈谈Android.mk本文由公号【你看上去真美】(微信号&#xff1a;tmac_lover)粉丝投稿&#xff0c;目前工作是Android系统rom定制开发&#xff0c;有同行可以关注一下。1. 为什么是Android.mk不知道有没有人想过&#xff0c;Android源码里为什么每个…

guava API整理

1&#xff0c;大纲 让我们来熟悉瓜娃&#xff0c;并体验下它的一些API,分成如下几个部分&#xff1a; IntroductionGuava Collection APIGuava Basic UtilitiesIO APICache API2&#xff0c;为神马选择瓜娃&#xff1f; 瓜娃是java API蛋糕上的冰激凌&#xff08;精华&#xff…

python水印 resized_如何改进Python中的水印图像?

我正在使用python为来自this的水印图像源代码import Imageimport ImageEnhanceimport randomdef _percent(var):"""Just a simple interface to the _val function with a more meaningful name."""return _val(var, True)def _int(var):"&…

智能包装结构,提高可测性

有很多方法可以将整个应用程序分为多个包。 我们可以在许多编程博客和论坛上找到有关按功能或按层打包的优缺点的讨论。 我想从可测试性开始讨论这个主题&#xff0c;看看它是否会带来任何有意义的结果。 首先&#xff0c;让我们尝试描述我们通常希望跨不同层在应用程序中进行…

Android面试题Service,Android面试题-IntentService源码分析

自定义控件联网工具数据库源码分析相关面试题Activity相关面试题Service相关面试题与XMPP相关面试题与性能优化相关面试题与登录相关面试题与开发相关面试题与人事相关面试题人事面试宝典IntentService是继承于Service并处理异步请求的一个类&#xff0c;在IntentService内有一…

OpenGL中的Shader

http://blog.csdn.net/huangcanjun187/article/details/52474365 学习总结自&#xff1a;http://learnopengl.com/#!Getting-started/Hello-Triangle http://learnopengl.com/#!Getting-started/Shaders 继上篇文章中提到&#xff0c;OpenGL是为了在GPU上同时跑成千上万个程序&…

python扫描端口脚本_python写的端口扫描脚本

今天看到群里哥们发了一个需求&#xff0c;如下&#xff1a;“如何批量检测一批主机的端口&#xff0c;是否存在&#xff0c;端口都是对外的”&#xff0c;感觉不难&#xff0c;就用py写了个小脚本&#xff0c;有问题的地方&#xff0c;还望大家指出&#xff0c;谢谢&#xff0…