windows下和linux下 Redis 安装

Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windows版项目是由微软开放技术团队建立和维护一个实验性项目(支持32,64位),所以并不适用生产环境,但可在Windows环境下用于开发测试。

有2个windows版本可以下载,https://github.com/dmajkic/redis/ 或https://github.com/MSOpenTech/redis。

我下的是前者。

安装:

,下载源码包,解压ZIP包后进入msvs\bin\release文件夹有三个文件分别对应32,64位,windows服务三个版本,在这里我们选择64位为例,解压redisbin64.zip 到D:\redis2.4 , 这里主要用到redis-server.exe和redis-cli.exe, redis-server用于运行Redis服务器,redis-cli是命令行客户端,通过它连接Redis服务器,并使用Redis命令进行各种操作.

解压后大概有这些文件:

windows下和linux下 Redis 安装

redis-server.exe:服务程序 
redis-check-dump.exe:本地数据库检查 
redis-check-aof.exe:更新日志检查 
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 或jmeter工具). 
将这些文件拷贝到安装你要安装redis的目录。

2.服务启动配置

复制源码包根目录下redis.conf到D:\redis2.4,打开CMD命令提示符,输入以下命令启动redis服务

启动:

redis-server redis.conf

这样redis服务就启动成功了

windows下和linux下 Redis 安装

启动cmd窗口要一直开着,关闭后则Redis服务关闭。 
这时服务开启着,另外开一个窗口进行,设置客户端:

使用CMD命令提示符,打开redis-cli连接redis服务器 ,也可以使用telnet客户端

# redis-cli -h 服务器 –p 端口 –a 密码

redis-cli.exe -h 127.0.0.1 -p 6379

连接成功后,就可对redis数据增删改查了,如字符串操作

windows下和linux下 Redis 安装

以下是一些服务器管理常用命令:

windows下和linux下 Redis 安装
info   #查看服务器信息
select <dbsize> #选择数据库索引  select 1
flushall #清空全部数据
flushdb  #清空当前索引的数据库
slaveof <服务器> <端口>  #设置为从服务器
slaveof no one #设置为主服务器
shutdown  #关闭服务
windows下和linux下 Redis 安装

更多命令参考:http://redis.readthedocs.org/en/latest/

配置:

更改redis的配置需要修改redis.conf文件,以下是它一些主要的配置注释

#是否作为守护进程运行
daemonize no
#Redis 默认监听端口
port 6379
#客户端闲置多少秒后,断开连接
timeout 300
#日志显示级别
loglevel verbose
#指定日志输出的文件名,也可指定到标准输出端口
logfile redis.log
#设置数据库的数量,默认最大是16,默认连接的数据库是0,可以通过select N 来连接不同的数据库
databases 32
#Dump持久化策略
#当有一条Keys 数据被改变是,900 秒刷新到disk 一次
#save 900 1
#当有10 条Keys 数据被改变时,300 秒刷新到disk 一次
save 300 100
#当有1w 条keys 数据被改变时,60 秒刷新到disk 一次
save 6000 10000
#当dump .rdb 数据库的时候是否压缩数据对象
rdbcompression yes
#dump 持久化数据保存的文件名
dbfilename dump.rdb
########### Replication #####################
#Redis的主从配置,配置slaveof则实例作为从服务器
#slaveof 192.168.0.105 6379
#主服务器连接密码 # masterauth <master-password>
############## 安全性 ###########
#设置连接密码 #requirepass <password>
############### LIMITS ##############
#最大客户端连接数
# maxclients 128
#最大内存使用率
# maxmemory <bytes>
########## APPEND ONLY MODE #########
#是否开启日志功能
appendonly no
# AOF持久化策略 #appendfsync always
#appendfsync everysec
#appendfsync no
################ VIRTUAL MEMORY ###########
#是否开启VM 功能
#vm-enabled no
# vm-enabled yes
#vm-swap-file logs/redis.swap
#vm-max-memory 0
#vm-page-size 32
#vm-pages 134217728
#vm-max-threads 4

主从复制

在从服务器配置文件中配置slaveof ,填写服务器IP及端口即可,如果主服务器设置了连接密码,在masterauth后指定密码就行了

持久化

redis提供了两种持久化文案,Dump持久化和AOF日志文件持久化

Dump持久化是把内存中的数据完整写入到数据文件,由配置策略触发写入,如果在数据更改后又未达到触发条件而发生故障会造成部分数据丢失.

AOF持久化是日志存储的,是增量的形式,记录每一个数据操作动作,数据恢复时就根据这些日志来生成.

如何添加值到list:

redis 127.0.0.1:6379> lpush mylist val1
(integer) 1
redis 127.0.0.1:6379> lpush mylist val2
(integer) 2
redis 127.0.0.1:6379> lpush mylist val3
(integer) 3
redis 127.0.0.1:6379> lpush mylist val4
(integer) 4
redis 127.0.0.1:6379> lrange mylist 0 -1  
1> val1  
2> val2  
3> val3 
4> val4
redis 127.0.0.1:6379> rpop mylist  
"val1"
 
redis 127.0.0.1:6379> lpush ls1 3
(integer) 1
redis 127.0.0.1:6379> lpush ls1 1
(integer) 2
redis 127.0.0.1:6379> lpush ls1 val1
(integer) 3
redis 127.0.0.1:6379> lpush ls1 0 -1
(integer) 5
redis 127.0.0.1:6379> lrange ls1 0 -1
1) "-1"
2) "0"
3) "val1"
4) "1"
5) "3"

redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的 ab 工具).

  1. ./redis-benchmark -n 100000 –c 50
  2. ====== SET ======
  3. 100007 requests completed in 0.88 seconds (译者注:100004 查询完成于 1.14 秒 )
  4. 50 parallel clients (译者注:50个并发客户端)
  5. 3 bytes payload (译者注:3字节有效载荷)
  6. keep alive: 1 (译者注:保持1个连接)
  7. 58.50% <= 0 milliseconds(译者注:毫秒)
  8. 99.17% <= 1 milliseconds
  9. 99.58% <= 2 milliseconds
  10. 99.85% <= 3 milliseconds
  11. 99.90% <= 6 milliseconds
  12. 100.00% <= 9 milliseconds
  13. 114293.71 requests per second(译者注:每秒 114293.71 次查询)

Windows下测试并发客户端极限为60

参考:http://www.cnblogs.com/mejozn/archive/2013/05/05/3061949.html

linux redis安装:

http://redis.io/download

$ tar xzf redis-2.8.19.tar.gz
$ cd redis-2.8.19
$ make

检查安装是否正确

make test报错:

You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1 我们知道Redis并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西。所以系统内存分配器的性能及碎片率会对Redis造成一些性能上的影响。
新版本已经有jemalloc的源码包在deps目录下。 编译使用 jemalloc

在README 有这个一段话。

Allocator 
---------

Selecting a non-default memory allocator when building Redis is done by setting 
the `MALLOC` environment variable. Redis is compiled and linked against libc 
malloc by default, with the exception of jemalloc being the default on Linux 
systems. This default was picked because jemalloc has proven to have fewer 
fragmentation problems than libc malloc.

To force compiling against libc malloc, use:

% make MALLOC=libc

To compile against jemalloc on Mac OS X systems, use:

% make MALLOC=jemalloc

说关于分配器allocator, 如果有MALLOC 这个 环境变量, 会有用这个环境变量的 去建立Redis。

而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。

但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数。

解决办法

make MALLOC=libc

编译后完成测试: make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install

设定make install安装在某个目录

PREFIX?=/usr/local
INSTALL_BIN=$(PREFIX)/bin

可以这样.

sudo make  install   PREFIX=/opt/redis/2.6.16

就不用下面的手动复制了.

(我把二进制文件复制到/opt/redis目录了:

root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-benchmark /opt/redis
root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-check-aof /opt/redis
root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-check-dump /opt/redis
root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-cli /opt/redis
root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-sentinel /opt/redis
root@iZ23onhpqvwZ:~/download/redis-2.8.19/src# cp redis-server /opt/redis

cp redis.conf  /opt/redis/


The binaries that are now compiled are available in the src directory. Run Redis with:

$ src/redis-server

You can interact with Redis using the built-in client:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

编辑/etc/redis.conf ,修改
daemaon no 为daemaon yes ,以守护进程方式启动进程。

# redis-server /etc/redis.conf

关闭redis 
# redis-cli shutdown //关闭所有
关闭某个端口上的redis
# redis-cli -p 6397 shutdown //关闭6397端口的redis
说明:关闭以后缓存数据会自动dump到硬盘上,硬盘地址见redis.conf中的dbfilename dump.rdb

redis配置

注意,默认复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout.

下面是redis.conf的主要配置参数的意义:

daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
这时你可以打开一个终端进行测试了,配置文件中默认的监听端口是6379

redis开机自动启动

用这个脚本管理之前,需要先配置下面的内核参数,否则Redis脚本在重启或停止redis时,将会报错,并且不能自动在停止服务前同步数据到磁盘上:

# vi /etc/sysctl.conf

vm.overcommit_memory = 1

(

overcommit_memory                                                                                                                                                                                                                                                                                                       
 内核参数说明如下:                                                                                                                                                                                                      
overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。                               
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
 

有关linux下redis overcommit_memory的问题

有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。

公司的几台Redis服务器出现不明故障,查看Redis日志,发现如下提示:
[34145] 01 Jan 17:42:02 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' f.

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(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

这里又涉及到Overcommit和OOM。

什么是Overcommit和OOM
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。

Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。

Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):
0. 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
1. 任何overcommit都会被接受。
2. 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。
overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。

# echo 2 > /proc/sys/vm/overcommit_memory
# echo 80 > /proc/sys/vm/overcommit_ratio

当oom-killer发生时,linux会选择杀死哪些进程
选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

 
)

然后应用生效:

# sysctl –p

建立redis启动脚本:

# vim /etc/init.d/redis

centos上的脚本

#!/bin/bash
#
# Init file for redis
#
# chkconfig: -
# description: redis daemon
#
# processname: redis
# config: /etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
#BIN="/usr/local/bin"
BIN="/usr/local/bin"
CONFIG="/etc/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=
prog="redis-server"
desc="Redis Server"
start() {
if [ -e $PIDFILE ];then
echo "$desc already running...."
exit
fi
echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG
RETVAL=$?
echo
[ $RETVAL -eq ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq ] && rm -f /var/lock/subsys/$prog $PIDFILE
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=
esac
exit $RETVAL

这个脚本在ubuntu运行有问题,需要自己修改下

我在windows下编辑这个文件然后在linux执行竟然说文件找不到,明明文件存在的,执行却说找不到,搞了好久终于找到原因了:参考下面的文章:

解决方法

  分析原因,可能因为我平台迁移碰到权限问题我们来进行权限转换

  1)在Windows下转换:

  利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换,再放到Linux中执行。转换方式如下(UltraEdit):File-->Conversions-->DOS->UNIX即可。

  2)方法

  用vim打开该sh文件,输入:

  [plain]

  :set ff

  回车,显示fileformat=dos,重新设置下文件格式:

  [plain]

  :set ff=unix

  保存退出:

  [plain]

  :wq

  再执行,竟然可以了

  3)在linux中的权限转换

  也可在Linux中转换:

  首先要确保文件有可执行权限

  #chmod u+x filename

  然后修改文件格式

  #vi filename

  三种方法都可以方便快速的解决关于Linux执行.sh文件,提示No such file or directory这个问题了。

或者参考脚本:http://blog.chinaunix.net/uid-22312037-id-3484071.html

参考:http://www.nginx.cn/tag/redis

发现一个更好的启动脚本:

Ubuntu 下安装 Redis 并使用 init 脚本启动

1、下载安装

cd /tmp
tar -zxf redis-2.2.13.tar.gz
cd redis-2.2.13
make
sudo make install

这时Redis 的可执行文件被放到了/usr/local/bin

2、下载配置文件和init启动脚本:

sudo mv redis-server /etc/init.d/redis-server
sudo chmod +x /etc/init.d/redis-server
sudo mv redis.conf /etc/redis.conf

3、初始化用户和日志路径

第一次启动Redis前,建议为Redis单独建立一个用户,并新建data和日志文件夹

sudo useradd redis
sudo mkdir -p /var/lib/redis
sudo mkdir -p /var/log/redis
sudo chown redis.redis /var/lib/redis
sudo chown redis.redis /var/log/redis

4、设置开机自动启动,关机自动关闭

sudo update-rc.d redis-server defaults

5、启动Redis:

sudo /etc/init.d/redis-server start

6、启动client客户端连接:

$ redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

  

上一篇:500多条Linux信息


下一篇:Redis(二)linux下redis安装