zoukankan      html  css  js  c++  java
  • 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包后进入msvsin elease文件夹有三个文件分别对应32,64位,windows服务三个版本,在这里我们选择64位为例,解压redisbin64.zip 到D: edis2.4 , 这里主要用到redis-server.exe和redis-cli.exe, redis-server用于运行Redis服务器,redis-cli是命令行客户端,通过它连接Redis服务器,并使用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: edis2.4,打开CMD命令提示符,输入以下命令启动redis服务

    启动:

    redis-server redis.conf

    这样redis服务就启动成功了

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

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

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

    redis-cli.exe -h 127.0.0.1 -p 6379

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

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

    复制代码
    info   #查看服务器信息
    select <dbsize> #选择数据库索引  select 1
    flushall #清空全部数据
    flushdb  #清空当前索引的数据库
    slaveof <服务器> <端口>  #设置为从服务器
    slaveof no one #设置为主服务器
    shutdown  #关闭服务
    复制代码

    更多命令参考: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
    View Code

    主从复制

      在从服务器配置文件中配置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: - 80 12 
    # 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=0 
    prog="redis-server" 
    desc="Redis Server" 
    start() { 
            if [ -e $PIDFILE ];then 
                 echo "$desc already running...." 
                 exit 1 
            fi 
            echo -n $"Starting $desc: " 
            daemon $BIN/$prog $CONFIG 
            RETVAL=$? 
            echo 
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog 
            return $RETVAL 
    } 
    stop() { 
            echo -n $"Stop $desc: " 
            killproc $prog 
            RETVAL=$? 
            echo 
            [ $RETVAL -eq 0 ] && 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=1 
    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"

      

  • 相关阅读:
    预热buffer pool
    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
    事务并发控制
    LOAD DATA INFILE – performance case study
    隐式锁
    percona-xtrabackup安装
    mysql 表空间及索引的查看方法
    mysql用户权限
    mysql修改数据库名
    MySQL对innodb某一个表进行移动
  • 原文地址:https://www.cnblogs.com/youxin/p/3585170.html
Copyright © 2011-2022 走看看