zoukankan      html  css  js  c++  java
  • 深入redis内部之redis启动过程之二

    接上文,继续分析代码

    1. 设置线程安全模式

        zmalloc_enable_thread_safeness();
    /*
    设置线程安全标识符为1
    */
    void zmalloc_enable_thread_safeness(void) {
    zmalloc_thread_safe = 1;
    }

    2. 内存溢出处理

        zmalloc_set_oom_handler(redisOutOfMemoryHandler);
    /*
    内存溢出的调用方法
    */
       void zmalloc_set_oom_handler(void (*oom_handler)(size_t)) {

          zmalloc_oom_handler = oom_handler;
          }

    //调用下一级

    static void (*zmalloc_oom_handler)(size_t) = zmalloc_default_oom;

    //最终调用

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

    3.生成hash seed

        srand(time(NULL)^getpid());
        gettimeofday(&tv,NULL);
        dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());

     3.1 time( )函数
    头文件:#include <time.h>
    函数定义:time_t time(time_t *timer)
    功能描述:该函数返回从197011000000秒至今所经过的秒数。如果time_t *timer非空指针,函数也会将返回值存到timer指针指向的内存。
    返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。

    3.2 getpid(取得进程识别码)
    表头文件 #include<unistd.h>
    定义函数 pid_t getpid(void);
    函数说明 getpid()用来取得目前进程的进程识别码。

    3.3 srand()函数 
    void srand(unsigned seed) 初始化随机数发生器。

    3.4 gettimeofday()函数

    #include<sys/time.h>
    int gettimeofday(struct timeval*tv,struct timezone *tz )
    gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

    3.5 设置hash seed

    static uint32_t dict_hash_function_seed = 5381;
    
    void dictSetHashFunctionSeed(uint32_t seed) {
        dict_hash_function_seed = seed;
    }

    4. 检查是否sentime模式(集群的临时方案)

     server.sentinel_mode = checkForSentinelMode(argc,argv);
    //根据启动的参数来检查是否sentinel模式
    /* Returns 1 if there is --sentinel among the arguments or if
     * argv[0] is exactly "redis-sentinel". */
    int checkForSentinelMode(int argc, char **argv) {
        int j;
    
        if (strstr(argv[0],"redis-sentinel") != NULL) return 1;
        for (j = 1; j < argc; j++)
            if (!strcmp(argv[j],"--sentinel")) return 1;
        return 0;
    }
  • 相关阅读:
    关于Python安装PIL库失败的原因
    SSH免密登录及配置完成后仍需要输入密码的解决办法
    Github+Hexo博客搭建教程(三)
    Github+Hexo博客搭建教程(二)
    Github+Hexo博客搭建教程(一)
    winform中控件的简单数据绑定
    分享一个跨线程访问控件的很实用的方法
    自定义两个控件,一个是显示图标和文字的矩形,一个是带边框的label(但是不是label)
    写一个给字符串根据长度添加换行符的处理方法
    Winform DataGridView控件在业务逻辑上的简单使用
  • 原文地址:https://www.cnblogs.com/davidwang456/p/3539773.html
Copyright © 2011-2022 走看看