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。
# 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的默认端口号是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默认6379端口不爽的,可以更改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 6379
#客户端闲置多少秒后,断开连接,默认为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及端口
# masterauth <master-password> 当本机为从服务时,设置主服务的连接密码
#连接密码
# requirepass foobared
#最大客户端连接数,默认不限制
# 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,不然就会一直等待
第一先用启动命令启动redis
然后在任意目录使用命令:
# redis-benchmark-h localhost -p 6379 -c 100 -n 100000
模拟100个并发连接,100000个请求,检测host为localhost 端口为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常用命令参考
相关文章:

lumen mysql 事务_简单几部搞定laravel/lumen跨库操作
1.跨库数据库配置在网站跟目录下的config文件中增加database.php作为数据库配置文件。配置如下://当前默认数据库mysql > [driver > mysql,host > env(DB_HOST, localhost),port > env(DB_PORT, 3306),database > env(DB_DATABASE, forge),username …
springMVC出现HTTP Status 405 - Request method 'GET' not supported错误的解决方法
今天在写一个简单的springMVC的表单请求处理时,出现了这个问题。我的form表单用的是post方法提交,并没有使用get方法,出现这个问题时,笔者可谓是一脸懵逼。这是form表单:这是对post请求的处理方法:检查了半…
从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
说起大小写字母转换,大家很容易想起系统函数是不是,几乎所有的编程语言都提供了这种转换函数,但是你有没有想过这背后是怎么实现的? 让你写怎么实现?我们都知道Nginx是目前用的最多的Http服务器,那么他的代…

常回“家”看看
近一年来很少写博客了,原因很多,一言难尽!感觉人在每个阶段思想都在不断发生变化,往往某一时期认定的事情会在另外一个阶段发生自我否定或者是改变!之前认为自己也许不再走技术路线了,所以把精力都放在了其…

python launcher怎么使用_QMUI实战(一)—为何我们要使用 LauncherActivity?
QMUI 2 发布了,但是里面换肤等相关的很多东西,如果不讲,那么很多人估计就只能复制粘贴下 QMUIDemo 的代码,而并不能用好 QMUI, 或者是通过 QMUI 来提升自己的 UI 开发能力,毕竟现在很多 Android 开发都是轻…

CoAP 协议解析说明(转)
CoAP 协议全面分析 HTTP与COAP 请求与响应示例 HTTP请求(文本格式) POST https://getman.cn/echo HTTP/1.1 User-Agent: Fiddler Host: getman.cn Content-Length: 9{temp:22}HTTP响应(文本格式) HTTP/1.1 200 OK Server: NWSs Da…

孔雀翎----《Programming C# 》中文版 第4版
孔雀翎----《Programming C# 》中文版 第4版 主页:http://blog.csdn.net/21aspnet/ 时间:2007.8.7 电子工业出版社给我邮寄了此书,所以本人可以先在出版之前一睹为快。 本人曾看过300多本.NET方面的书,感慨颇深。其实一…

iOS开发小技巧--textField成为密码框,view加载完后textField获取焦点
文本框安全输入:Secure Text Entry(安全文本输入)view加载完后textField获取焦点的正确做法

python出现typeerror原因是_Python 文件添加列表数据后TypeError原因
# -*- coding: utf-8 -*-#打开文件,将文件读入字符串colfopen(pride.txt)textf.read()colstext.split()f2open(data.txt,w)for col in cols:f2.write(col)f2.write(\n)以上代码运行无误。# -*- coding: utf-8 -*-#打开文件,将文件读入字符串colfopen(pri…

LVM逻辑卷创建管理
LVM(逻辑分区)的创建顺序:物理分区-物理卷-卷组-逻辑卷-挂载。物理卷(Physical Volume,PV):就是指硬盘分区,也可以是整个硬盘或已创建的软RAID&am…
Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】
linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 Sqlserver版本:2008 FreeTDS版本:0.95 关于Linux环境安装NginxPHP参考Linux环境Nginx安装与调试以及PHP安装 即可。一般来说,PHPmysql是…

python矩阵运算库效率_python - 布尔矩阵运算的最快方法_performance_酷徒编程知识库...
只需在compute中进行一些小的更改:def compute(m, n):m np.asarray(m)n np.asarray(n)# Apply mask N in advancem2 m & n# Pack booleans into uint8 for more efficient bitwise operations# Also transpose for better caching (maybe?)mb np.packbits(…

hibernate-session中的方法
1.操作实体对象的方法 save() 保存 update() 更新 saveOrUpdate() 保存或更新 delete() 删除 2.操作缓存的方法 clear() 清除所有缓存 evit() 将指定对象清除出缓存 flush() 刷新到数据库中()马上执行sql语句,不会清除session缓存&#x…

[JZOJ4786]小a的强迫症
[JZOJ4786]小a的强迫症 题目大意: 有\(n(n\le10^5)\)种颜色的珠子,第\(i\)种颜色有\(num[i]\)个。你要把这些珠子排成一排,使得第\(i\)种颜色的最后一个珠子一定在第\(i1\)种珠子的最后一个珠子之前,求方案数。 思路: …

Servlet,过滤器,监听器,拦截器的区别
由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又…
Linux环境Nginx安装多版本PHP
关于Linux环境Nginx安装与调试以及PHP安装参考此文即可:http://blog.csdn.net/unix21/article/details/8544922linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 & php5.4.44 所谓多版本多版本PHP就是php5.4…

java 扫描tcp端口号_多线程TCP端口扫描 java实现
界面部分:import java.awt.Color;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax…

【go同步编程】
锁 互斥锁 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。 var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } func repeatedlyLock() {var mutex sync.Mutexfmt.Println("Lock the lock. …
Linux环境PHP7.0安装
PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM。HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为…

myeclipse java可视化_使用MyEclipse可视化开发Hibernate实例
使用MyEclipse可视化开发Hibernate实例2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中。这个实例主要演示如何使用MyEclipse的可视化开发工具开发Hibernate应用,利用MyEclipse可以提高我们开发Java EE应用的效率。操作的数据库表还是…

day20 文件上传下载
2019独角兽企业重金招聘Python工程师标准>>> 文件上传基础及api解析: 文件上传最终版: 文件下载: 转载于:https://my.oschina.net/u/2356966/blog/648774

腾讯开源基于 mmap 的高性能 key-value 组件 MMKV
腾讯微信团队宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性。MMKV 从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的…
Linux环境thinkphp配置以及数据源驱动修改
项目中需要用到thinkphp,以下简称tp。linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 thinkphp版:3.2.31.安装LNMP Linux环境Nginx安装与调试以及PHP安装2.项目框架 tp源码下载http://www.thinkphp…

《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在。 3.1进程 概念: 进程:处于执行期的程序。但不仅局限于程序,还包含其他资…

java持续集成soapui_集成testNG到JavaAPI测试-执行多条用例
*****************************************************************在这门课里你将学到Web Services(SOAP WebService和REST API)的手动测试及自动化测试,熟练使用Groovy脚本自动化测试WebService。这门课程设计的是从零基础入门开始学,然后以循序渐进…

python-os
os.listdir(path):path-->路径 返回类型为listos.getcwd() 获取当前工作目录os.chdir() 切换工作目录os.mkdir() 新建目录os.path.exists()os.path.isdir() os.path.join() 拼接字符串路径os.path.exists(rpath) 判断路径是否存在 r原始路径os.path.isdir() 判断是否是文件夹…
NetBeans配置Xdebug 远程调试PHP
很多PHP程序员使用echo,dump等比较原始的方法调试,这是非常落后的。几年前本人写过一篇: NetBeans配置Xdebug 由于那篇文档还需要引用本人写的其他文档,感觉有些分散,所以这里重新写一篇完整的。linux版本:…

java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的?Spring容器是IOC容器的一种,它通过ApplicationContext接口将我们所需要的配置文件进行…

ThreadLocal源码分析
ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见。ThreadLocal正式提供了这样的机制,详细使用方式请参考Java ThreadLocal。 ThreadLocal实现原理 自…

远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案
本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错“出现身份验证错误,要求的函数不受支持。远程计算机:xxx 这可能是由于CredSSP加密Oracle修正,若要了解详细信息...” 原因是系统更新安装了补丁&am…