Redis系列文章-Redis数据库介绍
前言:
前篇介绍了Redis内置基本数据结构,在开始介绍数据库功能部分前,先补充下Redis数据库知识。
目录结构如下:
[Redis内置数据结构]
[Redis数据库介绍]
[Redis持久化]
[Redis事件]
[Redis节点复制功能]
[Redis哨兵功能]
[Redis集群功能]
[Redis排序功能实现]
[Redis常见使用场景]
Redis数据库介绍
数据库切换
Redis服务器默认会创建16个数据库。每个Redis客户端都有自己的目标数据库。默认情况下,Redis客户端的默认数据库为0号数据库。客户端也可以通过select命令来选择切换目标数据库。
举个栗子如下所示
客户端在0号数据库设置并读取键msg,之后切换到2号数据库并执行类似操作如下:
127.0.0.1:6379> set msg "hello"
OK
127.0.0.1:6379> get msg
"hello"
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> get msg
(nil)
127.0.0.1:6379[2]>
谨慎处理多数据库程序:到目前为止,Redis没有可以返回目标数据库的命令。虽然使用Redis-cli可以看到所在目标数据库。但在一些其他语言的客户端是没有目标数据库显示的。
数据库键过期
数据库允许给键值对设置过期时间。
举个栗子如下所示
127.0.0.1:6379> set k v
OK
127.0.0.1:6379> EXPIRE k 5 // 设置过期时间5s
(integer) 1
127.0.0.1:6379> get k // 5s之内
"v"
127.0.0.1:6379> get k // 5s之后
数据库底层实现过期键也很简单。数据库在保存键值对时,会额外保存键过期的时间戳。当时间戳到达过期时间时,数据库会自动清除这些过期的键值对。那木Redis是一种怎样的策略清除过期键?下文便展示了常见的几种方式。
- 定时删除:在设置键过期时间的同时,创建一个定时器,让定时器在时间戳到达时,立即执行删除键的操作。优点是及时清除过期的键值对,缺点是当数据量大时,要为每个设置过期时间的键值对创建定时器,占用CPU资源。会极大影响数据库的响应时间和吞吐量。
- 惰性删除: 放任键过期不管,每次对键进行操作时,先判断键是否达到过期时间,若已经过期,则进行删除。惰性删除是用内存空间换效率。但我们内存资源是相当宝贵的,特别对于大数据量时,会浪费很多内存空间。
- 定期删除: 每隔一段时间,就会对数据库进行一次检查,删除里面的过期键。至于要删除多少键,扫描多少数据库,由程序自己决定。定期删除是对定时删除和惰性删除的一种折中。但定期策略的难点在于确定执行删除操作的频率和时常。过多或者过少都会演变成定时删除和惰性删除。
Redis删除策略:针对上述过期键删除策略,Redis实际采用定期删除和惰性删除两种策略。通过这两种策略的配合使用,可以很好的在CPU时间和避免内存浪费之间取得平衡。
AOF,RDB,复制功能对过期键的处理
因为刚好讲到过期键,所以这里也把AOF持久化,RDB持久化,复制功能对过期键的影响也讲讲。
RDB持久化
RDB文件生成:在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对此时数据库中的键进行过期检查,如果键过期了,就不会写入RDB文件中。
RDB文件载入:在启动Redis时,如果服务器开启了RDB功能,那木服务器会将RDB文件中的键值对载入到Redis数据库中。
- 如果服务器是主服务器。那木在启动时会对RDB文件的键值对进行过期判断,如果过期时间戳小于此时时间戳,那木这个键就是过期了。主服务器是不会将过期键载入的。
- 如果服务器是从服务器,启动时是不会校验键的过期时间,全部都载入。
AOF持久化
AOF文件写入
AOF和RDB文件不一样的是,RDB文件记录的是键值对,AOF文件记录的是每次操作命令。当一个键key过期时,被惰性删除和定期删除检查到了,会写一条删除key的指令到AOF文件中。来显示的记录该键已经被删除了。
AOF文件载入
AOF文件载入只会重复执行AOF文件中的命令行。保存执行后的数据。对过期键的处理没有描述。
复制功能
当程序运行在复制模式下,从服务器是不会主动对过期键进行删除的。
- 主服务器在删除一个过期键后,会向所有的从服务器发送一条DEL命令,告知从服务器对过期键进行删除。
- 当从服务器接受到主服务器发送的DEL命令后,才会删除过期键。
- 如果从服务器还没有来的及删除键,有一个GET命令过来,从服务器还是会将这个键值对返回给客户端,即使它已经在主服务器中过期了。
结语
本篇博文内容较少,主要说明了一点不容易发现的知识点。对GET,SET等常规操作进行了省略。