(1)redis下载编译
一、redis下载编译
这里没什么好说的
用的版本是redis-2.8.17
1)redis-server是可执行程序
2)mian函数在redis.c里面
3)如果要修改调试 这届在src目录下 修改后make或者make clean;make 就行
从main函数说起这里先说两个部分一个是 redis里面的回调函数 还有一个是redis里面的log日志
二、redis里的回调函数
先看下代码;这是把redis里面的回调函数拿出来修改下
- /*
- redis里的回调函数
- */
- #include<stdio.h>
- #include<stdlib.h>
- static void zmalloc_default_oom(size_t size)
- {
- printf("zmalloc_default_oom\n");
- fprintf(stderr, "zmalloc: Out of memory trying to allocate %d bytes\n",size);
- fflush(stderr);
- }
- static void (*zmalloc_oom_handler)(size_t) = zmalloc_default_oom;
- void zmalloc_set_oom_handler(void (*oom_handler)(size_t))
- {
- printf("zmalloc_set_oom_handler\n");
- zmalloc_oom_handler = oom_handler;
- }
- void redisOutOfMemoryHandler(size_t allocation_size)
- {
- printf("redisOutOfMemoryHandler------:%d\n",allocation_size);
- }
- int main(void)
- {
- //zmalloc_set_oom_handler(redisOutOfMemoryHandler);
- zmalloc_oom_handler();
- getchar();
- return ;
- }
运行结果
zmalloc_default_oom
zmalloc:Out of memory trying to allocate 10 bytes
我们可以看到默认情况下,在没有注册回调函数的情况下zmalloc_oom_handler是指向 zmalloc_default_oom函数的
假如注册了回调函数的情况下,则调用的是 注册了的回调函数
- int main(void)
- {
- zmalloc_set_oom_handler(redisOutOfMemoryHandler);
- zmalloc_oom_handler();
- getchar();
- return ;
- }
运行结果
zmalloc_set_oom_handler
redisOutOfMemoryHandler----------:10
现在看看redis的代码
- int main(int argc, char **argv)
- {
- struct timeval tv;
- /* We need to initialize our libraries, and the server configuration. */
- #ifdef INIT_SETPROCTITLE_REPLACEMENT
- //初始化参数
- spt_init(argc, argv);
- #endif
- setlocale(LC_COLLATE,"");
- /*
- zmalloc_enable_thread_safeness()
- 开启了内存分配管理的线程安全变量,当内存分配时,
- redis会统计一个总内存分配量,这是一个共享资源,
- 所以需要原子性操作,在redis的内存分配代码里,
- 当需要原子操作时,就需要打开线程安全变量。
- */
- zmalloc_enable_thread_safeness();
- /*
- zmalloc_set_oom_handler()
- 是一个内存分配错误处理,
- 当无法得到需要的内存量时,
- 会调用redisOutOfMemoryHandler函数。
- */
- zmalloc_set_oom_handler(redisOutOfMemoryHandler);
- srand(time(NULL)^getpid());
- gettimeofday(&tv,NULL);
- dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
- server.sentinel_mode = checkForSentinelMode(argc,argv);
- initServerConfig();
- ..........
- }
- zmalloc_set_oom_handler注册回调函数
- redisOutOfMemoryHandler主要是个log日志打印,即在内存分配失败的时候触发回调函数,打印log。
- void *zmalloc(size_t size) {
- void *ptr = malloc(size+PREFIX_SIZE);
- if (!ptr) zmalloc_oom_handler(size);
- #ifdef HAVE_MALLOC_SIZE
- update_zmalloc_stat_alloc(zmalloc_size(ptr));
- return ptr;
- #else
- *((size_t*)ptr) = size;
- update_zmalloc_stat_alloc(size+PREFIX_SIZE);
- return (char*)ptr+PREFIX_SIZE;
- #endif
- }
在分配内存失败的时候,触发回调函数
三、redis的log日志
由于redis是单线程的 所以在redis.c里面的log没有做成多线程
这样的log,在单线程下 速度很快,因为无锁。但是在多线程下是不安全
简化了下 redis的log 单是大抵就是这样
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- /* Log levels */
- #define REDIS_DEBUG 0
- #define REDIS_VERBOSE 1
- #define REDIS_NOTICE 2
- #define REDIS_WARNING 3
- #define REDIS_MAX_LOGMSG_LEN 1024 /* 默认信息长度 */
- void redisLogRaw(int level, const char *msg);
- void redisLog(int level, const char *fmt, ...);
- /*
- verbosity表示开启log的级别
- 需要写log的时候,log级别小于等于verbosity写log
- 否则不会写log
- */
- struct redisServer {
- int verbosity; /* 日志级别*/
- char *logfile; /* Path of log file */
- };
- struct redisServer server; /* server global state */
- void redisLog(int level, const char *fmt, ...)
- {
- //如果level级别大于verbosity则不打印
- if (level> server.verbosity)
- {
- return;
- }
- va_list ap;
- char msg[REDIS_MAX_LOGMSG_LEN];
- va_start(ap, fmt);
- vsnprintf(msg, sizeof(msg), fmt, ap);
- va_end(ap);
- redisLogRaw(level,msg);
- }
- void redisLogRaw(int level, const char *msg)
- {
- #if 1
- FILE *fp;
- char buf[];
- // int rawmode = (level & REDIS_LOG_RAW);
- //int log_to_stdout = server.logfile[0] == '\0';
- //level &= 0xff; /* clear flags */
- //if (level < server.verbosity) return;
- if(server.logfile != NULL)
- {
- fp=fopen(server.logfile,"a");
- }
- else
- {
- fp=stdout;
- }
- int off;
- // struct timeval tv;
- //gettimeofday(&tv,NULL);
- //off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec));
- //snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
- //fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg);
- fprintf(fp," %s\n",msg);
- fflush(fp);
- if(server.logfile != NULL)
- {
- fclose(fp);
- }
- #endif
- }
- int main(void)
- {
- server.verbosity=;
- server.logfile=NULL;
- redisLog(,"11111111\n");
- redisLog(,"22222\n");
- redisLog(,"333\n");
- getchar();
- return ;
- }
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
/* Log levels */
#define REDIS_DEBUG 0
#define REDIS_VERBOSE 1
#define REDIS_NOTICE 2
#define REDIS_WARNING 3
#define REDIS_MAX_LOGMSG_LEN 1024 /* 默认信息长度 */
void redisLogRaw(int level, const char *msg);
void redisLog(int level, const char *fmt, ...);
/*
verbosity表示开启log的级别
需要写log的时候,log级别小于等于verbosity写log
否则不会写log
*/
struct redisServer {
int verbosity; /* 日志级别*/
char *logfile; /* Path of log file */
};
struct redisServer server; /* server global state */
void redisLog(int level, const char *fmt, ...)
{
//如果level级别大于verbosity则不打印
if (level> server.verbosity)
{
return;
}
va_list ap;
char msg[REDIS_MAX_LOGMSG_LEN];
va_start(ap, fmt);
vsnprintf(msg, sizeof(msg), fmt, ap);
va_end(ap);
redisLogRaw(level,msg);
}
void redisLogRaw(int level, const char *msg)
{
#if 1
FILE *fp;
char buf[64];
// int rawmode = (level & REDIS_LOG_RAW);
//int log_to_stdout = server.logfile[0] == '\0';
//level &= 0xff; /* clear flags */
//if (level < server.verbosity) return;
if(server.logfile != NULL)
{
fp=fopen(server.logfile,"a");
}
else
{
fp=stdout;
}
int off;
// struct timeval tv;
//gettimeofday(&tv,NULL);
//off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec));
//snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
//fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg);
fprintf(fp," %s\n",msg);
fflush(fp);
if(server.logfile != NULL)
{
fclose(fp);
}
#endif
}
int main(void)
{
server.verbosity=2;
server.logfile=NULL;
redisLog(1,"11111111\n");
redisLog(2,"22222\n");
redisLog(3,"333\n");
getchar();
return 0;
}
(1)redis下载编译的更多相关文章
- centos6.5环境Redis下载及编译安装
centos6.5环境Redis下载及编译安装 1:官方站点: http://redis.io/download 下载最新版或者最新stable版 2:解压源码并进入目录 tar -zxvf redi ...
- Centos中Redis的下载编译与安装(超详细)
场景 NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充.随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数 ...
- Redis下载及安装部署
官网介绍:Redis is an open source advanced key-value store.It is often referred to as a data structure se ...
- Nginx+Php-fpm+MySQL+Redis源代码编译安装指南
说明:本教程主要包括以下三个部分: 1. 源代码编译安装Nginx 2. 源代码编译安装php以及mysql.redis扩展模块 3. 配置虚拟主机 文中所涉及安装包程序均提供下载链接,欢迎使用 运行 ...
- redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化
知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作) 2. 数据类型 (重点) (操作) (理解) 3. 常用指令 (操作) 4. Jedis (重点) (操作) ...
- 下载编译Chrome详细步骤
文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/ho ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- 【Redis】编译错误zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
[Redis]编译错误zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory 在安装redis进行编译 ...
- 更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning MSB8051
更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning: C:\Program Files (x86)\Microsoft Visual Studio\2017 ...
随机推荐
- mesos资源动态分配测试
测试集群配置 60CPU,320G RAM 测试内容:先运行一个需要60CPU的Application1,再运行一个需要50CPU的Application2. 结果分析 如果要等Application ...
- Windows 2003/2008更改远程桌面端口脚本
保存为bat文件,点击运行按提示输入新端口自动完成,直接下载更改远程桌面端口脚本 @echo off color 0a title @@ 修改Windows XP/2003/2008远程桌面服务端 ...
- DataTable 筛选数据
//使用聚合函数 max ,sum ,count .... private void ComputeBySalesSalesID(DataSet dataSet) { // Presumes ...
- Oracle游标总结三
-- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标--(1)定义游标--(2)定义游标变量--(3)使用for循环来使用这个游标,for ...
- 机器学习中的范数规则化之(一)L0、L1与L2范数(转)
http://blog.csdn.net/zouxy09/article/details/24971995 机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http: ...
- knockout之入门介绍
Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript的前端UI简单化.Knockout是一个以数据模型(data model)为基础的能够帮助你创建丰富文本,响应显示和编 ...
- Javascript之回调函数(callback)
1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方 ...
- [转]通过PowerShell工具跨多台服务器执行SQL脚本
转至:http://www.cnblogs.com/SameZhao/p/4743692.html 有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心 ...
- 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例
k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...
- android 项目学习随笔十(自定义ProgressBar)
android:innerRadius 内部半径 android:thickness 厚度 gradient 渐变 android:useLevel="false" 取掉控件自带旋 ...