• 深入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;
    }
  • 相关阅读:
    idea actiBPM插件之中文乱码
    quartz 集成到Spring中
    Spring 中将service 注入到普通的工具类中
    idea 将java 项目 打包成jar包
    异常来自 HRESULT:0x80070057 (E_INVALIDARG))
    Entity Framework小知识
    C# Unix时间戳转换
    Asp.NET MVC+WebAPI跨域调用
    位运算逻辑与逻辑或逻辑非运算 c# 中如何使用
    c# 学习笔记 重载、重写、重构、构造函数、new、Class
  • 原文地址:https://www.cnblogs.com/davidwang456/p/3539773.html
Copyright © 2020-2023  润新知