在这里插入图片描述

在介绍数据类型前先介绍一下 Redis 的基础命令,方便理解

常用命令

keys

返回所有满足样式(pattern)的 key

keys pattern

当前有如下 key

PS:实际开发环境和生产环境不建议使用keys *。因为 keys 的时间复杂度是 O(N),redis 执行命令为单线程,如果数据量过大,可能会因此而阻塞,导致业务线程无法使用 redis,而造成阻塞或更严重的后果

在这里插入图片描述

支持如下样式

  • h?llo:? 可匹配任意一个字符,如 hello,hallo,hxllo

在这里插入图片描述

  • h*llo:* 可匹配任意零个或多个字符,如 hllo、heeeello

在这里插入图片描述

  • h[ae]llo:[ ]可匹配其中任意一个字符,如 hello、hallo,不匹配 hillo、hllo

在这里插入图片描述

  • h[^e]llo:[^e] 反向匹配,除了e都可以匹配,如 hallo、hbllo、…,不匹配 hello、hllo

在这里插入图片描述

  • h[a-e]llo:[a-e] 表示匹配 a-e 范围的任意一个字符,如 hallo、hbllo、hcllo,不匹配 hello、hllo

在这里插入图片描述

exists

判断 key 是否存在,返回存在的个数

exists key [key …]
[ ] 是可选字段

数据同上,不支持样式

在这里插入图片描述

del

删除指定的 key,返回删除的个数

del key [key …]

在这里插入图片描述

type

返回 key 对应的数据类型

type key

返回值:none、string、list、set、zset、hash、stream
添加数据的操作后续讲解

在这里插入图片描述

expire

为指定的 key 添加秒级的过期时间(Time To Live TTL)

expire key seconds

返回值:1 表示设置成功,0表示设置失败

ttl

获取指定 key 的过期时间,秒级

ttl key

返回值:剩余过期时间,-1 表示没有关联过期时间,-2 表示 key 不存在

127.0.0.1:6379> keys *
1) "heeeeello"
2) "hello"
3) "hallo"
4) "hbllo"
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> ttl hllo
(integer) -2
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 6
127.0.0.1:6379> ttl hello
(integer) 5
127.0.0.1:6379> ttl hello
(integer) -2

expire 和 ttl 都有对应的支持毫秒为单位的版本:pexpire 和 pttl,用法相同

在这里插入图片描述

过期策略

一个 redis 中可能存在多个有过期时间的 key,redis 如何知道哪些 key 已经过期,哪些 key 还没有过期呢?

redis 采用了两种策略:

  1. 惰性删除
  2. 定期删除

惰性删除

即当一个 key 已经超过了过期时间,但暂时不会对其进行删除,而是在对其访问时,发现已经过期,再进行删除

定期删除

仅仅是惰性删除还不够,如果过期的 key 长时间没有访问,那么就多堆积在内存,消耗资源。
redis 使用定期删除辅助,即每隔一段时间,抽取一部分 key ,检查其过期时间,过期即删除,保证抽查的过程足够快,因为 redis 是单线程,所以不能让抽查阻塞服务


PS:网上所说的,定时删除(通过为 key 设置定时器实现过期删除),redis 源码中并没有采用,可能是因为采用定时器需要引入多线程,所以没有采用

数据结构和内部编码

type 命令实际返回的是当前键的数据结构类型,分别为 string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序结合),但这些只是 Redis 对外的数据结构

Redis 中 key 的数据结构都为 string,value 的数据结构有不同

在这里插入图片描述

实际 Redis 针对每种数据类型都有自己的底层内部编码实现,而且不同情况下,会有多种实现,适配不同的场景

数据结构:内部编码
数据结构内部编码
stringraw 较长时使用
int 数字
embstr 较短时使用
hashhashtable
ziplist
listlinkedlist
ziplist
quicklist
sethashtable
intset
zsetskiplist 跳表
ziplist

可以使用 object encoding 查看 value 的内部编码

object encoding key

在这里插入图片描述


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐