一、简单认识Redis结构

Redis

  Redis(Remote Dictionary Server ),即远程字典服务。它属于数据库系统中NOSQL数据库的key-vaule存储类型的数据库,是基于内存存取的。因为它的存取方式以及特殊设计的内部结构,使得它拥有极快的读写速度。并且因为Redis的命令执行是单线程的,避免了多线程的上下文切换的性能消耗,以及多线程线程安全的复杂代码设计,使得Redis拥有极高的处理速度和线程安全能力。

一、存储结构

  在作者的学习新知识和事物过程中,经常会因为对新知识和事物没有一个整体的认识,而遇到很多的理解方面的困难。在这里,作者对Redis从用户使用的角度对Redis的一个整体结构进行简短的介绍,方便大家学习,不要遇到和作者一样的问题。

1:数据存储结构

  在Redis中,所有的数据和配置都存储在redisService结构中,它是Redis服务的基础。当Redis服务启动时,Redis服务会将配置信息初始化到redisService中,如服务监听的端口、客户端的最大连接数量、数据库数量等。同时Redis服务还会根据redisService中的数据库数量配置:dbnum,生成一定数量的数据库。这些数据库以数组的形式关联到redisService结构体的db属性上。
  在Redis中数据库的结构体为redisDb,在内部存在一个dict属性,这个属性是一个key-value结构的集合,每个redisDb的dict都存储了这个数据库中所有的key-value数据,它是所有我们在Redis中存储的数据最终存储的位置。并且其中的key-value数据结构的key只能是字符串。但是value可以为:String、Set、Hash、sorted set、List、bitmaps、HyperLogLog、GEO、Stream等9种数据类型的数据。
Redis存储结构

2:数据类型

  截至到Redis 7.0.0版本,Redis中支持的数据类型有9种,它们的数据类型和支持的版本如下:

数据结构支持版本介绍
String1.0.0String 是由一组有序的字符组成的串行结构,是一个基本的数据结构。在使用中常常会用来当作缓存,存储服务中的数据
List1.0.0List 是一组数据组成的线性存储结构,在使用过程中可以通过指定在头部或尾部执行添加和获取并删除操作,实现栈和队列的效果。
Set1.0.0Set 结构是无序并且元素值唯一的集合。存储到该数据结构中的数据是不可重复的,如果是重复的则只会存在一份,并且该数据结构内部是无序的。
sorted set1.2.0Sort Set是Set数据结构的一种加强。给每一个数据元素关联一个数值,可以通过该元素关联的数值进行排序。与Set相同的是ZSet的元素也是唯一的不可重复的。
Hash2.0.0Hash和dict的数据结构相同,不过它的value只能够为数字和字符串。并且它的key具有和set相同的特征。值唯一,并且无序存储。
bitmaps2.2.0bitmaps 数据结构实质上是对String的一个额外扩充,是对二进位的操作集成。
HyperLogLog2.8.9HyperLogLog是用于做基数统计的一种数据结构,它会对需要计数的数据以极小的空间就实现去重计数功能,只是存在0.81%的一个误差。
Geo3.2.0Geo是一个用于存储地理位置信息集合的数据结构。通过该数据结构可以获取两个地理位置之间的距离或者指定中心点一定范围内的地理位置集合。
Stream5.0.0这是一个用于实现消息队列的数据结构,它的结构和kafka很像,一个Stream可以有多个消费者组,它们之间互相隔离,可以重复的读取同一条数据。每个消费者组可以拥有多个消费者,同一个组的消费者互相影响,不能消费同一条数据。

二、执行结构

  在Redis服务中,程序的执行结构相对于数据的存储结构增加了一部分和用户交互使用的结构。具体结构如下图:
执行结构

  这些结构和下图中的执行过程息息相关。
执行过程
  在上图中步骤1、2是Redis服务启动时执行的操作。其中第1步时Redis服务会获取所有支持的命令和该命令的执行函数,以key-value形式存储在redisService结构的commands属性中。结构图中的redisCommand就是一个命令执行函数的结构体,属性proc指向具体的执行函数。
  在第2步中Redis服务会根据dbnum配置,初始化一定数量的数据库,以数组形式关联到redisService结构的db中。并且还会创建一个空的列表,关联到redisService的clients属性上。
  第3步和第4步为,当用户向Redis服务发起请求时,Redis服务收到连接请求会创建一个client结构对象。并将连接关联到client对象的conn属性和将redisService结构中下标为0的db关联到该对象上的db属性上,之后则将该对象添加到redisService结构的clients属性上。
  第5步和第6步为,当连接创建成功之后,用户通过该连接发送报文,Redis服务接收报文之后对报文进行解析,并将解析结果存储在client的argv属性上。
  第7步为根据解析出的报文信息,获取需要执行的命令,并根据命令从redisService中的commands属性中获取相应的命令执行函数,并将执行函数关联到client的cmd属性上。
  第8步为以当前client为参数执行cmd的proc指向的函数。(因为client关联了所有的数据所以以client为参数就可以满足命令函数的执行需求)
  第9步和第10步联合起来为返回结果给用户,第9步为函数执行过程中将返回结果临时存储在client中,第10步才将数据交给用户。

结束语

  以上是作者对于Reids的存储结构和执行结构的一个理解和总结。其中隐去了部分用户无感知的部分(用户在使用过程中无法通过Redis命令去操作的部分),只保留了用户常用部分的结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值