Redis 源码剖析

编程入门 行业动态 更新时间:2024-10-11 01:20:31

Redis <a href=https://www.elefans.com/category/jswz/34/1770099.html style=源码剖析"/>

Redis 源码剖析

zmalloc.c 源码阅读

Redis 自身对内存的分配和释放做了一定封装

阅读内容:

  • 内存分配及释放

  • 内存分配统计

  • 内存异常处理


  1. 可控制是否启用线程安全

    通过 void zmalloc_enable_thread_safeness(void); 函数将 zmalloc_thread_safe 变量置为 1 即开启

  2. 分配的内存统计

    zmalloc_thread_safe 标志位来决定是否在更新 used_memory 变量时加锁。整个内存分配的统计是通过宏定义去实现的

类似这样

#define increment_used_memory(__n) do { \size_t _n = (__n); \if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \if (zmalloc_thread_safe) { \pthread_mutex_lock(&used_memory_mutex);  \used_memory += _n; \pthread_mutex_unlock(&used_memory_mutex); \} else { \used_memory += _n; \} \
} while(0)
  1. 内存溢出处理

static void zmalloc_oom(size_t size) {fprintf(stderr, "zmalloc: Out of memory trying to allocate %zu bytes\n",size);fflush(stderr);abort();
}

注意 abort(),exit(), assert() 区别

exit()

  • flush 未写入的缓冲数据
  • 关闭所有打开的文件
  • 删除所有临时文件
  • 返回退出状态

abort()

  • 可能不会 flush 缓冲数据
  • 可能不会关闭打开的文件
  • 可能不会删除所有临时文件

assert()

  • 如果表达式为 0,表达式,文件名,行号,返回标准错误,然后调用 abort()## 标题

更多推荐

Redis 源码剖析

本文发布于:2024-02-13 21:10:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760416.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:源码   Redis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!