首页 » Redis » 正文

Linux下安装Redis

操作系统:CentOS 7
Redis:5.0.7

1、安装Redis

wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar -xf redis-5.0.7.tar.gz
cd redis-5.0.7

使用TCMALLOC内存分配器

a、安装TCMALLOC

###1、安装libunwind
    CFLAGS=-fPIC ./configure
    make CFLAGS=-fPIC
    make CFLAGS=-fPIC install
###2、安装tcmalloc,tcmalloc包含在包google的gperftools中,实际上安装tcmalloc就是安装gperftools
    ./configure
    make && make install
    echo "/usr/local/lib" > /etc/ld.so.conf.d/locallib.conf
    ldconfig

b、安装redis

###方法一
make MALLOC=TCMALLOC
make install
###方法二
make USE_TCMALLOC=yes 
make install

使用jemalloc内存分配器

redis自带有jemalloc的源码包,位于源码目录下的deps目录下的jemalloc
###方法一
make MALLOC=jemalloc 
make install
###方法二
make USE_JEMALLOC=yes 
make install

使用libc内存分配器

###方法一
make MALLOC=libc 
make install
###方法二
make USE_JEMALLOC=no
make install 

2、配置systemd管理redis服务

开启以守护进程方式运行redis
sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/conf/redis.conf
daemonize:yes:
redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。
在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no:
当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。

3、配置redis.service

touch /usr/lib/systemd/system/redis.service

cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
 
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
EOF
启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis

4、redis的内存分配器

内存分配器的定义:src目录下的zmalloc.c中定义了内存分配器的使用规则。
1、检查是否有tcmalloc,如果存在,则使用tcmalloc。
2、如果不存在tcmalloc,则检测是否存在jemalloc,如果存在则使用jemalloc(在deps目录下默认带了jemalloc的源码包,所以如果不指定内存分配器则默认使用jemalloc)
3、如果不存在jemalloc,则使用libc
详细定义如下
#if defined(USE_TCMALLOC)
#define malloc(size) tc_malloc(size)
#define calloc(count,size) tc_calloc(count,size)
#define realloc(ptr,size) tc_realloc(ptr,size)
#define free(ptr) tc_free(ptr)
#elif defined(USE_JEMALLOC)
#define malloc(size) je_malloc(size)
#define calloc(count,size) je_calloc(count,size)
#define realloc(ptr,size) je_realloc(ptr,size)
#define free(ptr) je_free(ptr)
#define mallocx(size,flags) je_mallocx(size,flags)
#define dallocx(ptr,flags) je_dallocx(ptr,flags)
#endif
redis的依赖的包的源码存在于deps目录下,redis依赖lua包和内存分配器,redis自身没有内存分配实现,利用的是已有的内存分配器,jemalloctcmalloc或者libc。进入src目录,打开Makefile文件,可以看到如下内容
####默认安装选项,默认安装在/usr/local目录下
PREFIX?=/usr/local
INSTALL_BIN=$(PREFIX)/bin
INSTALL=install

###如果不是ARM处理器,则默认使用jemalloc,反之则使用libc
# Default allocator defaults to Jemalloc if it's not an ARM
MALLOC=libc
ifneq ($(uname_M),armv6l)
ifneq ($(uname_M),armv7l)
ifeq ($(uname_S),Linux)
  MALLOC=jemalloc
endif
endif
endif

###定义内存分配器的选项,tcmalloc、jemalloc、libc分别使用USE_TCMALLOC、USE_JEMALLOC定义,其中jemalloc和libc分别用USE_JEMALLOC=yes或者no来定义
ifeq ($(USE_TCMALLOC),yes)
  MALLOC=tcmalloc
endif

ifeq ($(USE_TCMALLOC_MINIMAL),yes)
  MALLOC=tcmalloc_minimal
endif

ifeq ($(USE_JEMALLOC),yes)
  MALLOC=jemalloc
endif

ifeq ($(USE_JEMALLOC),no)
  MALLOC=libc
endif
所以编译的时候可以用make MALLOC=jemalloc 或者make USE_JEMALLOC=yes来定义使用jemalloctcmalloclibc方式一致。安装目录可以用make PREFIX=xxxx install来定义。
也可以用环境变量来定义 
export  MALLOC=jemalloc 
export PREFIX=xxxx
deps目录下有个update-jemalloc.sh脚本文件
可以通过执行./update-jemalloc.sh ${jemalloc_version}的方式升级jemalloc版本
在deps目录下的Makefile文件中,大约在第80行定义了jemalloc的编译选项

5、验证redis安装

###执行以下指令
redis-server --version
###输出类似如下内容
Redis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=61b4a113b60582f2

###其中malloc的值表示使用的内存分配器是jemalloc还是tcmalloc或者是libc
redis默认使用jemalloc内存分配器进行内存分配。
如果使用jemalloc内存分配器的话会直接编译进redis-server。
所以如果用lsof -n|grep redis|grep malloc命令去查看调用情况会发现结果为空值
如果使用的是tcmalloclsof -n|grep redis|grep malloc命令去查看调用情况会发现结果为非空
原因是如果采用tcmalloc或者libc内存分配器的话,redis使用的是动态调用的方式。
所以需要预先安装,而jemalloc则不需要,redis自带且编译进redis-server可执行文件中
redis-ser 27124                            root  mem       REG              253,1   3516776    1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27125 redis-ser            root  mem       REG              253,1   3516776    1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27126 redis-ser            root  mem       REG              253,1   3516776    1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27127 redis-ser            root  mem       REG              253,1   3516776    1334638 /usr/local/lib/libtcmalloc.so.4.5.3

发表评论