Python--Redis实战:第四章:数据安全与性能保障:第8节:关于性能方面的注意事项

上一篇文章: Python--Redis实战:第四章:数据安全与性能保障:第7节:非事务型流水线
下一篇文章: Python--Redis实战:第五章:使用Redis构建支持程序:第1节:使用Redis来记录日志

习惯了关系数据库的用户在刚开始使用Redis的时候,一般会由于Redis带来的上百倍的性能提高而感到欣喜若狂,却没有认识到Redis性能实际上还能够进一步的提升。虽然上一节介绍的非事务型流水线能够尽量地减小应用程序和Redis之间的通讯往返次数,可是对于一个已经存在的应用程序,咱们应该如何判断这个程序可否被优化呢?咱们又应该如何对它进行优化呢?redis

要对Redis的性能进行优化,用户首先须要弄清楚各类类型的Redis命令到底能跑多快,而这一点能够经过调用Redis附带的性能测试程序redis-benchmark来得知,下面清单展现了一个相应的例子。若是有兴趣的话,读者也能够试着用redis-benchmark来了解Redis在本身服务器上的各类性能特征:数据库

在装有英特尔酷睿2双核2.4GHz处理器的台式电脑上运行redsi-benchmarksegmentfault

#给定‘-q’选项可让程序简化输出结果,给定‘-c 1’选项让程序只使用一个客户端来进行测试
$ redis-benchmark -c 1 -q
PING (inline):34246.57 requests per second
Pind:34843.32 requests per second
MSET (10 keys):24213 08 request per second
SET: 32467.53 request per second
GET: 33112.59 request per second
INCR: 32679.74 request per second
LPUSH: 33333.33 request per second
LPOP: 33670.04 request per second
SADD: 33222.59 request per second
SPOP: 34482.76 request per second
LPUSH (again, in order to bench LRNAGE):33222.59 request per second
LRANGE (first 100 elements):22988.51 request per second
LRANGE (first 300 elements):13888.89 request per second
LRANGE (first 450 elements):11061.95 request per second
LRANGE (first 600 elements):9041.59 request per second

redis-benchmark的运行结果展现了一些经常使用Redis命令在1秒内能够执行的此时。若是用户在不给定任何参数的状况下运行redis-benchmark,那么redis-benchmark将使用50个客户端来进行性能测试,可是为了在redis-benchmark和咱们本身的客户端之间进行性能对比,让redis-benchmark只使用一个客户端要比使用多个客户端更方一些。安全

在考察redis-benchmark的输出结果时,切记不要将输出结果看作是用于程序的实际性能,这是由于redis-benchmark不会处理执行命令所得到的命令回复,因此它节约了大量用于对命令回复进行语法分析的时间。在通常状况下,对于只使用单个客户端的redis-benchmark来讲,根据被调用命令的复杂度,一个不使用流水线的Python客户端的性能大概只有redis-benchmark所示性能的50%~60%。服务器

另外一方面,若是你发现本身客户端的性能只有redis-benchmark所示性能的25%~30%,或者客户端向你返回了”Cannot assign requested address“(没法分配指定的地址)错误,那么你多是不当心在每次发送命令时都建立了新的链接。数据结构

下表列出了只使用单个客户端的redis-benchmark与Python客户端之间的性能对比结果,并介绍了一些常见的形成客户端性能底下或者出错的缘由:多线程

比较了Redis在一般状况下的性能表现以及redis-benchmark使用单客户端进行测试时的结果,并说明了一些可能引发性能问题的缘由
性能或者错误 可能的缘由 解决方法
单个客户端的性能达到redis-benchmark的50%~60% 这是不使用流水线的预期性能无
单个客户端的性能达到redis-benchmark的25%~30% 对于每一个命令或者每组命令都建立了新的链接 重用已有的Redis链接
客户端返回错误:”Cannot assign requested address“(没法分配指定的地址) 对于每一个命令或者每组命令都建立了新的链接 重用已有的Redis链接

尽管上表列出的性能问题以及问题的解决方法都很是简短,但绝大部分常见的性能问题都是由表格中列出的缘由引发的(另外一个引发性能问题的缘由是以不正确的方式使用Redis的数据结构)。若是读者遇到了难以解决的性能问题,或者遇到上表没有介绍的性能问题,那么读者能够考虑经过1.4节介绍的方法来寻求帮助。性能

大部分Redis客户端库都提供了某种级别的内置链接池。以Python的Redis客户端为例,对于每一个Redis服务器,用户只须要建立一个redis.Redis()对象,该对象就会按需建立链接、重用已有的链接并关闭超时的链接(在使用多个数据库的状况下,即便客户端只链接了一个Redis服务器,它也须要为每个被使用的数据库建立一个链接),而且Python客户端的链接池还能够安全地应用于多线程环境和多进程环境。测试

上一篇文章: Python--Redis实战:第四章:数据安全与性能保障:第7节:非事务型流水线
下一篇文章: Python--Redis实战:第五章:使用Redis构建支持程序:第1节:使用Redis来记录日志
相关文章
相关标签/搜索