简介:今天,首席CTO Note将与您分享Django的相关内容可以使用REDIS使用REDIS。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
django-redis中文文档
Andrey Antukh,niwi@niwi.be 4.7.0
翻译:Rapospectre
1介绍
Django-Redis是基于BSD许可证的。这是一个功能齐全的组件,使Django能够支持REDIS缓存/会话。
1.1为什么要使用django-redis?
因为:
不断更新
局部redis-py URL符号连接字符串
可扩展的客户
可伸缩性解析器
可扩展的序列化器
默认客户所有者/支持
完美测试
它在某些项目的生产环境中被用作缓存和会话
不支持超时设置
对本地的支持进入REDIS客户端/连接池支持
高配置(例如模拟缓存的异常行为)
默认支持UNIX插座
支持Python 2.7、3.4、3.5和3.6
1.2可用的django-redis版本
稳定版本:4.7.0
稳定版本:3.8.4
1.3我应该使用哪个版本
版本编号就像3.6、3.7 ...主要的分销版本将包含与落后性不兼容的内容。升级之前,请阅读升级日志。
版本号就像3.7.0、3.7.1 ...以及其他小更新或错误修复。通常,它将仅包括错误修复。没有功能更新。
1.4依赖性
1.4.1 Django版本支持
django-redis 3.8.x支持Django 1.4、1.5、1.6、1.7(也许会有1.8)
django-redis 4.4.x支持Django 1.6、1.7、1.8、1.9和1.10
1.4.2 REDIS服务器支持
django-redis 3.x.y支持redis服务器2.6.x或更高
django-redis 4.x.y支持redis服务器2.8
现在,我们所有人都使用高级语言来编程,例如Java,Python等。也许您觉得C语言是旧的,但确实有用。毕竟,UNIX系统是用C实现的,因此C语言非常接近操作系统的语言。REDIS以C语言开发,因此执行将更快。
REDIS将所有数据放在内存中。在非-DATA同步的正常操作中,无需从磁盘读取数据,0次IO。内存响应时间约为100 nan秒,这是快速redis速度的重要基础。CPU的速度:
采用我的计算机,主频率为3.1g,这意味着每秒可以执行3.1*10^9的说明。因此,CPU非常慢,可以看到世界。记忆的速度比它慢数百倍,并且磁盘比他慢一百万倍。你说快速吗?
借用了“更深入了解计算机系统”的图片,以显示典型的内存层次结构。在L0层上,可以在时钟周期中访问CPU。然后,基于DRAM的主存储器可以通过数十个时钟周期访问。
首先,简化了单线算法的实现。数据结构的实现不仅很困难,而且测试也很麻烦。第二个线程避免了线程开关和锁定释放锁的消耗。对于服务方面的开发,锁和线程切换通常是性能杀手。当然,它在单个线程中也会存在缺点,它也是redis的噩梦:blocking。如果执行命令太长,它将导致其他命令的阻塞。REDIS非常致命,因此Redis是快速执行场景的数据库。
除了redis外,node.js也是一个线程,nginx也是一个线程,但它们都是服务器高性能的模型。
在此之前,我们必须讨论传统阻塞I/O的工作方式:使用读取或写入读写文件描述符(文件描述符FD)时,如果未收到数据,则该线程将被悬挂在尽管易于理解,但收到了数据,但是当需要处理多个客户端任务时,不会使用阻止模型。
I/O Multi -Road Reuse实际上意味着可以在同一过程中管理多个连接。** Multi -Road指网络的连接,重用是相同的线程。在网络服务,I的角色中,/o Multi -Road文物是一次通知多个连接的业务代码,并且处理方法由业务代码确定。在I/O Multi -Road Reuse模型中,最重要的功能调用是I/o多公路重复使用功能。此方法可以同时监视多个文件描述符(FD)的读写。当可读/写入时,此方法将返回可以读取/写入的FD的数量。
REDIS使用EPOLL作为I/O多路重用技术的实现。此外,REDIS自己的事件处理模型将EPOLL读取,写入,关闭等转换,并且不会在网络I/O上浪费太多。将对多个FD读取和写入的监视以提高性能。
以图像的示例。例如,TCP服务器处理20个客户端插座。一个方案:按顺序处理,如果由于网卡读取数据而缓慢处理了第一个插座,则它将在阻塞后播放鸡蛋。Planb。:每个套接字请求都会创建一个处理处理过程的过程,更不用说每个过程都消耗了大量的系统资源,并且一个过程切换足以操作System.c -scheme **(i/o)重复使用模型,epoll):注册与用户套接字相对应的FD中的epoll(实际上,插座的FD的FD不是套接字,而是fd_set的数据结构),然后仅Epoll仅epolltelttel需要读/写,只需要处理那些活跃的,可更改的套接字FDS。这样,这样,整个过程只会在调用epoll时阻止,并且接收客户的消息不会被阻止。
:d搜索微信(ID:芋头源代码),可以获得各种Java源分析,原理解释,访谈问题和学习指南。
:D,在回复[书]后,您可以从作者推荐的架构中收到100本书。
:D,在回复[技术组]后,您可以添加讨论Java,后端和体系结构的技术组。
MongoDB并不是说什么,这不是一种事情。与Memcached相比,Redis功能和特征的优点是显而易见的。重述性能,Redis作者的作者是单个核的平均表现,而在单个数据的情况下,Redis更好。您是这样说的?原因是Redis运行一个线程。
由于与Memcached的多线程相比,它是单线线程,因此总体性能肯定会很低。
因为它是单个线程,所以IO已序列化,网络IO和内存IO。因此,当单个数据太大时,性能将受到影响,因为所有需要等待命令完成后续命令的iOS。
在内存使用方面,REDIS当前与TCMALLOC和JEMALLOC两个内存分配器结合使用,这基本与Memcached。,优势是显而易见的。
最近,我学会了Redis写一篇文章来总结学习结果。学习方式主要是阅读,阅读Redis 5设计和源分析;想要系统地学习的学生,您可以很好地阅读这本书。为什么Redis的标题选择是如此之快?因为在学习过程中,我觉得Redis的本质很快。对于此属性,它具有许多特殊的设计和实现。
雷迪斯很快,我主要基于理解的三个部分
以下2,3部分扩展了:
首先,您必须知道redis工作线程是单个线程,但是整个redis都是多线程。
REDIS事件处理:
REDIS服务器是一个典型的事件驱动程序,该事件分为两个类别:文件事件(可读事件)和时间事件(定时任务)。注册的文件事件存储在事件[]阵列中,以及时间事件表单链接列表;REDIS的底层可以根据操作系统的不同选择使用I/O Multi -Way Reuse模型(Kqueue,Epoll,Select等)。您可以在我的Multi -Way Replica模型中查看另一篇文章。我的epoll本身具有很高的效率;但是,随着我们的网卡的不断升级,在Redis 6.0版本中,io治疗已成为多线程。
为什么IO的处理成为多线程速度?
以下是Redis6.0之前的情况:
如果您得到Redis6.0:
因此,这也是Redis快速的主要原因。
由于REDIS的设计,它主要分为基础设计结构和一些相应的功能,因此将其分为两个部分以解释。
REDIS的基础数据结构具有简单的动态字符串,跳跃表,压缩列表,字典,整数集;对于简单的动态字符串,压缩列表,主要考虑保存内存;整数集是考虑空间和时间;实际上,词典中的逐渐重新升级和间歇性的钥匙搜索正在考虑节省时间的时间。可以查看特定内容
有关具体详细信息,请检查官方网站
优点:至少有25%过期的密钥在内存中,此方法将节省比旋转更多的时间;也就是说,有点牺牲记忆,以确保redis的性能很快;或改变空间时间的想法;
注意:就我个人而言,我认为雪崩仍然可以在这里建立。如果大型REDIS实例中的所有键同时到期,则REDIS将继续进行扫描键,因为它已大于25%;扫描时间的上限为25ms;目前,客户请求刚刚结束。如果客户端将超时时间设置较短,例如10ms,则由于加班而将关闭大量链接,并且会有许多业务终端。很容易导致访问REDIS故障。如果设置太大,那么当redis异常时,在检查它之间不容易切换)
redis的特征很快。尽管它具有交易,但并未回滚,交易的功能并不完美。回滚:当它代表失败时,回头回到交易开始时刻;
redis是一个单个线程。如果有多个客户端,客户的交易将不会阻止其他客户端;客户端1发送打开事务的标签客户端2。2.一些命令1不断发出一些命令;目前,执行说明将首先提供;首先,假设2首先执行2的相关数据,则执行1,执行1,执行1,执行1,执行1,执行1,执行1,并执行1。;如果1首先到达,此时,请第一个执行相关命令,然后执行2;
本质失败了
目前,您会发现该语句尚未执行,其余句子将被执行;不会发生回滚;
证明:REDIS不支持交易的回滚。当操作周期错误时,即使交易失败中存在某个/某些命令,交易队列中的其他命令将继续执行-REDIS不会停止命令在交易中;
Redis为什么要回头?
摘要:Redis不支持交易的回滚以便快速;
在Redis中,第一个是RDB,第二个是AOF RDB是快照/副本相关的内容,而AOF与日志有关。
RDB的功能:1。需要时间(例如:我有1G内存,需要耐用硬盘,例如:一小时耐用。
如何实现RDB的持久性?
方法1:阻止REDIS,REDIS不再提供服务,但是需要阻止此方法。显然,如果这种持久性需要1秒,那么此时客户不能使用redis;
方法2:非烧毁Redis继续提供外部服务;
但是,目前会有一个问题。例如:RDB在8点钟持续存在,并且仅在8:00 1秒持续。然后,在8:00至8:00的过程中,数据将更改。因此,如何解决不一致的数据问题?例如:8点钟,当b = 10至8:00 1秒时,b = 20;
解决将CopyOnwrite用于本阅读和写作实施的想法;
也就是说,在操作系统中,首先使用fork()来创建一个子线以复制复制(注意:在此处复制的指针,因此速度将很快),然后此副本将保持在8 o'的情况下保持不变。时钟。然后,当您复制它时,可以复制此副本。
但是,由于父亲和儿子的过程指向相同的内存,因此不能在此内存中更改:您不能在原始键8中更改它,以进行审查,然后让指针指向新的区域在父进程中关键,以使两个过程不会相互影响。
redis也是多线程的线程;
执行:
RDB的缺点
RDB的优点:恢复数据的速度相对较快;
REDIS内存的选择过程通常在10G之内,因为从内存到磁盘持续时间的过程。如果10G需要写很长时间,则如何解决它?1。减少内存2.选择硬盘的固态驱动器;
响应RDB容易丢失数据的问题,提出了AOF持续机制
aof:apend file到文件以添加添加;当redis编写时,将记录在文件中;
优点:1。丢失的数据相对较小
背景:RDB和AOF可以同时打开。如果打开AOF,则只会使用AOF恢复。即使打开RDB,也不会使用它。由于AOF的维修更加准确;因此,在4.0之后,AOF包含RDB的全量和增加的新写作操作。这将提高速度;
缺点:因为AOF是增加的,如果增加了。1。1.无限体积变大2.恢复缓慢的缺点;为了解决此问题,需要设计一个计划以使日志AOF较小;这具有重写解决方案;在4.0之前,重写方案将丢失AOF,例如:弥补创建密钥并删除键的创建;4.0AOF达到100m文件后。目前,我将旧数据转换为RDB文件(二进制文件),然后将其存储到AOF中,然后将增量指令增加到AOF。因此,它是一种混合物;这里的AOF日志不再是全数日志,而是在此期间结束时持续存在的增量AOF日志的增加;然后,其更改的优点是:重新启动时,您可以首先加载RDB的内容,加载一个增量AOF日志,完全替换AOF日志更换的全部量,并将大大提高重新启动的效率;每次都重写后,它将成为RDB。
肮脏数据的时间:AOF log以文件的形式存在。当程序写入AOF日志时,它实际上将数据写入内存缓存,然后让内存写回磁盘磁盘磁盘,我什么时候写?日志丢失;目前,可以调整三个级别;
否:请勿致电FSYNC,然后等到已满(Fsync可以制作指定文件的内容,强行从内核缓存到磁盘刷到磁盘)一般生产环境不需要
总是:每次写数据时,都会调用FSYNC的一般生产环境。
每个人:redis每秒打电话齐平
通常,REDIS的主要节点不执行持久操作,并且持续操作主要是从节点执行的。因为客户端请求没有压力。
以上是Redis坚持不懈的两种方式。由于持续过程需要更多的时间,因此通常由节点从节点执行。当主服务器发现需要执行完整和重型同步时,将执行子过程执行。RDB是持久的,并将耐用数据发送到服务器。这次有两个选项1.直接发送它。通过套接字到服务器(从服务器支撑EOF),2。2。到本地文件的永久数据,然后在持久性完成后将文件发送到服务器。第二个默认情况下,根据该文件确定特定情况同步信息;但是,第一个效率将更高,速度将更快。
摘要:对于redis快速的特征,当redis使用fork()函数执行新线程时;同时,如果主服务器是服务器,则还提供了Psync2以进行部分同步。EOF功能;
Redis的特征很快,系统设计的所有方面都反映了此快速功能。这就是我在学习REDIS相关的知识并记录时所知道的。如果有偏差,请纠正读者!
结论:以上是首席CTO的全部内容,关于Django的速度更快。我希望这对每个人都会有所帮助。如果您想进一步了解这一点,请记住要收集对该网站的关注。
