问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python中的redis有多少个数据库

发布网友 发布时间:2022-04-22 09:53

我来回答

1个回答

热心网友 时间:2022-04-08 01:24

跟Python没有关系,是redis的问题
1、redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中,redisDb.id 存储着 redis 数据库以整数表示的号码。redisDb.dict 存储着该库所有的键值对数据。redisDb.expires 保存着每一个键的过期时间。

2、当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number 时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。

3、既然我们知道一个数据库的所有键值都存储在redisDb.dict中,那么我们要知道如果找到key的位置,就有必要了解一下dict 的结构了:

typedef struct dict {

// 特定于类型的处理函数
dictType *type;

// 类型处理函数的私有数据
void *privdata;

// 哈希表(2个)
dictht ht[2];

// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;

// 当前正在运作的安全迭代器数量
int iterators;
} dict;
由上述的结构可以看出,redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以redis 中查找一个key,其实就是对进行该dict 结构中的 ht[0] 进行查找操作。

4、既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历该链表来找到我们所查找的key。当然,一般情况下链表长度都为是1,所以时间复杂度可看作o(1)。

二、当redis 拿到一个key 时,如果找到该key的位置。

了解了上述知识之后,我们就可以来分析redis如果在内存找到一个key了。

1、当拿到一个key后, redis 先判断当前库的0号哈希表是否为空,即:if (dict->ht[0].size == 0)。如果为true直接返回NULL。

2、判断该0号哈希表是否需要rehash,因为如果在进行rehash,那么两个表中者有可能存储该key。如果正在进行rehash,将调用一次_dictRehashStep方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。

3、计算哈希表,根据当前字典与key进行哈希值的计算。

4、根据哈希值与当前字典计算哈希表的索引值。

5、根据索引值在哈希表中取出链表,遍历该链表找到key的位置。一般情况,该链表长度为1。

6、当 ht[0] 查找完了之后,再进行了次rehash判断,如果未在rehashing,则直接结束,否则对ht[1]重复345步骤。

到此我们就找到了key在内存中的位置了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
美的燃气热水器12升电脑版显示FR一pH一PL一dH一nE一qU怎么调好_百度知... 热水器ph什么意思 上海工程技术大学公共管理专业是什么学院 公共事业管理在暨南大学中属于哪个学院? 中央财经大学公共事业管理学生就业去向都有哪些 中飞院公共事业管理是什么专业 广西医科大学公共事业管理属于哪个学院 抖音怎么发视频@抖音小助手 发视频@抖音小助手操作一览 轻颜相机怎么取消自动续费 取消自动续费教程 轻颜相机vip怎么取消 吉跑挪车如何设置微信短信 windows 怎么安装python redis 浓差极化名词解释是什么? 扫码挪车这个咋样?刚看到别人发的 单身欢聊软怎么发地址 阿里云数据库redis怎么配置 浓差极化和电化学极化的区别是什么 扫码挪车二维码真的不会泄露隐私? python 虚拟环境里怎么启动redis 挪车二维码免费领取 python怎么测试与redis的连接 花钱的聊天软件怎么发地址 电池浓度差极化? 微信扫码挪车的名片怎么弄,是需要去打印吗 码车云微信挪车这个收费吗?能用多久? 五代时期的邺都兵变是怎么回事? 会挪车的挪车码在那里下单?入口在那里? 如何在Linux上为Python语言安装Redis客户端 怎样设计python脚本实现redis的set命令 小规模纳税人季度应报送哪些报表啊??谢谢! 什么叫电池的极化现象? 支付宝和微信都有挪车码,哪个更好用? 电池极化的原因有哪些 扫码挪车收费么? 为什么说scrapy-redis天然具备断点续爬的功能? 电池使用过程中,电压为何会变 微信上能赚钱的挪车码会挪车靠谱吗? python 的 redis 库,连接池怎么用 车主流扫码挪车终身免费真的吗? 原电池中的极化现象具体是什么? python怎么将数据写入到redis 迈亮车扫二维码真的可以呼叫车主挪车吗? 电池的极化怎么理解最好 支付宝的一键挪车码微信可以扫码吗 汽车的空调,多长时间进行一次维修比较好? python把字典存到redis怎么使用 电池产生电的原理是什么? 什么是原电池的极化现象 什么是糜子,和小米和大黄米什么区别。 蓄电池极化现象