首页 > 其他分享 >时间复杂度为O(n)的命令

时间复杂度为O(n)的命令

时间:2024-08-16 18:38:47浏览次数:7  
标签:复杂度 元素 Redis 命令 时间 哈希 集合

Redis是单线程的,单线程意味着任何一条命令的执行都是串行的,也就是按顺序一条一条的执行。那么当执行的命令耗时,就会导致后续的Redis访问都会阻塞。

Redis中时间复杂度为O(n)的命令主要包括以下几类:

  1. List(列表)相关的命令:
    • lindex:根据索引获取列表中的元素。如果索引接近列表的末尾,那么它的时间复杂度接近O(n)。
    • lset:通过索引设置列表中的元素。和lindex类似,如果索引较高,时间复杂度也会接近O(n)。
    • linsert:在列表的元素前或后插入新的元素。由于需要找到插入点,其时间复杂度为O(n)。
  2. Hash(哈希)相关的命令:
    • hgetall:获取哈希表中所有的字段和值。由于需要遍历整个哈希表,时间复杂度为O(n)。
    • hkeys:获取哈希表中的所有字段。与hgetall类似,时间复杂度也为O(n)。
    • hvals:获取哈希表中的所有值。同样,由于需要遍历哈希表,时间复杂度为O(n)。
  3. Set(集合)相关的命令:
    • smembers:返回集合中的所有元素。这需要对集合进行全表扫描,因此时间复杂度为O(n)。
    • sunionsunionstore:计算多个集合的并集。由于需要遍历所有输入的集合,时间复杂度为O(n),其中n是所有集合中元素数量的总和。
    • sintersinterstore:计算多个集合的交集。时间复杂度同样为O(n)。
    • sdiffsdiffstore:计算一个集合与另一个集合的差集。时间复杂度也是O(n)。
  4. Sorted Set(有序集合)相关的命令:
    • zrangezrevrange:根据排名范围返回有序集合中的元素。虽然这些命令的时间复杂度通常被认为是O(log(n)+m),但在m(返回的元素数量)接近n(集合中的元素总数)时,它们的行为更接近于O(n)。
    • zrangebyscorezrevrangebyscore:根据分数范围返回有序集合中的元素。同样,当返回的元素数量接近集合中的元素总数时,时间复杂度也接近O(n)。
    • zremrangebyrankzremrangebyscore:根据排名范围或分数范围移除有序集合中的元素。这些命令的时间复杂度也依赖于移除的元素数量,当移除的元素数量接近集合中的元素总数时,时间复杂度会接近O(n)。

需要注意的是,虽然这些命令在某些情况下可能表现出O(n)的时间复杂度,但在实际应用中,Redis通过高效的内部实现和数据结构(如哈希表、跳表等)来优化这些操作,使得在大多数情况下它们都能提供高性能的表现。然而,在处理大数据集时,仍然需要谨慎使用这些命令,以避免对Redis服务器造成不必要的性能影响。

此外,Redis还提供了如HSCANSSCANZSCAN等扫描命令,它们允许以增量的方式遍历哈希表、集合和有序集合,从而避免了全表扫描带来的性能问题。这些扫描命令的时间复杂度较低,并且可以在不阻塞服务器的情况下进行遍历操作。

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

 

 

  1. 尽量不使用 O(N) 以上复杂度过高的命令,对于数据的聚合操作,放在客户端做,例如 SORT、SUNION、ZUNIONSTORE 聚合类命令

  2. 执行 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

相关文章

  • WPF 命令Command
    MVVM的目的是为了最大限度地降低了Xaml文件和CS文件的合度,分离界面和业务逻辑,所以我们要尽可能的在View后台不写代码。但是这个例子中,我们将更新ViewModel的代码写在了View里。我们能否把按钮的响应处理代码也不写在后台代码里呢?WPF引入Command(命令),通过为Button设置Command来......
  • Git 命令大全:详细讲解与常见问题解决方案
    目录1.Git基础命令2.分支管理命令3.远程仓库管理命令4.标签管理命令5.其他常用命令6.总结Git是目前最流行的分布式版本控制系统,它使得团队协作和代码管理变得更加高效。本文将详细介绍Git的常用命令及其应用场景,并针对可能遇到的问题提供解决方案。1.Git......
  • minikube && k8s 命令
    minikubedocker-envminikubedashboardminikubessh导出一个已经创建的容器导到一个文件dockerexport-o文件名.tar容器id将文件导入为镜像dockerimport文件名.tar镜像名:镜像标签本地镜像关联到minikubeminikube"docker-env"将容器保存为镜像:dockercommit<容......
  • git command 工作中常用命令备忘录
    模拟目前工作流程在gitlabfork需要开发的项目到自己仓库分配一个工作任务(feature、improvment、bug)本地从个人仓库克隆项目gitclonehttp://mylocal/group/project本地添加对于远端项目gitremoteaddupstreamhttp://dev.xxx.io/group/project基于远端仓库切出本......
  • 【Linux操作系统】——Linux基本命令3
    1、vi与vim的简介  在Linux下,绝大部分的配置文件都是以ASCII码的纯文本形式存在的,可以利用一些简单的编辑软件修改配置。  在Linux命令行界面下的文本编辑器有很多,比如nano,Emacs,vim等。但是所有的UNIXLike系统都会内置vi文本编辑器,而其他的文本编辑器则不一定存在......
  • PHP命令执行与绕过
    一、eval()函数调用--无严格过滤:1、highlight_file()高亮显示:?c=highlight_file(base64_decode("ZmxhZy5waHA="));2、shell命令:?c=system("tacfl*g.php");?c=system("catfl*g.php");3、echo直接打印:(使用反引号包裹shell命令)?c=echo'tacfla*.php';4、......
  • pdf文件改时间有哪些方法?手把手教你6个修改PDF时间属性的方法
    在数字化办公日益普及的今天,PDF(PortableDocumentFormat)文件因其跨平台兼容性和内容不易被篡改的特性,成为了文档传输和分享的首选格式。然而,在某些情况下,我们可能需要修改PDF文件的属性,比如作者名、标题、主题、关键词等元数据,或是调整文件的安全设置。本文将详细介绍如何修改......
  • 在Windows系统打开开始菜单,输入cmd 命令打开命令提示符
    ftp>pwd#匿名访问ftp的根目录为Linux系统的/var/ftp/目录ftp>ls#查看当前目录ftp>cdpub#切换到pub目录ftp>get文件名#下载文件到当前Windows本地目录ftp>lsftp>gettest.txt#获取目录中的文件下载到电脑ftp>lsftp>puttest4.txt......
  • macOS和 Window10 命令行禁用/启用IPv6本地网络
    macOS禁用/启用IPv6本地网络禁用IPv6本地网络#验证是否可以访问IPv6网络$curl6.ipw.cn2408:824c:200::2b8b:336f:cc9c#找到网络设备的名字,这里用的是Wi-Fi(因为macbook用的是无线网络访问,即Wi-Fi)$networksetup-listallnetworkservicesAnasterisk(......
  • python 利用高德得到地址对应的经伟度,由于地址原因在指定时间范围内得不到经伟度而终
    importrequests,sysimportjson,math,xlrd,xlwt,time#!/usr/bin/envpython#-*-coding:utf-8-*-frommathimportsin,asin,cos,radians,fabs,sqrtimportpandasaspdfromgeopy.distanceimportgeodesicfromopenpyxlimportload_workbookimportred......