Redis:06---数据库管理

网友投稿 798 2022-09-02

Redis:06---数据库管理

Redis:06---数据库管理

一、服务器中的数据库

Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库:

struct redisServer {// ...redisDb *db; // 一个数组,保存着服务器中的所有数据库// ...};

数据库数量(dbnum属性、database选项)

数据库的数量:在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库:

struct redisServer {// ...int dbnum;//服务器的数据库数量// ...};

dbnum属性的值由服务器配置的database选项决定,默认情况下,该选项的值为16,所以Redis服务器默认会创建16个数据库,如下图所示:

dbsize命令可以返回当前数据库中键的数量

二、数据库的切换(SELECT命令)

每个Redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库以下代码示例演示了客户端在0号数据库设置并读取键msg,之后切换到2号数据库并执行类似操作的过程:这个推荐给大家一个好用的redis客户端 RedisDesktopManager

在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针:

typedef struct redisClient {// ...redisDb *db;//记录客户端当前正在使用的数据库// ...} redisClient;

redisClient.db指针指向redisServer.db数组的其中一个元素,而被指向的元素就是客户端的目标数据库

演示案例

比如说,如果某个客户端的目标数据库为1号数据库,那么这个客户端所对应的客户端状态和服务器状态之间的关系如下图所示

如果这时客户端执行命令SELECT 2,将目标数据库改为2号数据库,那么客户端状态和服务器状态之间的关系将更新成下图所示

通过修改redisClient.db指针,让它指向服务器中的不同数据库,从而实现切换目标数据库的功能——这就是SELECT命令的实现原理

多数据库功能已经逐渐弱化了

那么能不能像使用测试数据库和正式数据库一样,把正式的数据放在0号数据库,测试的数据库放在1号数据库,那么两者在数据上就不会彼此受影响了。事实真有那么好吗?Redis3.0中已经逐渐弱化这个功能,例如Redis的分布式实现Redis Cluster只允许使用0号数据库,只不过为了向下兼容老版本的数据库功能, 该功能没有完全废弃掉,下面分析一下为什么要废弃掉这个“优秀”的功能 呢?总结起来有三点:

·Redis是单线程的。如果使用多个数据库,那么这些数据库仍然是使用 一个CPU,彼此之间还是会受到影响的多数据库的使用方式,会让调试和运维不同业务的数据库变的困难, 假如有一个慢查询存在,依然会影响其他数据库,这样会使得别的业务方定 位问题非常的困难部分Redis的客户端根本就不支持这种方式。即使支持,在开发的时候 来回切换数字形式的数据库,很容易弄乱

个人建议如果要使用多个数据库功能,完全可以在一台机器上部署多个Redis实例,彼此用端口来做区分,因为现代计算机或者服务器通常是有多 个CPU的。这样既保证了业务之间不会受到影响,又合理地使用了CPU资源

三、清除数据库(flushdb、flushall)

flushdb/flushall命令用于清除数据库,两者的区别的是:flushdb只清除当前数据库,flushall会清除所有数据库(老板最怕的就是删库跑路的员工了,所以最怕的技术是只会rm -rf的和删库的)

这两个命令使用需要谨慎

flushdb/flushall命令会将所有数据清除,一旦误操作后果不堪设想,后面的文章会介绍rename-command配置规避这个问题,以及如何在误操作后快速恢复数据如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能性

演示案例

例如下面0号数据库中有2个键,1号数据库有1个键,我们使用flushdb只清空1号数据库中的键

我们在1号数据库中使用flushall命令,此时会清除所有数据库中的键

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Laravel实现找回密码及密码重置,详细操作(laravel密码加密方式)
下一篇:Ubuntu 16.04 搭建 LAMP 环境
相关文章

 发表评论

暂时没有评论,来抢沙发吧~