redis命令效率分析
Posted 在线者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis命令效率分析相关的知识,希望对你有一定的参考价值。
append:时间复杂度为o(1),如果键已经存在并且是字符串,则此命令将在字符串末尾追加值。如果键不存在,则创建它并将其设置为空字符串,因此在这种特殊情况下,追加将类似于SET。返回修改后的字符串长度。
- 字符串
Redis中最基本的数据结构就是字符串,使用redis最简单的额方法就是字符串作为键值存储。这里的字符串是经过序列化之后存储的。操作字符串最基础的GET和SET命令都是O(1)的效率。非常快速和简单,是效率最高的存储形式。而GETRANGE、MSET、MGET都是O(n)的效率。
- 哈希
这里的哈希和编程语言中的字典或关联数组类似,是一种将一个或多个字段映射到对应的值的数据结构。在Redis中,所有的哈希值必须是Redis字符串,并且有唯一的键名,键的值是简单的Redis字符串。通过调用Redis的HGET或HMGET命令,传入合适的键和值,就能返回字段值。大多数场景下,Redis哈希可以为HSET和HGET提供很棒的O(1)性能。而HGETALL、HMSET、HMGET、HKEYS和HVALS都为O(n)。如果哈希非常小,HMGET和HGETALL没有明显差异,但是当哈希键值不断增长时,HMGET将会表现更好,它们虽然都是O(n)效率,但是HMGET的复杂度上限为所请求的字段的总和而不是整个哈希。在哈希总体较小时,使用HMGET代替HGETALL比较好,但在大型哈希来说,返回大量数据的HMGET命令会在完成执行前阻塞其他客户端接收数据,从而极大影响Redis总体性能。这种时候,针对性的HGET会是更好的选择。
- 列表
Redis中列表是字符串的有序集合,它允许重复的字符串值。Redis中的列表是以链表实现的。使用LPUSH和RPUTH向列表首尾添加元素是简单的操作,表现为常数复杂度O(1),对于LINSERT和LSET命令来说,时间复杂度是线性O(n),但这两者有一些重要的差别,对LSET来说,你可以指定下标值设置列表的值,由于本质上是链表,因此变量n是列表的长度,不管是设置第一项还是最后一项,时间复杂度都是O(1),对于LINSERT来说,你可以在参考值之前或之后插入值,时间复杂度为O(n),n为列表元素个数,该命令必须从头查到尾,最坏情况是查到列表末尾。对于LRANGE来说,官方文档给的复杂度是O(s+n),其中s为列表的表头或表尾到偏移量位置的元素个数,者取决于列表大小,n代表返回的元素总数。通常来讲,LTRIM命令的时间复杂度为O(n),其中n为返回给客户端的元素数量。使用LTRIM结合RPUTH或LPUTH是存储固定长度集合的常用方法。
- 集合
Redis中的集合保证了字符串值得唯一性,但是不保证顺序。Redis集合支持集合语义的并集,交集和差集,并在Redis中将这些集合操作的结果存储为一个新的Redis集合。SADD将一个或多个值添加到集合中,时间复杂度为O(n),其中n为添加到集合中的元素总数。重要的SISMEMBER命令用于判断值是否为集合成员,时间复杂度为O(1),用于返回集合中所有成员列表,时间复杂度为O(n)。它的集合操作是最有价值的地方,SUNION和SUNIONSTORE命令允许将多个集合的所有成员返回给客户端或存储为Redis中的新集合。这两个命令的时间复杂度为O(n),其中n为所有集合中的元素总数。SINTER和SINTERSTORE命令返回集合的交集,后者会存储在Redis中,多个集合的公共成员计算时间复杂度为O(n*m),其中n是最小集合的大小,m为集合总数。最后SDIFF和SDIFFSTORE命令将返回或存储两个集合的差异。和SUNION相同,SDIFF和SDIFFSTORE的时间复杂度为O(n),n为集合元素总数。
- 位串和位操作
Redis字符串和对应命令的特殊用法允许为Redis中相对较少的比特使用该内存高效的数据结构。在位串中,每个字节存储8位,其中位置0位最高有效位,Redis位串最大为512Mb,这个redis所有的键和值限制是一样的。位串高效的原因是大多数针对它的命令都是O(1)和O(n),使用SETBIT和GETBIT命令,可以将位设置0或1,这两个的时间复杂度都是O(1),位串对于存储一些列连续二进制信息及其迅速。BITOP,BITPOS,BITCOUNT的时间复杂度为O(N),但是提供了强大的语义。如果使用Redis存储业务仪表盘,每月每天甚至每小时的使用信息能够很高效的完成。
以上是关于redis命令效率分析的主要内容,如果未能解决你的问题,请参考以下文章
8 款 Redis 可视化工具,助你以最快的效率解决最复杂的问题