Redis(二)全局命令

56 阅读4分钟

对于键值数据库而言,基本的数据模型是 key-value 模型,Redis 支持的 value 类型包括了 String、哈希表、列表、集合等,而Memcached支持的 value 类型仅为 String 类型,所以Redis 能够在实际业务场景中得到广泛的应用,就是得益于支持多样化类型的 value。

Redis里面有16个库,但是Redis的分库功能没啥意义(默认就是0号库,尤其是集群操作的时候),我们一般都是默认使用0号库进行操作。

在了解Rediskey-value 模型之前,Redis的有一些全局命令,需要我们提前了解。

keys命令

keys *
keys k*

查看所有键(支持通配符): 截屏2023-06-09 13.17.02.png

但是这个命令请慎用,因为keys命令要把所有的key-value对全部拉出去,如果生产环境的键值对特别多的话,会对Redis的性能有很大的影响,推荐使用dbsize。

keys命令会遍历所有键,所以它的时间复杂度是o(n),当Redis保存了大量键时线上环境禁止使用keys命令。

dbsize命令

dbsize命令会返回当前数据库中键的总数。

截屏2023-06-09 13.18.27.png

dbsize命令在计算键总数时不会遍历所有键,而是直接获取 Redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1)。

exists key

检查键是否存在,存在返回1,不存在返回0。

截屏2023-06-09 13.19.20.png

del key

删除键,无论值是什么数据结构类型,del命令都可以将其删除。返回删除键个数,删除不存在键返回0。同时del命令可以支持删除多个键。

截屏2023-06-09 13.20.23.png

截屏2023-06-09 13.20.42.png

type key

返回键的数据结构类型,例如键kongbai是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list,键不存在返回none

截屏2023-06-09 13.46.30.png

randomkey

随机返回一个键,这个很简单,请自行实验。

rename

对键重命名

但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。

截屏2023-06-09 13.49.43.png

从上面我们可以看出,由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。

renamenx

为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。

截屏2023-06-09 13.53.34.png

键过期

expire key [seconds]

对键添加过期时间,当超过过期时间后,会自动删除键,时间单位秒。

截屏2023-06-09 13.25.27.png

ttl/pttl key

ttl和pttl命令会返回键的剩余过期时间,它有3种返回值:

大于等于0的整数:键剩余的过期时间(ttl返回值单位为秒;pttl返回值单位为毫秒)。

-1:键没设置过期时间。

-2:键不存在

截屏2023-06-09 13.32.47.png

expireat key [timestamp]

timestamp: 键在秒级时间截timestamp后过期。 截屏2023-06-09 13.33.32.png

pexpire key [milliseconds]

与expire类似,时间单位为毫秒 milliseconds:键在milliseconds毫秒后过期。

截屏2023-06-09 13.37.41.png

pexpireat key [milliseconds-timestamp]

与expireat类似,只是使用毫秒时间戳 milliseconds-timestamp键在毫秒级时间戳timestamp后过期。

截屏2023-06-09 13.41.02.png

persist key

删除key的过期时间 截屏2023-06-09 13.42.18.png

注意事项

在使用Redis相关过期命令时,需要注意以下几点。

  1. 如果expire key 的键不存在,返回结果为0

  2. 如果过期时间为负值,键会立即被删除,犹如使用del命令一样

  3. persist命令可以将键的过期时间清除

  4. 对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视

  5. Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,不能对二级数据结构做过期时间设置。

键名的生产实践

Redis没有命令空间,而且也没有对键名有强制要求。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用“业务名:对象名:id:[属性]”作为键名(也可以用其他符号连接)。

例如MySQL的数据库名为mall,用户表名为order,那么对应的键可以用"mall:order:1", "mall:order:1:name"来表示,如果当前Redis 只被一个业务使用,甚至可以去掉“order:”。

在能描述键含义的前提下适当减少键的长度,从而减少由于键过长的内存浪费。