Redis Ops

Redis数据库操作层

The first and lowest layer is the database operations layer of Redis, which encapsulates various basic commands, such as DB connection, command execution, callback interface for event notification, etc. The specific class diagram is as follows:

Among them:

  • 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)抽象层

On top of the Redis database operation layer is the abstraction of the Table that SONiC itself builds using the Redis intermediate Key, because the format of each Redis Key is <table-name><separator><key-name>, so SONiC needs to perform a conversion (for those who don't remember, you can move to my previous blog for more information).

The main class diagram of the related classes is as follows:

Three of the key classes are:

  • 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