Redis安装与调试



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-2.8.17.tar.gz

tar xzf redis-2.8.17.tar.gz

cd redis-2.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-2.6.2/src'
make: *** [all] Error 2

解决的方法是:

make MALLOC=libc


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

redis-2.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:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。

当然,你也能够用telnet依据其纯文本协议来操作
redis-benchmark:Redis性能測试工具,測试Redis在你的系统及你的配置下的读写性能
redis-check-aof:更新日志检查 

redis-check-dump:用于本地数据库检查 

为什么没用标准的Linux安装三板斧呢?官方维基是这样说的: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之后,会出现一句提示:

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


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

事实上不測试,一般都能够用。

可是既然人家建议了。咱们就走一下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

注:当然。也能够简单一点,用 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-2.8.17/src/redis-server

假设没有更改daemonize no配置,会看见执行的信息。


凝视:

▲redis的默认port号是6379,(据redis的作者antirez的博文说,6379在是手机按键上MERZ相应的号码。而MERZ取自意大利歌女Alessia Merz的名字。而MERZ长期以来被antirez及其朋友当作愚蠢的代名词。)

▲Redis有两种存储方式。默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘。这样的方法缺点是持久化之后假设出现crash则会丢失一段数据。因此在完美主义者的推动下作者添加了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-2.8.17/src/redis-server /usr/redis-2.8.17/redis.conf

查看redis进程

#ps aux |grep redis


启动多个redis实例

拷贝默认的redis.conf改为redis6383.conf。打开redis6383.conf配置文件。找到port 6379这行。把6379改为6383

# /usr/redis-2.8.17/src/redis-server

# /usr/redis-2.8.17/src/redis-server /usr/redis-2.8.17/redis6383.conf


调用服务

/usr/redis-2.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默认6379port不爽的,能够更改port 6379

假设想把数据文件放到一个指定文件夹,更改dir /opt/data/

默认是dir ./ 也就是默认放到安装文件夹下。

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

dir 是数据文件路径。默认在安装文件夹下。

*以下的配置二选一,详见本文凝视部分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 

#如以后台进程执行。则需指定一个pid,默觉得/var/run/redis.pid 

pidfile redis.pid 

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

#bind 127.0.0.1 

#Redis默认监听port 

port 6379 

#client闲置多少秒后,断开连接。默觉得300(秒) 

timeout 300 

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

loglevel verbose 

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

logfile stdout 

#可用数据库数,默认值为16,默认数据库为0 

databases 16 

#保存数据到disk的策略 

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

save 900 1 

#当有10条Keys数据被改变时。300秒刷新到disk一次 

save 300 10 

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

save 60 10000 

#当dump .rdb数据库的时候是否压缩数据对象 

rdbcompression yes 

#本地数据库文件名称,默认值为dump.rdb 

dbfilename dump.rdb 

#本地数据库存放路径。默认值为 ./ 

dir /var/lib/redis/ 

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

#Redis的复制配置 

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

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

#连接password 

# requirepass foobared 

#最大client连接数。默认不限制 

# maxclients 128 

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

 

# maxmemory <bytes> 

#是否在每次更新操作后进行日志记录,假设不开启。可能会在断电时导致一段时间内的数据丢失。由于redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内仅仅存在于内存中。默认值为no 

appendonly no 

#更新日志文件名称。默认值为appendonly.aof 

#appendfilename 

#更新日志条件,共同拥有3个可选值。

no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘。everysec表示每秒同步一次(默认值)。

 

# 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的使用提出了一些建议: 

  • 当你的key非常小而value非常大时,使用VM的效果会比較好.由于这样节约的内存比較大. 
  • 当你的key不小时,能够考虑使用一些非常方法将非常大的key变成非常大的value,比方你能够考虑将key,value组合成一个新的value. 
  • 最好使用linux ext3 等对稀疏文件支持比較好的文件系统保存你的swap文件. 
  • vm-max-threads这个參数,能够设置訪问swap文件的线程数,设置最好不要超过机器的核数.假设设置为0,那么全部对swap文件的操作都是串行的.可能会造成比較长时间的延迟,可是对数据完整性有非常好的保证.

 

2. 调整系统内核參数

假设内存情况比較紧张的话。须要设定内核參数: 

echo 1 > /proc/sys/vm/overcommit_memory 

这里说一下这个配置的含义:/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略。其值能够是0、1、2。


0,表示内核将检查是否有足够的可用内存供应用进程使用。假设有足够的可用内存,内存申请同意;否则,内存申请失败,并把错误返回给应用进程。


1。表示内核同意分配全部的物理内存,而无论当前的内存状态怎样。
2。表示内核同意分配超过全部物理内存和交换空间总和的内存
Redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比方parent占用的内存为 8G。这个时候也要相同分配8G的内存给child, 假设内存无法负担,往往会造成redis服务器的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-2.6.14/src/redis-cli

redis> set foo bar

OK

redis> get foo"bar"

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


 

5.基准測试

第一先用启动命令启动redis

然后在随意文件夹使用命令:

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

模拟100个并发连接,100000个请求,检測host为localhost port为6379的redis服务器性能


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

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

很多其它參考

配置參考:CentOS下Redis 2.2.14安装配置具体解释

安装參考:Redis (一) 安装

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

benchmark參数: Redis安装部署


另外须要在PHP中使用redis须要安装PHP扩展能够參考:

Redis以及Redis的php扩展安装无错版

phpredis用法

redis经常使用命令參考



posted on 2017-05-02 09:45  ljbguanli  阅读(299)  评论(0编辑  收藏  举报