国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > [置顶] Redis安装与调试

[置顶] Redis安装与调试

来源:程序员人生   发布时间:2014-11-04 08:56:18 阅读次数:3861次
??

Redis安装与调试

Redis安装与调试linux版本:64位CentOS 6.5

Redis版本:2.8.17  (更新到2014年10月31日)

Redis官网:http://redis.io/

Redis经常使用命令:http://redis.io/commands

1.安装Redis

# wget http://download.redis.io/releases/redis⑵.8.17.tar.gz

tar xzf redis⑵.8.17.tar.gz

cd redis⑵.8.17

make

# make install


如果报错

zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/data0/src/redis⑵.6.2/src'
make: *** [all] Error 2

解决办法是:

make MALLOC=libc


注意:Redis并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西。

redis⑵.4以上自带jemalloc,你不需要加任何参数,通过zmalloc.c源码中我们可以看到,Redis在编译时,会先判断是不是使用tcmalloc,如果是,会用tcmalloc对应的函数替换掉标准的libc中的函数实现。其次会判断jemalloc是不是使得,最后如果都没有使用才会用标准的libc中的内存管理函数。所以用tcmalloc优化请谨慎使用,这两着分配器碎片率相差不大,建议用自带jemalloc。


如果要安装tcmalloc可以这样:

# make USE_TCMALLOC=yes

参考:利用TCMalloc替换Nginx和Redis默许glibc库的malloc内存分配


为了调试需要修改CFLAGS参数

# make CFLAGS="-g -O0" 

make命令履行完成后,会在src目录下生成5个可履行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它们的作用以下:
redis-server:Redishttp://www.wfuyu.com/server/的daemon启动程序
redis-cli:Redis命令行操作工具。固然,你也能够用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-check-aof:更新日志检查 

redis-check-dump:用于本地http://www.wfuyu.com/db/检查 

为何没用标准的Linux安装3板斧呢?官方维基是这样说的:Redis can run just fine without a configuration file (when executed without a config file a standard configuration is used). With thedefault configuration Redis will log to the standard output so you can check what happens. Later, you canchange the default settings.

也能够make install,这样就是把可运行文件复制到/usr/local/bin里而已。

make以后,会出现1句提示:

Hint: To run 'make test' is a good idea ;)


-----------------------------------------------------------------

其实不测试,1般都可以用。但是既然人家建议了,我们就走1下make test吧。

运行#make test

报错,提示没有You need 'tclsh8.5' in order to run the Redis test

然后到Tcl的官方网站http://www.tcl.tk/下载8.5版本

然后安装tcl8.5:

(configure和make的位置比较特殊,在安装目录的unix下,所以下面是tcl官方安装法)

#tar xvzf tcl8.5.12-src.tar.gz

#cd tcl8.5.13/unix/

#./configure

#make

#make test

#make install

注:固然,也能够简单1点,用 yum install tcl 来安装。

好了,安装好tcl以后,可以去redis目录下运行make test了,这次正常跑通。提示:

o/ All tests passed without errors!
Cleanup: may take some time... OK

说明redis安装正常。可以运行。

-----------------------------------------------------------------

安装

# make install



2.运行Redis

2.8.17版本,redis-server被放到了src文件夹下。

启动Redis服务端

# /usr/redis⑵.8.17/src/redis-server

如果没有更改daemonize no配置,会看见运行的信息。


注释:

▲redis的默许端口号是6379,(据redis的作者antirez的博文说,6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字。而MERZ长时间以来被antirez及其朋友当作笨拙的代名词。)

▲Redis有两种存储方式,默许是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这类方法缺点是持久化以后如果出现crash则会丢失1段数据。因此在完善主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件。

 

以后台情势运行Redis

需要读取配置文件方式启动

注意,默许复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,我们可以修改redis.conf文件,这个文件就是解压后的redis根目录下

daemonize yes

If you want to provide your redis.conf, you have to run it using an additional
parameter (the path of the configuration file):

    % cd src
    % ./redis-server /path/to/redis.conf

# /usr/redis⑵.8.17/src/redis-server /usr/redis⑵.8.17/redis.conf

查看redis进程

#ps aux |grep redis


启动多个redis实例

拷贝默许的redis.conf改成redis6383.conf,打开redis6383.conf配置文件,找到port 6379这行,把6379改成6383

# /usr/redis⑵.8.17/src/redis-server

# /usr/redis⑵.8.17/src/redis-server /usr/redis⑵.8.17/redis6383.conf


调用服务

/usr/redis⑵.8.17/src/redis-cli

新增

redis> set foo bar

获得

redis> get foo"bar"

删除

redis>del foo



模糊查找

redis>keys f*

redis>keys f?o?


查看info信息

输入# info命令,可以看出内存碎片率:mem_fragmentation_ratio=2.59

默许使用的是jemalloc内存分配器



3.配置 Redis

redis的配置文件在你的安装目录里。名为:redis.conf。

简单说几点redis.conf:

redis默许不是用守护进程的,如果需要更改,把daemonize no改成daemonize yes。(测试的时候可以不改,看看打印信息。)

如果对redis默许6379端口不爽的,可以更改port 6379

如果想把数据文件放到1个指定文件夹,更改dir /opt/data/

默许是dir ./ 也就是默许放到安装目录下。

连接超时时间,timeout 300,没甚么改头……

dir 是数据文件路径。默许在安装目录下。

*下面的配置2选1,详见本文注释部份2。

###### SNAPSHOTTING ######内存快照方式:

默许的内存快照策略是,

在900秒(15分钟)内,最少有1次数据变更;

或300秒内,有最少10次数据变更;

或60秒内,有最少1000次数据变更;时间+数据变更次数,共同影响内存快照的出现。

###### APPEND ONLY MODE ###### AOF方式

appendfsync everysec 每秒同步。这里可以注释掉,打开下面的选项appendfsync no

其余的配置,conf里面的注释写的挺清楚,我就不多空话了。大家看着自己配就好了。

 

可以拷贝配置文件到etc

mkdir /etc/redis 

cp redis.conf /etc/redis/redis.conf 

mkdir  /var/lib/redis 

1. redis.conf 配置参数:

#是不是作为守护进程运行 

daemonize yes 

#如以后台进程运行,则需指定1个pid,默许为/var/run/redis.pid 

pidfile redis.pid 

#绑定主机IP,默许值为127.0.0.1 

#bind 127.0.0.1 

#Redis默许监听端口 

port 6379 

#客户端闲置多少秒后,断开连接,默许为300(秒) 

timeout 300 

#日志记录等级,有4个可选值,debug,verbose(默许值),notice,warning 

loglevel verbose 

#指定日志输出的文件名,默许值为stdout,也可设为/dev/null屏蔽日志 

logfile stdout 

#可用http://www.wfuyu.com/db/数,默许值为16,默许http://www.wfuyu.com/db/为0 

databases 16 

#保存数据到disk的策略 

#当有1条Keys数据被改变是,900秒刷新到disk1次 

save 900 1 

#当有10条Keys数据被改变时,300秒刷新到disk1次 

save 300 10 

#当有1w条keys数据被改变时,60秒刷新到disk1次 

save 60 10000 

#当dump .rdbhttp://www.wfuyu.com/db/的时候是不是紧缩数据对象 

rdbcompression yes 

#本地http://www.wfuyu.com/db/文件名,默许值为dump.rdb 

dbfilename dump.rdb 

#本地http://www.wfuyu.com/db/寄存路径,默许值为 ./ 

dir /var/lib/redis/ 

########### Replication ##################### 

#Redis的复制配置 

# slaveof <masterip> <masterport> 当本机为从服务时,设置主服务的IP及端口 

# masterauth <master-password> 当本机为从服务时,设置主服务的连接密码 

#连接密码 

# requirepass foobared 

#最大客户端连接数,默许不限制 

# maxclients 128 

#最大内存使用设置,到达最大内存设置后,Redis会先尝试清除已到期或行将到期的Key,当此方法处理后,任到达最大内存设置,将没法再进行写入操作。 

# maxmemory <bytes> 

#是不是在每次更新操作落后行日志记录,如果不开启,可能会在断电时致使1段时间内的数据丢失。由于redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在1段时间内只存在于内存中。默许值为no 

appendonly no 

#更新日志文件名,默许值为appendonly.aof 

#appendfilename 

#更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步1次(默许值)。 

# appendfsync always 

appendfsync everysec 

# appendfsync no 

################ VIRTUAL MEMORY ########### 

#是不是开启VM功能,默许值为no 

vm-enabled no 

# vm-enabled yes 

#虚拟内存文件路径,默许值为/tmp/redis.swap,不可多个Redis实例同享 

vm-swap-file /tmp/redis.swap 

#将所有大于vm-max-memory的数据存入虚拟内存,不管vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,实际上是所有value都存在于磁盘。默许值为0。 

vm-max-memory 0 

vm-page-size 32 

vm-pages 134217728 

vm-max-threads 4 

############# ADVANCED CONFIG ############### 

glueoutputbuf yes 

hash-max-zipmap-entries 64 

hash-max-zipmap-value 512 

#是不是重置Hash表 

activerehashing yes 

注意:Redis官方文档对VM的使用提出了1些建议: 

  • 当你的key很小而value很大时,使用VM的效果会比较好.由于这样节俭的内存比较大. 
  • 当你的key不小时,可以斟酌使用1些非常方法将很大的key变成很大的value,比如你可以斟酌将key,value组合成1个新的value. 
  • 最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件. 
  • vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那末所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完全性有很好的保证.

 

2. 调剂系统内核参数

如果内存情况比较紧张的话,需要设定内核参数: 

echo 1 > /proc/sys/vm/overcommit_memory 

这里说1下这个配置的含义:/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是不是有足够的可用内存供利用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把毛病返回给利用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
Redis在dump数据的时候,会fork出1个子进程,理论上child进程所占用的内存和parent是1样的,比如parent占用的内存为 8G,这个时候也要一样分配8G的内存给child, 如果内存没法负担,常常会造成redishttp://www.wfuyu.com/server/的down机或IO负载太高,效力降落。所以这里比较优化的内存分配策略应当设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

 

4.调试debug

注意由于redis默许是启用了内存优化的,所以必须修改编译选项。不然,在gdb内打印变量时提示"<value optimized out>",这多半是由于gcc的优化致使,我们可以加上-O0选项来强迫禁用gcc的编译优化。

Compiling Redis without optimizations

By default Redis is compiled with the -O2 switch, this means that compiler        optimizations are enabled. This makes the Redis executable faster, but at the        same time it makes Redis (like any other program) harder to inspect using GDB.

所以要修改Makefile文件,该文件在/src目录下,修改OPTIMIZATION?=-O2选项便可,修改成O0

OPTIMIZATION?=-O0

 

删掉原来的redis重新修改makefile重新make,启动redis

 

具体调试技能,查看指针变量

查看redis进程

# ps  aux|grep redis

gdb附加到进程

# gdb -p  进程id

(gdb)r     重新开始不然不会从main函数开始

(gdb)break main                  设置断点

(gdb)list                  查看代码

(gdb)p  变量名       查看变量内容,使用p查看变量,这个时候已可以查看

 

redis调试技能

redis会在ae.c的aeMain这个函数处循环处理事件:

// 事件处理器的主循环 void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { // 如果有需要在事件处理前履行的函数,那末运行它 if (eventLoop->beforesleep != NULL) eventLoop->beforesleep(eventLoop); // 开始处理事件 aeProcessEvents(eventLoop, AE_ALL_EVENTS); } }

/usr/redis⑵.6.14/src/redis-cli

redis> set foo bar

OK

redis> get foo"bar"

aeMain函数会截获来自redis-cli的要求,也只有aeMain函数处理好该要求,redis-cli才会返回OK,不然就会1直等待


 

5.基准测试

第1先用启动命令启动redis

然后在任意目录使用命令:

# redis-benchmark-h localhost -p 6379 -c 100 -n 100000

摹拟100个并发连接,100000个要求,检测host为localhost 端口为6379的redishttp://www.wfuyu.com/server/性能


原文地址:http://blog.csdn.net/unix21/article/details/9526295

------------------------------------------------------------------------

更多参考

配置参考:CentOS下Redis 2.2.14安装配置详解

安装参考:Redis (1) 安装

调试参考:http://redis.io/topics/debugging 利用gdb调试redis-server

benchmark参数: Redis安装部署


另外需要在PHP中使用redis需要安装PHP扩大可以参考:

Redis和Redis的php扩大安装无错版

phpredis使用方法

redis经常使用命令参考


??
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生