Redis封装

Redis数据库操作层

第一层,也是最底层,是Redis的数据库操作层,封装了各种基本命令,比如,DB的连接,命令的执行,事件通知的回调接口等等。具体的类图如下:

其中:

  • RedisContext:封装并保持着与Redis的连接,当其销毁时会将其连接关闭。
  • DBConnector:封装了所有的底层使用到的Redis的命令,比如SETGETDEL等等。
  • RedisTransactioner:封装了Redis的事务操作,用于在一个事务中执行多个命令,比如MULTIEXEC等等。
  • RedisPipeline:封装了hiredis的redisAppendFormattedCommand API,提供了一个类似队列的异步的执行Redis命令的接口(虽然大部分使用方法依然是同步的)。它也是少有的对SCRIPT LOAD命令进行了封装的类,用于在Redis中加载Lua脚本实现存储过程。SONiC中绝大部分需要执行Lua脚本的类,都会使用这个类来进行加载和调用。
  • RedisSelect:它实现了Selectable的接口,用来支持基于epoll的事件通知机制(Event Polling)。主要是在我们收到了Redis的回复,用来触发epoll进行回调(我们最后会更详细的介绍)。
  • SonicDBConfig:这个类是一个“静态类”,它主要实现了SONiC DB的配置文件的读取和解析。其他的数据库操作类,如果需要任何的配置信息,都会通过这个类来获取。

表(Table)抽象层

在Redis数据库操作层之上,便是SONiC自己利用Redis中间的Key建立的表(Table)的抽象了,因为每一个Redis的Key的格式都是<table-name><separator><key-name>,所以SONiC在访问数据库时需要对其进行一次转换(没有印象的小伙伴可以移步我之前的博客了解更多的信息)。

相关类的主要类图如下:

其中关键的类有三个:

  • TableBase:这个类是所有表的基类,它主要封装了表的基本信息,如表的名字,Redis Key的打包,每个表发生修改时用于通信的Channel的名字,等等。
  • Table:这个类就是对于每个表增删改查的封装了,里面包含了表的名称和分隔符,这样就可以在调用时构造最终的key了。
  • ConsumerTableBase:这个类是各种SubscriptionTable的基类,里面主要是封装了一个简单的队列和其pop操作(对,只有pop,没有push),用来给上层调用。

参考资料

  1. SONiC Architecture
  2. Github repo: sonic-swss
  3. Github repo: sonic-swss-common