当前位置: 首页 > article >正文

【Redis_Day3】Redis通用命令

【Redis_Day3】Redis通用命令

  • redis客户端的三种形态
  • redis的快与慢
  • redis通用命令
    • 阅读redis官方文档
    • redis中两个核心命令
      • set命令
      • get命令
    • redis全局命令
      • keys命令:查询当前服务器上的key
        • 生产环境
      • exists命令:判定key是否存在
      • del命令:删除指定的key
      • expire命令:为指定的key设置过期时间。
      • ttl命令:查询指定key的过期时间
      • type命令:查看key对应value的数据类型
  • Redis中key的过期策略实现原理(浅析)
    • 定时器的实现原理(浅析)
  • 小结一下~

redis客户端的三种形态

redis是一个客户端-服务器结构的程序。redis客户端和服务器可以在一台机器上,也可以在不同主机上。客户端和服务器之间通过网络进行通信。

在这里插入图片描述

Redis的客户端有很多形态,比如

  1. redis-cli是Redis服务器自带的命令行客户端。通过命令redis-cli或命令redis-cli -h IP地址 -p 端口号进入客户端并连接到服务器。ctrl+d退出。
    在这里插入图片描述
  2. 图形化界面的客户端。比如桌面程序,web程序。
  3. 基于redis的api自行开发客户端。

redis的快与慢

和mysql这样的关系型数据库相比,redis的最大特点是快。
mysql是在硬盘存数据,redis是在内存存数据。

和内存中的操作变量比,就慢了。
redis在内存存储管理数据是先通过网络,再操作内存。同时redis可以把数据单独、持久化存储,服务器重启,并不会影响数据内容。而变量是直接操作内存,重启服务器后数据就没了。
在这里插入图片描述

redis通用命令

通过redis-cli客户端和redis服务器交互,涉及到很多redis命令。大概是上百个吧。常用的掌握,不常用的在用到的时候查阅官方文档。

阅读redis官方文档

redis官方地址:redis.io
进入官网后,继续进入社区版
在这里插入图片描述然后在搜索框中输入命令,
在这里插入图片描述
进入命令的官方文档:
在这里插入图片描述

redis中两个核心命令

redis是按照键值对的方式存储数据的。
redis中命令不区分大小写。

set命令

set命令:把key和value存储到redis中。key和value都是字符串。

总结set的用法:

  1. set 字符串1 字符串2:把键值对<字符串1-字符串2>存到redis中。键和值加不加引号无所谓。
    在这里插入图片描述

get命令

get命令:根据key来取value。

总结get的用法:

  1. get 键1:通过键1取它对应的值。如果键1不存在,返回nil。nil就是null/NULL的意思。
    在这里插入图片描述
    在这里插入图片描述

redis全局命令

redis通过数据结构组织数据。体现在两个方面:

  1. redis自身的这些键值对,是通过哈希表的方式来组织的。
  2. 在键值对中,key固定就是字符串,value实际上有很多数据类型,最常见的五种类型:字符串,哈希表,列表,集合,有序集合。操作不同的数据结构就会有不同的命令。

全局命令:能够搭配任意数据结构使用的命令。

keys命令:查询当前服务器上的key

keys命令:通过通配符描述key的样子,服务器中匹配上述样子的key就能被查询出来。

总结keys的用法:

  1. keys pattern:pattern是包含通配符的字符串。在服务器中查询能匹配pattern的所有key。
    patter的具体写法:
    ?:匹配任意一个字符;
    *:匹配任意个字符;
    [ae]:只能匹配a或e,其他字符不行,相当于给出固定选项;
    [^ea]:排除e和a,只有e和a匹配不了,其他的都能匹配;
    [a-b]:a到b区间的都能匹配,包括a和b。
    比如:
    在这里插入图片描述在这里插入图片描述keys命令的时间复杂度是O(N),redis执行命令时用的是单线程模型,所以如果redis中存储的key非常多,那么执行keys命令的时间会很长,会导致redis服务器堵塞,无法给其他客户端提供服务。
    所以在生产环境中使用keys命令是危险操作
  2. keys *:查询当前服务器上的所有key。
生产环境

生产环境也叫线上环境。线上环境是外界用户能访问到的。

办公环境,开发环境,测试环境,统称为线下环境,外界用户无法访问。

一旦生产环境出现问题,会直接对用户使用产生影响。

exists命令:判定key是否存在

exists命令能一次性查一个或多个key是否存在。
redis组织key是按照哈希表的方式来组织的。所以 exists命令的时间复杂度是O(1)。
总结exists的用法:

  1. exists key1 key2 key3:查询服务器中是否存在键key1,键key2,键key3,返回key存在的个数。
    在这里插入图片描述
    在这里插入图片描述
    一次查多个效率比较高。这主要是因为redis客户端和服务器之间通过网络进行通信。
    每次网络通信都要对数据进行封装和分用,还是很花时间的。
    而且在网络通信中是通过网卡进行数据传输等工作的,网卡属于IO设备,IO设备的效率低于内存,CPU。
    一般情况下,Redis客户端和服务器还不定在一台机器上,此时网络传输消耗的时间也更多了。
    Redis的很多命令都支持一次能操作多个key

del命令:删除指定的key

同exists命令,del命令能一次删除一个或多个key。del命令的时间复杂度也是O(1)。

总结del的用法:

  1. del key1 key2 key3:删除服务器中键key1,键key2,键key3,返回删除掉的key的个数。
    在这里插入图片描述

expire命令:为指定的key设置过期时间。

key存活时间超过设定的过期时间,key就会被自动删除。设置的时间单位是s。实践复杂度也是O(1)。
比如在该验证码五分钟内有效,该外卖优惠劵在今日24.00过期等等场景下。

总结expire命令的用法:

  1. expire key1 xxx :为key1设置过期时间,xxx秒后,key1被自动删除。返回0设置失败,返回1设置成功。key1必须存在。
    在这里插入图片描述

通过pexpire命令也可以为指定的key设置过期时间。使用方法同expire,区别是设置的时间单位是ms。

ttl命令:查询指定key的过期时间

ttl 全称 time to live,即存活时间。

ttl命令的功能是查看指定key的过期时间还剩多少。
总结ttl命令的用法:

  1. ttl key1:查询key1的过期时间还剩多少,时间单位是s。返回值如果是-1表示该key1没有设置过过期时间,返回值如果是-2表示该key1不存在。
    在这里插入图片描述

pttl和ttl命令一样,区别是时间单位是ms。

type命令:查看key对应value的数据类型

type的命令的时间复杂度也是O(1)。

总结type的用法:

  1. type key1:查看key1对应value的数据类型。如果key1不存在,返回值是none。
    在这里插入图片描述
    在redis中,操作不同数据类型的value的命令完全不同。操作前就可以先type一下。

Redis中key的过期策略实现原理(浅析)

一个redis中同时存在很多的key,这些key中可能有很大一部分都有过期时间,此时,redis服务器是如何知道哪些key已经过期要被删除,哪些key还没过期的。

直接遍历所有的key,效率太低行不通。

redis中采取的基本策略是:定期删除和惰性删除结合

惰性删除:假设key1已经到了过期时间,但是redis并没有删除它。直到key1接下来被访问到时,才会触发redis服务器删除key1的操作,并返回给客户端一个nil。

定期删除:redis每隔一段时间抽取一部分key检查它们的过期时间,对过期key执行删除操作。在这个过程中,控制每次抽取检查的数量,保证定期删除的过程要足够快。redis处理主要任务都是使用单线程模型,如果扫描过期key消耗时间太长,会导致redis正常处理命令被阻塞。

通过上述策略,依然可能存在有很多过期的key被残留,不能及时删除掉。为了解决这个问题,redis中还提供了一系列的内存淘汰策略。

定时器的实现原理(浅析)

定时器:在某个时间到达之后,执行指定的任务。

实现一个定时器,有以下两种比较高效的方式:分别是基于优先级队列(堆)和时间轮。

基于优先级队列实现定时器:现假设redis服务器中有很多设置了过期时间的key,把这些key加入到一个优先级队列中,指定优先级规则是过期时间早的先出队列。此时队首元素就是最早的要过期的key,给定时器中分配一个线程(多线程),让这个线程去检查队首元素,看队首元素是否过期,这个线程不需要频繁扫描队首元素,只要根据当前时刻和队首元素的过期时间,设置一个等待,当等待时间结束后,系统唤醒这个线程,这个线程去检查队首元素即可。

基于时间轮实现定时器:把时间划分成多个时间槽,每个槽代表一个固定的时间间隔。根据任务的超时时间把任务放进时间槽中,每个时间槽中存储多个定时任务。设置一个指向当前时间槽的指针,这个指针每隔固定时间就往后走一个时间槽,每次走到一个时间槽,就会尝试执行里面的定时任务。
控制指针向后走的线程并没有频繁扫描。一共多少个时间槽,每个槽代表间隔多少都是根据具体场景设计的。

上述两种方案都涉及到了多线程,Redis中没有采取上述两种方案。

小结一下~

  1. redis中六个常用的全局命令:
  • keys:查看匹配规则的key
  • exists:判定指定key是否存在
  • del:删除指定的key
  • expire/pexpire:设置过期时间
  • ttl/pttl:查看key的过期时间
  • type:查询key对应的value类型
  1. 两个核心命令:
  • set:把key和value存储到redis中。
  • get:根据key来取value
  1. 在生产环境中使用keys命令是危险操作。特别是keys *
  2. Redis中针对key的过期策略:定期删除+过期删除+内存淘汰机制三者结合。
  3. 定时器的两个高效实现思路:基于优先级队列实现和基于时间轮实现。

http://www.kler.cn/a/379884.html

相关文章:

  • 「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件
  • 【docker】docker 环境配置及安装
  • SpringBoot新闻稿件管理系统:架构与实现
  • dc源码铺子应用部署教程
  • RabbitMQ的原理和集成使用
  • C++11新特性之Lambda函数
  • VR 创业之路:从《I Expect You To Die》到未来展望
  • 深度学习:Yolo V4的改进
  • 【系统架构设计师】2023年真题论文: 论面向对象分析的应用与实现(包括解题思路和素材)
  • 传智杯 第六届-复赛-C
  • zxing生成、解析二维码,条形码
  • centos安装指定版本的git
  • Sublime Text 的PHP格式化插件phpfmt 的 setting 配置参数说明
  • idea连接docker并构建镜像
  • IPsec传输模式与隧道模式的深度解析及应用实例
  • 关于Linux系统调试和性能优化技巧有哪些?
  • SpringCloud-Eureka注册中心
  • 【系统架构设计师】2022年真题论文: 论湖仓—体架构及其应用(包括解题思路和素材)
  • Sublime常用快捷键
  • Pandas进行时间重采样与聚合
  • 系统分析师-案例分析-UML
  • 切换淘宝镜像
  • Java | Leetcode Java题解之第526题优美的排列
  • SpringBoot集成Mybatis
  • Windows 系统安装 Hadoop 详细教程
  • 交换机如何实现2.5G网络传输速率和网络变压器有关吗