当前位置: 首页 > 科技观察

浅谈Redis中的全局命令

时间:2023-03-18 12:41:59 科技观察

在上一篇文章中,我们介绍了Redis有5种数据类型,但是每种数据类型的底层实现是不同的。在学习Redis的时候,我们除了要掌握这五种数据类型外,还需要了解它们具体的底层实现,这有助于我们更好的掌握Redis。遇到问题时,我们可以方便快捷地解决问题。在这篇文章中,我们主要了解全局命令、数据结构和内部编码知识。全局命令Redis有5种数据结构。虽然它们的底层不同,但一些常用的命令是相同的。1、查看所有keys(返回所有keys,并输出其具体keys)keys*2。查看key总数(返回当前数据库中key的个数)dbsize备注:dbsize命令在计算key总数时不会遍历所有key,而是直接获取Redis内置的key总数变量,所以dbsize命令的时间复杂度是O(1)。keys命令会遍历所有的key,所以它的时间复杂度是O(n),所以如果Redis中保存了大量的key,要慎用keys命令。3.检查key是否存在existskey。我们看到exists命令有一个返回值。当key存在时,返回值为1。当然,当key不存在时,返回值为0。4.删除keydelkey。我们知道Redis的数据结构有5种类型,但是del命令可以直接删除任意一种数据结构而无需担心其底层实现。我们看到del命令和exists命令一样,都有一个返回值。唯一的区别是del命令返回时成功删除键的数量。如果返回0,表示没有成功删除key,也就是key不存在。如果返回的数字大于0,则表示删除了多个键。下面看一下删除多个key的操作。5、key过期expirekeysecondsRedis支持给key加上过期时间。当超过这个过期时间后,Redis会自动删除这个key。我们通过expire命令设置了key的过期时间后,我们可以使用ttlkey命令查看key的剩余过期时间,所以ttl命令有一个返回值,即key的剩余时间,在秒。另外,ttl命令有3种返回值。下面我们来看看这三个返回值的区别。>=0:表示剩余过期时间-1:key没有设置过期时间-2:key不存在6.key的数据结构类型typekey如果key是字符串,则type命令返回一个string,如果是其他数据类型会返回其他数据类型(因为我们没有学过其他类型,这里暂时只考虑字符串),如果key不存在则返回none。数据结构和内部编码我们知道type命令会返回redis中key的数据类型,即string(字符串)、hash(散列)、list(列表)、set(集合)、zset(有序集合),ETC。。但这些只是外部数据结构。实际上,Redis内部不同的数据结构,其底层内部编码是不同的。不同的内部编码在Redis中有不同的表现,Redis会自动判断应该使用哪种编码来存储数据,这就保证了Redis的性能。我们可以通过以下命令查看密钥的内部编码。objectencodingkey我们可以看到上面保存的keyjilinwula的内部编码是embstr。我们来看看Redis中所有数据结构对应的内部编码。我们来分析一下为什么Redis会这样设计数据结构和底层编码。首先,第一个好处是可以改进内部编码。这样做时,在不改变内部数据结构的情况下,不需要修改外部结构和命令。第二个好处是我们知道不同的内部编码有不同的性能。当我们这样设计的时候,如果我们要改变底层内部编码,我们只需要根据Redis配置options,将我们存储的key改变底层编码,这样就可以针对不同的业务场景进行个性化的配置,从而提高性能。单线程架构我们知道Redis采用单线程架构和I/O多路复用模型来实现高性能的内存服务。单线程模型客户端每次调用一个命令,都会经过三个步骤:发送命令、执行命令、返回结果。之前我们介绍过,Redis是单线程的,所以每条命令都是从客户端发送到服务端的,命令不会立即执行,而是会把所有的命令放入一个队列中,然后依次执行。这样,当我们的客户端启动多个命令执行时,就不用考虑并发的问题了,因为它们都会进入队列,依次执行。为什么单线程处理速度那么快首先,我们知道Redis是将数据全部存储在内存中,内存的处理速度比单纯的硬盘IO要快很多。第二,非阻塞I/O。Redis使用epoll作为I/O多路复用技术。除了Redis自带的事件处理模型外,epoll中的连接、读写、关闭都转化为事件,这些在网络中是没有的。在I/O上浪费了过多的时间。单线程避免了线程切换等消耗。首先,我们知道在做项目开发的时候,如果要兼容多线程,那么要比单线程复杂很多,代码变得更复杂,出现BUG的可能性也更大。.其次,在开发多线程的时候,我们知道线程之间的切换是非常耗费资源的,而对于服务端来说,给一个线程加锁,每次执行的时候都去判断锁,是非常耗时的。Redis的单线程架构虽然有好处,但这也是它的缺点。我们知道命令是按顺序执行的。如果前面的命令没有执行,后面的命令也不会执行。也造成了命令的阻塞。对于Redis这样的内存数据库,如果发生阻塞,后果可想而知。因此,我们在执行相关命令时一定要谨慎。