为何单线程
你期望的多线程编程 VS 实际上的多线程编程 Redis v4.0(引入多线程处理异步任务) Redis v6.0(正式在网络模型中实现 I/O 多线程)
redis AE是什么
Redis使用了一个称为“A simple event-driven programming library”的自制异步事件库(以下简称“AE”)。整个事件库的代码量少于1k行,是个优秀的C异步事件库学习材料。
作者:Eason_Ye 链接:https://www.jianshu.com/p/da092472080e 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
redis网络模型源码
设计思想
- 合适的场景用合适的方式
Redis服务器中有不少功能需要获取系统的当前时间,而每次获取系统的当前时间需要执行一次系统调用,为了减少系统调用的次数,服务器状态中的unixtime属性和mstime属性被用作当前时间的缓存
struct redisServer{
time_t unixtime;
long long mstime;
};
因为serverCron函数会默认以每100毫秒的频率更新unixtime属性和mstime属性,所以这两个属性记录的时间精确度并不算高。
- 打印日志、更新服务器的LRU时钟、决定是否执行持久化、计算服务器上线时间等对时间精确度要求不高的操作时才会使用这两个属性。
- 对于设置键过期时间、添加慢查询日志等需要高精度的工作,服务器会执行系统调用从而获取最准确的当前时间
好像synchronized锁,虽然很重,但不是不能用,不是用了效率就低,有场景的:像双重校验锁实现单例就用了synchronized,依然有很高的性能,concurrent hashmap分段锁+synchronized性能也很好,粒度本身很大,但是面积很小,命中的概率很低,是可以用synchronized的
|