zoukankan      html  css  js  c++  java
  • NoSQL之Redis探析

    下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz

    安装steps:
    1 下载
    Official Website : http://redis.io/
    文档地址 address: http://redis.io/documentation
    主从复制文档地址 : http://www.redis.io/topics/replication

    2 解压缩安装
    tar -xvf redis-2.8.8.tar.gz
    cd redis-2.8.8
    make
    PS: make install  也能够make install,这样就是把可执行文件拷贝到/usr/local/bin里而已。
    ..........
    Hint: To run 'make test' is a good idea ;)


        INSTALL install
        INSTALL install
        INSTALL install
        INSTALL install
        INSTALL install
    make[1]: Leaving directory `/root/redis-2.8.8/src'

    3 make test验证
    run the command to check the redis status: 
    [root@localhost redis-2.8.8]# make test
    cd src && make test
    make[1]: Entering directory `/root/redis-2.8.8/src'
    You need tcl 8.5 or newer in order to run the Redis test
    make[1]: *** [test] 错误 1
    make[1]: Leaving directory `/root/redis-2.8.8/src'
    make: *** [test] 错误 2

    [root@localhost redis-2.8.8]# cd src
    [root@localhost src]# make test
    You need tcl 8.5 or newer in order to run the Redis test
    make: *** [test] 错误 1

    提示须要安装tcl 8.5
    然后到Tcl的官方站点http://www.tcl.tk/下载8.5版本号
    找到 http://www.activestate.com/activetcl/downloads 下载下来。
    假设手动下载失败,那么能够考虑yum安装,比方yum install tcl -y;

    official website download failure, go to http://download.csdn.net/detail/zouyongjin/4490216 to download the tar gz.
    假设官方站点下载失败。就去csdn上面搜索tcl8.5.12-src.tar.gz 下载。

    #tar xvzf tcl8.5.12-src.tar.gz
    #cd tcl8.5.13/unix/
    #./configure 
    #make 
    #make test 
    #make install

    4 redis參数研究以及启动关闭
    redis 配置文件 /opt/redis-2.8.8/redis.conf,全部的參数都在这个配置文件中面配置,redis启动的时候,会载入这个配置文件。



    4.1 加入master主库数据保存文件夹:
     mkdir -p /data/redis/master
     
    4.2  save參数解读:  
    save 900 1
    save 300 10
    save 60 10000
     在900秒(15分钟)内,至少有1次数据变更。
    或者300秒内,有至少10次数据变更;
    或者60秒内。有至少1000次数据变更;时间+数据变更次数,共同影响内存快照的出现。

    4.3 appendonly no

    4.4 port 6389
    redis启动的port号码。对外服务,外部程序通过此port号码与redis建立连接,对redis进行数据变更和数据訪问。



    4.5 redis启动
    执行redis:
    2.2.7版本号,redis-server被放到了src文件夹下。要这么执行:
    在安装文件夹下# cd src
    #./redis-server ./../redis.conf
    或者全路径启动: /root/redis-2.8.8/src/redis-server  /opt/redis-2.8.8/redis.conf
    或者nohup后台启动: nohup /root/redis-2.8.8/src/redis-server  /root/redis-2.8.8/redis.conf &
    附注:
    2.0.4曾经的老版本号,执行非常easy,在安装文件夹下:
    #./redis-server
    就能够了。假设没有更改daemonize no配置。会看见执行的信息。

    4.6 測试启动 
    redis-cli ping 返回PONG。启动成功。 
    查看port是否被占用:netstat –ntlp |grep 6379

    4.7 redis服务关闭
    /usr/local/bin/redis-cli shutdown
    或者/usr/local/bin/redis-cli -h 192.168.1.17 shutdown


    5 主从机制以及原理理解
    redis主从使用以及配置起来非常easy,搭建一套master-slave服务意味着slave redis服务是主库的一份精确的数据备份: 
    redis主从基本特征例如以下描写叙述: 
    5.1 redis採用异步复制,从redis2.8版本号開始。slaves開始定期从复制流上确认数据处理的数量。


    5.2 一个master能够相应多个slaves。
    5.3 slave还能够接受其它slave发过来的请求,除了多个slave能连接一个master之外,slaves还能够被其它slaves以graph-like结构方式进行连接。


    5.4  redis复制在master上面是不堵塞的。这意味着当一个或者多个slave复制開始初始化以及执行后,master还能够继续处理请求。
    5.5 复制在从库上也是无堵塞的,当slave进行首次初始化同步时。slave能够使用旧的数据集合来处理请求。假设你在redis.conf里面配置了的话。   ?哪里配置?另外,假设复制流down了,你也能够配置一些redis slave返回一个error给客户端。然而,在同步初始化完毕后,旧的数据被删除,新的数据会被载入进去。在这短暂的载入瞬间。slave会堵塞住进来的连接请求。
    5.6 slave能够用来扩展。有多个slaves处理查询请求(比如,大的SORT操作能够在slave上执行),或者也简单的用来数据备份。


    5.7 能够用replication来避免在master库上数据写入磁盘,减轻master压力。仅仅在master的redis.conf里面把全部save參数凝视掉就可以。然后能够在从库上slave上面开启save參数来做到数据实时写入到磁盘上面。



    5.8 slave工作原理
    (1) 假设建立了一个slave从库,slave会发一个SYNC的命令的connection到master库,无论这是否是第一次连接。
    (2) master然后開始启动一个saving的背景线程,并缓存已经接收到的改动数据集的新的命令。当saving背景线程结束后。master会把数据文件传送给slave,而且save到磁盘。最后载入到内存。

    master将会发送全部的缓存命令给slave。


    这些是以基于Redis协议的一系列连续的命令流来完毕的。
    (3) 当master-slave由于一些原因down之后。slave会自己主动连接master。


    (4) 当连接断开之后。master和slave会又一次连接,一次全同步会执行。然而,从redis2.8開始,一个局部的再同步也是可行的。

    5.9 局部再同步
    主要是在master这一边的复制流上面做了一个in-memory backlog。master和slave都会基于一个共同的replication offset和a master run id,因此当连接断开之后,slave将会又一次连接而且咨询master去继续复制,
    假如master run id是同一个。而且offset在复制backlog里面是可用的。复制将会从这个留下的偏移来恢复。

    假设这些条件不满足。那么一个全新的再同步会被执行。



    当旧的实现机制用了SYNC之后。新的局部再同步用了一个内部命令PSYNC。


    【Note】当Redis2.8察觉出来服务假设不支持PSYNC,就会使用SYNC命令。

    6 搭建从库,从库配置文件
    cp /root/redis-2.8.8/redis.conf /root/redis-2.8.8/redis.slave.conf
    slave config: 
    port 6399 # 从库port号
    slaveof 127.0.0.1 6389 #主库ip地址以及port号

    #save參数,从库开启save。减轻主库的读写压力。
    save 900 1
    save 300 10
    save 60 10000

    7 启动start the master and slave 
    #改动一下redis-conf里面的
    daemonize no,把no改为yes,能够后台启动。
    /root/redis-2.8.8/src/redis-server  /root/redis-2.8.8/redis.conf
    /root/redis-2.8.8/src/redis-server  /root/redis-2.8.8/redis.slave.conf
    在后台启动
    nohup /root/redis-2.8.8/src/redis-server  /root/redis-2.8.8/redis.conf &
    nohup /root/redis-2.8.8/src/redis-server  /root/redis-2.8.8/redis.slave.conf > /root/redis_slave.log &

    8 check master & slave
    訪问主库 
    /root/redis-2.8.8/src/redis-cli  -p 6389
    登录从库
    /root/redis-2.8.8/src/redis-cli  -p 6399

    验证主从数据一致性:
    [root@localhost redis]# /root/redis-2.8.8/src/redis-cli  -p6389
    Unrecognized option or bad number of args for: '-p6389'
    [root@localhost redis]# /root/redis-2.8.8/src/redis-cli  -p 6389
    127.0.0.1:6389> 
    127.0.0.1:6389> 
    127.0.0.1:6389> set name jame  #往主库中设置2组key-value值
    OK
    127.0.0.1:6389> set age 20
    OK
    127.0.0.1:6389> exit
    [root@localhost redis]# /root/redis-2.8.8/src/redis-cli  -p 6399
    127.0.0.1:6399> get name #获取主库设置的key-value值,看是否已经从主库传递到从库了。


    "jame"
    127.0.0.1:6399> get age
    "20"
    127.0.0.1:6399> 

    9 验证过程 
    怎样推断哪个是主哪个是从呢? 仅仅需调用 info 这个命令就能够得到主从的信息了,我们在从库上执行 info 命令,例如以下所看到的: 
    127.0.0.1:6399> info
    # Server
    redis_version:2.8.8
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:a90848107b5eaf7f
    redis_mode:standalone
    os:Linux 2.6.32-358.el6.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    gcc_version:4.4.7
    process_id:19513
    run_id:c97e05680da496d58894963fb38045b9fba1b13d
    tcp_port:6399
    uptime_in_seconds:2672
    uptime_in_days:0
    hz:10
    lru_clock:4722614
    config_file:/root/redis-2.8.8/redis.slave.conf

    # Clients
    connected_clients:2
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0

    # Memory
    used_memory:829360
    used_memory_human:809.92K
    used_memory_rss:7933952
    used_memory_peak:829360
    used_memory_peak_human:809.92K
    used_memory_lua:33792
    mem_fragmentation_ratio:9.57
    mem_allocator:jemalloc-3.2.0

    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1397230798
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:0
    rdb_current_bgsave_time_sec:-1
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok

    # Stats
    total_connections_received:1
    total_commands_processed:271
    instantaneous_ops_per_sec:0
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    evicted_keys:0
    keyspace_hits:2
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:3483

    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6389
    master_link_status:up
    master_last_io_seconds_ago:9
    master_sync_in_progress:0
    slave_repl_offset:3867
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0

    # CPU
    used_cpu_sys:0.66
    used_cpu_user:0.15
    used_cpu_sys_children:0.01
    used_cpu_user_children:0.00

    # Keyspace
    db0:keys=2,expires=0,avg_ttl=0

    9 附带redis短连接
    redis r = redis.connect(xx)
    r.set()
    r.get()
    r.close()

    redis长连接,那就是假设不用的话,线程就是sleep,假设用的话。那么就是query等的状态。


    10 redis的一些參数优化
    vm-enabled设置为no
    maxmemory :告诉Redis当使用了多少物理内存后就開始拒绝兴许的写入请求,该參数能非常好的保护好你的Redis不会由于使用了过多的物理内存而导致swap,终于严重影响性能甚至崩溃。

    有个说法是一般不超过物理内存的3/5
    Redis Hash 存储: 
    hash-max-zipmap-entries 64 
    hash-max-zipmap-value 512 
    hash-max-zipmap-entries
    相同相似的參数有

    list-max-ziplist-entries 512 
    说明:list数据类型多少节点下面会採用去指针的紧凑存储格式。

    list-max-ziplist-value 64 
    说明:list数据类型节点值大小小于多少字节会採用紧凑存储格式。



    set-max-intset-entries 512 
    说明:set数据类型内部数据假设全部是数值型,且包括多少节点下面会採用紧凑格式存储。

    另外redis 的6种过期策略
    redis 中的默认的过期策略是volatile-lru 。设置方式   
    config set maxmemory-policy volatile-lru

    maxmemory-policy 六种方式
    volatile-lru:仅仅对设置了过期时间的key进行LRU(默认值) 
    allkeys-lru : 是从全部key里 删除 不常常使用的key 
    volatile-random:随机删除即将过期key   
    allkeys-random:随机删除   
    volatile-ttl : 删除即将过期的   
    noeviction : 永只是期。返回错误  

    maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不常常使用的(默认选项) 

    save 參数解读:  
    save 900 1
    save 300 10
    save 60 10000
     在900秒(15分钟)内。至少有1次数据变更;
    或者300秒内。有至少10次数据变更。
    或者60秒内,有至少1000次数据变更;时间+数据变更次数。共同影响内存快照的出现。
    PS:在主库上凝视掉save功能,在从库开启save功能,会降低主库的读写压力。

  • 相关阅读:
    Git 最新版本2.20.1 安装及配置
    Python中:ModuleNotFoundError: No module named 'alipay'
    Python调用time模块设置当前时间-指定时间
    python 正则表达式
    pwntools出现的一些问题
    strace监视系统调用
    深入理解Linux内核 学习笔记(8)
    ubuntu 查看版本
    LSTM实现中文文本情感分析
    深入理解Linux内核 学习笔记(5)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7243011.html
Copyright © 2011-2022 走看看