Redis设计与实现——独立功能的实现

发布和订阅

频道的订阅和退订

struct  redisServer{
    //键是被订阅者频道  ,键是一个链表,记录所有订阅这个频道的客户端
    dict  *publish_channels
}

订阅实现:                                                                                                退订实现:

模式的订阅和退订

模式指定的topic通配化。

 

发送消息

事务

 事务首先以一个MULTI命令为开始,接着将多个命令放在事务中,最后由EXEC命令将这个事务提交(commit)给服务器执行。

事务从开始到结束会经历3个阶段:事务开始,命令入队,事务执行。

watch命令的实现

watch命令是一个乐观锁,它可以在EXEC命令执行前,监视任意数量的数据库键,在EXEC执行时,检查被监视的键是否被另一个client修改过,如果是的话,则拒绝事务,并向client返回事务失败的空回复。

一个完整的WATCH事务执行过程

1) c10086 > WATCH "name"

2)之后c10086 > MULTI  

           SET  “name”  "Peter"

3)之后c999 > SET  “name”  “john”

4)c999执行的这个SET命令,使得正在监视“name”键的所有客户端柏阔c10086的REDIS_DIRTY_CAS标识被打开,之后c10086执行EXEC命令因此失败,服务器拒绝执行事务。只有REDIS_DIRTY_CAS标识未被打开,服务器才会执行客户端提交的事务。

事务ACID

慢查询日志

 

监视器

 通过执行MONITOR命令,client可以将自己变成监视器,实时地接收并打印出服务器当前处理的命令请求相关信息。

成为监视器

向监视器发送命令信息

服务器在每次处理命令请求之前,都会调用replicationFeedMonitors函数,由这个函数将被处理的命令请求的相关信息发送给各个监视器。

总结:

原文地址:https://www.cnblogs.com/gaojy/p/7156964.html