基于redis是单线程的,使用的Redis的,有必要有意识的从是否存在极大value的情况,且出现频繁,访问Redis并发的场景,比如一个命令耗时10ms,然后每s并发100,那基本上redis都会阻塞在这个命令上了;

我们先看Redis的几个常见命令时间复杂度:

  1. keys * 返回所有的key,keys命令最好不要在生产环境用,会全局遍历,会很慢,要堵塞其他命令。
  2. dbsize 显示一共有几个key,这个可以在生产用,不会全局遍历
  3. exists keyname 查看key是否存在,存在返回1,不存在返回0
  4. del kename 删除key 成功返回1,失败返回0。可以删除多个。
  5. expire keyname seconds 为key设置过期时间,秒级
  6. ttl keyname 查询key的过期时间,如果返回值为-1,代表不会过期(永久Key),-2代表key不存在了
  7. persist keyname 去掉key的过期时间,它就不会过期了(永久Key)
  8. 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的命令也要慎用啊)相关推荐

  1. php redis命令大全,redis中key相关命令详解

    一.概述: 本文将主要讲述与Key相关的Redis命令.学习这些命令对于学习Redis是非常重要的基础,也是能够充分挖掘Redis潜力的利器.(推荐:redis视频教程) 二.相关命令列表: 命令原型 ...

  2. redis学习(二) redis数据结构介绍以及常用命令

    redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: ...

  3. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

  4. java hmget 最大值,【Redis】基本数据类型及命令操作(超详细)

    一.String 可以直接看每一大节的命令示例部分,敲一遍就大体会了 1.1 概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数 ...

  5. 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 ...

  6. Redis基础 -- 地理坐标类型 Redis GEO 和 Redis GEO的常用命令(含GEOHASH编码说明)

    文章目录 1. 地理坐标类型 Redis GEO 1.1 GEOADD:存储坐标 1.2 GEOPOS:获取指定位置的坐标 1.3 GEODIST:计算两个位置之间的直线距离 1.4 GEORADIU ...

  7. 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 ...

  8. 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 ...

  9. Redis05:Redis的高级特性:expire 生存时间、pipeline 管道、info命令、Redis的持久化、Redis 的安全策略、Redis监控命令-monitor

    一.expire 生存时间 Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它. 它的一个典型应用场景是:手机验证码 我们平时在登录或者注册的时候,手机会接收到一 ...

最新文章

  1. 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装
  2. 【Android】AsyncTask原理应用及源码关键部分解析
  3. 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
  4. 深入理解kestrel的应用
  5. 12人类为什么有战争
  6. STL中的map集合扩展字段比较方便
  7. mysql表增加一行_数据库表增加一行数据
  8. 使用LazZiya.ExpressLocalization开发多语言ASP.NET Core 2.x项目
  9. 第一百一十八天 how can I 坚持
  10. 案例-图片缩放(CSS3)
  11. 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版
  12. 论文笔记A Liver Segmentation Method Based on the Fusion of VNet and WGAN
  13. 边缘和核心交换——应用层CS、P2P、混合模式
  14. WordPress社交问答社区主题模板
  15. 学习笔记 time模块练习 纪念日计算
  16. 第一周 清浊音时域波形与频谱分析以及计算RGB文件三通道的熵
  17. Vue2的响应式原理
  18. 解决导航栏按钮背景色切换,刷新页面,按钮背景色切换,页面和路径没有切换问题
  19. 《生物化学与分子生物学》----核酸----听课笔记(十二)
  20. 微信小程序播放音频,ios静音状态下无声音、音频播放创建多个等问题

热门文章

  1. Ubuntu16.04编译poco库
  2. 00008 - layui 表单验证,需要验证,但非必输
  3. SQL server如何导入数据库.MDF文件
  4. manual 离线手册 韩顺平php_PHP官方中文手册2017最新完整版 带用户注释 chm
  5. iis urlrewrite读取请求header
  6. 批处理文件(bat文件)注册dll
  7. S7-1212C AC/DC/DLY作为PN主站通过PROFINET转Modbus RTU网关设备与Micro Logix 140
  8. 吴军:阅读与写作50讲01
  9. 没有中国市场仍是第一的三星反攻,折叠手机降价三千压制中国手机
  10. COBOL学习之COMMIT--ROLLBACK