Redis命令时间复杂度(redis的命令也要慎用啊)
基于redis是单线程的,使用的Redis的,有必要有意识的从是否存在极大value的情况,且出现频繁,访问Redis并发的场景,比如一个命令耗时10ms,然后每s并发100,那基本上redis都会阻塞在这个命令上了;
我们先看Redis的几个常见命令时间复杂度:
- keys * 返回所有的key,keys命令最好不要在生产环境用,会全局遍历,会很慢,要堵塞其他命令。
- dbsize 显示一共有几个key,这个可以在生产用,不会全局遍历
- exists keyname 查看key是否存在,存在返回1,不存在返回0
- del kename 删除key 成功返回1,失败返回0。可以删除多个。
- expire keyname seconds 为key设置过期时间,秒级
- ttl keyname 查询key的过期时间,如果返回值为-1,代表不会过期(永久Key),-2代表key不存在了
- persist keyname 去掉key的过期时间,它就不会过期了(永久Key)
- tpye keyname 查看key的数据类型
命令 | 时间复杂度 |
---|---|
keys | O(n) |
dbsize | O(1) |
exists | O(1) |
del | O(1) |
expire | O(1) |
ttl | O(1) |
persist | O(1) |
tpye | O(1) |
几个复杂度的排序,
O(1), O(n), O(logn), O(nlogn) 的区别:
O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。
O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)
时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。
O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。
O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。
时间复杂度大小的比较:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)
入上图列出的几个常见命令,keys *这种命令肯定是要慎用的,但是
比如del命令就真的可以随便用吗?
答案肯定是否定的,del大对象的话,也是比较耗时的(即使Redis4.0以后有异步懒删除,但是也是耗性能的,大内存的频繁置换也是其中一个因素),这个时候如果del并发很高,也是严重会阻塞redis的;
所以整体的结论是时间复杂度高的命令要慎用,并发高的耗时命令要慎用,减少大对象的处理;
以下收集整理Redis命令时间复杂度查询表:
String类型:
比如下面的批量操作 mset,mget命令,复杂度是较高的,批量获取个1000个? 并发再高点试试?
Hash类型
典型的是这个hgetall, hash里面获取个全量几万的数据,并发稍微高点试试?
List类型
List 的数据结构似乎大部分命令的耗时都较高,其实rpush、lpush这些是批量操作,同时push很多的话,自然是O(k)的复杂度;
Set集合
之前了解到的一些场景,比如求共同好友,共同粉丝之类的;
比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis的set集合提供了求交集、并集、差集等操作,即以下的命令sinter suinon sdiff命令,复杂度是O(k)这些,所以一些大V上千万的粉丝,就是个大Set,求交集、并集、差集这些是比较耗时的;
ZSet类型,即排序集合
比如之前就遇到过Zrem批量删除且并发还高导致的Redis阻塞问题(https://blog.csdn.net/wf_feng/article/details/121345797?spm=1001.2014.3001.5501可参考案例);
总之使用的Redis的,有必要有意识的从是否存在极大value的情况,且出现频繁,访问Redis并发的场景,比如一个命令耗时10ms,然后每s并发100,那基本上redis都会阻塞在这个命令上了;
Redis命令时间复杂度(redis的命令也要慎用啊)相关推荐
- php redis命令大全,redis中key相关命令详解
一.概述: 本文将主要讲述与Key相关的Redis命令.学习这些命令对于学习Redis是非常重要的基础,也是能够充分挖掘Redis潜力的利器.(推荐:redis视频教程) 二.相关命令列表: 命令原型 ...
- redis学习(二) redis数据结构介绍以及常用命令
redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: ...
- Redis的数据类型及其常用命令
快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...
- java hmget 最大值,【Redis】基本数据类型及命令操作(超详细)
一.String 可以直接看每一大节的命令示例部分,敲一遍就大体会了 1.1 概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数 ...
- Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景
Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...
- Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)
文章目录 1. 地理坐标类型 Redis GEO 1.1 GEOADD:存储坐标 1.2 GEOPOS:获取指定位置的坐标 1.3 GEODIST:计算两个位置之间的直线距离 1.4 GEORADIU ...
- php redis 批量删除,redis实现批量删除的命令介绍
redis实现批量删除: 1.访问redis根目录 cd /usr/local/redis-2.8.19 2.登录redis:redis-cli -h 127.0.0.1 -p 6379 (其中,12 ...
- Redis源码-ZSet:Redis ZSet存储原理、Redis ZSet命令、 Redis ZSet两种存储底层编码ziplist/dict+skiplist、Redis ZSet应用场景
Redis源码-ZSet:Redis ZSet存储原理.Redis ZSet命令. Redis ZSet两种存储底层编码ziplist/dict+skiplist.Redis ZSet应用场景 Red ...
- Redis05:Redis的高级特性:expire 生存时间、pipeline 管道、info命令、Redis的持久化、Redis 的安全策略、Redis监控命令-monitor
一.expire 生存时间 Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它. 它的一个典型应用场景是:手机验证码 我们平时在登录或者注册的时候,手机会接收到一 ...
最新文章
- 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装
- 【Android】AsyncTask原理应用及源码关键部分解析
- 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
- 深入理解kestrel的应用
- 12人类为什么有战争
- STL中的map集合扩展字段比较方便
- mysql表增加一行_数据库表增加一行数据
- 使用LazZiya.ExpressLocalization开发多语言ASP.NET Core 2.x项目
- 第一百一十八天 how can I 坚持
- 案例-图片缩放(CSS3)
- 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版
- 论文笔记A Liver Segmentation Method Based on the Fusion of VNet and WGAN
- 边缘和核心交换——应用层CS、P2P、混合模式
- WordPress社交问答社区主题模板
- 学习笔记 time模块练习 纪念日计算
- 第一周 清浊音时域波形与频谱分析以及计算RGB文件三通道的熵
- Vue2的响应式原理
- 解决导航栏按钮背景色切换,刷新页面,按钮背景色切换,页面和路径没有切换问题
- 《生物化学与分子生物学》----核酸----听课笔记(十二)
- 微信小程序播放音频,ios静音状态下无声音、音频播放创建多个等问题
热门文章
- Ubuntu16.04编译poco库
- 00008 - layui 表单验证,需要验证,但非必输
- SQL server如何导入数据库.MDF文件
- manual 离线手册 韩顺平php_PHP官方中文手册2017最新完整版 带用户注释 chm
- iis urlrewrite读取请求header
- 批处理文件(bat文件)注册dll
- S7-1212C AC/DC/DLY作为PN主站通过PROFINET转Modbus RTU网关设备与Micro Logix 140
- 吴军:阅读与写作50讲01
- 没有中国市场仍是第一的三星反攻,折叠手机降价三千压制中国手机
- COBOL学习之COMMIT--ROLLBACK