Redis是单线程的,单线程意味着任何一条命令的执行都是串行的,也就是按顺序一条一条的执行。那么当执行的命令耗时,就会导致后续的Redis
访问都会阻塞。
Redis中时间复杂度为O(n)的命令主要包括以下几类:
- List(列表)相关的命令:
lindex
:根据索引获取列表中的元素。如果索引接近列表的末尾,那么它的时间复杂度接近O(n)。lset
:通过索引设置列表中的元素。和lindex
类似,如果索引较高,时间复杂度也会接近O(n)。linsert
:在列表的元素前或后插入新的元素。由于需要找到插入点,其时间复杂度为O(n)。
- Hash(哈希)相关的命令:
hgetall
:获取哈希表中所有的字段和值。由于需要遍历整个哈希表,时间复杂度为O(n)。hkeys
:获取哈希表中的所有字段。与hgetall
类似,时间复杂度也为O(n)。hvals
:获取哈希表中的所有值。同样,由于需要遍历哈希表,时间复杂度为O(n)。
- Set(集合)相关的命令:
smembers
:返回集合中的所有元素。这需要对集合进行全表扫描,因此时间复杂度为O(n)。sunion
、sunionstore
:计算多个集合的并集。由于需要遍历所有输入的集合,时间复杂度为O(n),其中n是所有集合中元素数量的总和。sinter
、sinterstore
:计算多个集合的交集。时间复杂度同样为O(n)。sdiff
、sdiffstore
:计算一个集合与另一个集合的差集。时间复杂度也是O(n)。
- Sorted Set(有序集合)相关的命令:
zrange
、zrevrange
:根据排名范围返回有序集合中的元素。虽然这些命令的时间复杂度通常被认为是O(log(n)+m),但在m(返回的元素数量)接近n(集合中的元素总数)时,它们的行为更接近于O(n)。zrangebyscore
、zrevrangebyscore
:根据分数范围返回有序集合中的元素。同样,当返回的元素数量接近集合中的元素总数时,时间复杂度也接近O(n)。zremrangebyrank
、zremrangebyscore
:根据排名范围或分数范围移除有序集合中的元素。这些命令的时间复杂度也依赖于移除的元素数量,当移除的元素数量接近集合中的元素总数时,时间复杂度会接近O(n)。
需要注意的是,虽然这些命令在某些情况下可能表现出O(n)的时间复杂度,但在实际应用中,Redis通过高效的内部实现和数据结构(如哈希表、跳表等)来优化这些操作,使得在大多数情况下它们都能提供高性能的表现。然而,在处理大数据集时,仍然需要谨慎使用这些命令,以避免对Redis服务器造成不必要的性能影响。
此外,Redis还提供了如HSCAN
、SSCAN
、ZSCAN
等扫描命令,它们允许以增量的方式遍历哈希表、集合和有序集合,从而避免了全表扫描带来的性能问题。这些扫描命令的时间复杂度较低,并且可以在不阻塞服务器的情况下进行遍历操作。
flushdb
删除Redis中当前所在数据库中的所有记录,并且该命令是原子性的,不会终止执行,一旦执行,将不会执行失败。
flushall
删除Redis中所有数据库中的所有记录,并且该命令是原子性的,不会终止执行,一旦执行,将不会执行失败。
config
客户端可修改 Redis 配置
keys(使用scan替代keys命令scan
命令用来分批次扫描Redis
记录,保证Redis
不会因为耗时导致服务不可用。)
获取Redis中的key
对于时间复杂度为O(n)
的数据操作命令,也应该根据自己的数据量使用,命令如下:
List: lindex、lset、linsert
Hash: hgetall、hkeys、hvals
Set: smembers、sunion、sunionstore、sinter、sinterstore、sdiff、sdiffstore
Sorted Set: zrange、zrevrange、zrangebyscore、zrevrangebyscore、zremrangebyrank、zremrangebyscore
-
尽量不使用 O(N) 以上复杂度过高的命令,对于数据的聚合操作,放在客户端做,例如 SORT、SUNION、ZUNIONSTORE 聚合类命令
-
执行 O(N) 命令,保证 N 尽量的小(推荐 N <= 300),每次获取尽量少的数据,让 Redis 可以及时处理返回
建议:
1. 禁用危险命令
# 在配置文件中添加 rename-command KEYS "" rename-command SHUTDOWN "" rename-command CONFIG "" rename-command FLUSHALL ""
2. 重命名危险命令
# 在配置文件中添加 rename-command KEYS "all" rename-command SHUTDOWN "shtd" rename-command DEL "bye"
标签:复杂度,元素,Redis,命令,时间,哈希,集合 From: https://www.cnblogs.com/beatle-go/p/18363444