redis

头像
达龙
    阅读 8 分钟

    博文参考

    http://blog.sina.com.cn/s/blog_a1e9c7910102vl64.html
    http://blog.csdn.net/freebird_lb/article/details/7733970
    http://www.cnblogs.com/stephen-liu74/category/354125.html
    http://blog.csdn.net/lifetragedy/article/details/50628820

    redis概述

    redis

    全称:REmote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

    Redis 与其他 key - value 缓存产品有以下三个特点

    1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
    2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
    3)Redis支持数据的备份,即master-slave模式的数据备份

    下载

    Http://redis.io/
    Http://www.redis.cn/

    相比memcached,Rdeis有以下优点:

    1. redis原生支持的数据类型更多。
    2. redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。
    3. redis支持master-slave模式的数据备份。
    4. 性能。Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。
    为什么这么说呢,理由就是Redis是单线程运行的。因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。

    clipboard.png

    conf配置文件

    #### GENERAL ####
    daemonize yes #以守护进程的方式运行
    pidfile “/var/run/redis/redis.pid” #pidfile
    port 6379 #port
    tcp-backlog 511 #tcp的backlog队列长度,backlog的长度是未建立的tcp连接和已经建立的tcp连接之和,等待进程从队列中调用建立的连接。
    bind 192.168.1.30 10.0.0.1 #监听的地址,可以指定多个,0.0.0.0代表本机所有所有地址。
    timeout 5000 #客户端连接的超时时间,单位是毫秒。
    loglevel notice #日志的记录等级。
    logfile “/var/log/redis/redis.log” #日志的存放位置。
    databases 16 #redis所启动的数据库(名称空间)数量,可以在cli中通过select #来切换。
    ## SNAPSHOTTING ##
    save 900 1 #RDB方式的持久化策略,也就是说RDB方式下,数据被定期存储到磁盘的策略。
    save 300 10 #此处三个save依次表示,在900秒内,如果1个key发生改变就写一次磁盘;
    save 60 10000 #在300秒内,如果10个key发生改变就写一次磁盘;在60秒内如果10000个key发生改变就写一次磁盘。
    stop-writes-on-bgsave-error yes #在bgsave时,发生写入操作时会报告错误么,即在bgsave时不允许写入数据。
    rdbcompression yes #rdb文件可以被压缩。
    rdbchecksum yes #rdb文件开启校验。
    dbfilename “dump.rdb” #db的名称为 dump.rdb
    dir “/redis/data1” #RDB的数据目录,在指定非默认目录时,需要修改目录的属主属组为你当前redis进程的属主属组,一般为redis。
    # APPEND ONLY MODE #
    appendonly yes #开启AOF持久化方式。
    appendfilename “appendonly.aof” #AOF文件名。
    appendfsync everysec #AOF的持久化策略,有三个值,always表示只要发生数据操作就执行保存或者重写AOF;everysec表示一秒一次;no表示关闭;
    no-appendfsync-on-rewrite yes #在重写时将当前AOF的日志存储在内存中,防止AOF附加操作与重写产生数据写入堵塞问题,提高了性能却增加了数据的风险性。
    auto-aof-rewrite-percentage 100 #每当AOF日志是上次重写的一倍时就自动触发重写操作。
    auto-aof-rewrite-min-size 64mb #自动触发重写的最低AOF日志大小为64MB,为了防止在AOF数据量较小的情况话频繁发生重写操作。
    aof-load-truncated yes #当redis发生奔溃,通过AOF恢复时,不执行最后最后那条因为中断而发生问题的语句。
    #### LIMITS ####
    maxclients 10000 #限制最大的并发用户连接数为10000条。
    # maxmemory <bytes> #限制最大的内存使用量。
    ### SECURITY ###
    requirepass <password> #设定认证的密码,如果设定了,在远程cli登录,主从配置和sentinel时都需要指定对应参数为此passwd。

    主从复制原理与架构实现

    只需在从节点的配置文件中修改以下配置即可:
    ### REPLICATION ###
    slaveof 192.168.1.29 6379 #主节点地址,<host> <port>。
    #masterauth <master-password> #如果设置了访问认证就需要设定此项。
    slave-server-stale-data yes #当slave与master连接断开或者slave正处于同步状态时,如果slave收到请求允许响应,no表示返回错误。
    slave-read-only yes #slave节点是否为只读。
    slave-priority 100 #设定此节点的优先级,是否优先被同步。

    redis的高可用方案 – sentinel

    只需在sentinel节点的配置文件中修改以下配置即可:
    vim /etc/redis-sentinel.conf
    port 26379
    #sentinel announce-ip 1.2.3.4 #默认监听在0.0.0.0 所以此处可以注释。
    dir “/tmp”
    sentinel monitor mymaster 192.168.1.29 6379 1 #sentinel moitor <master-name> <ip> <redis-port> <法定人数quorum>
    #设定master节点的*名称*和位置,法定人数表示多少台sentinel节点认同才可以上线。
    sentinel down-after-milliseconds mymaster 5000 #如果联系不到节点5000毫秒,我们就认为此节点下线。
    sentinel failover-timeout mymaster 60000 #设定转移主节点的目标节点的超时时长。
    sentinel auth-pass <master-name> <password> #如果redis节点启用了auth,此处也要设置password。
    一些关于sentinel的命令:
    sentinel master <master-name> #查看此复制集群的主节点信息。
    sentinel slaves <master-name> #查看此复制集群的从节点信息。
    sentinel failover <node-name> #切换指定的节点为节点为主节点。

    Redis服务器的信息

    redis_version : 2.8.19                              # Redis服务器版本
    
    redis_git_sha1:00000000                         #Git  SHA1
    
    redis_git_dirty: 0                                 #Git dirty flag
    
    os:  Linux 3.2.0-23-generic x86_64                  #Redis服务器的宿主操作系统
    
    arch_bits: 64                                    #服务器系统架构(32位或64位)
    
    multiplexing_api: epoll                            #Redis使用的事件处理机制
    
    gcc_version:4.6.3                                 #编译Redis时所使用的GCC版本
    
    process_id:7573                                  #Redis服务的进程PID
    
    run_id:f1c233c4194cba88616c5bfff2d97fc3074865c1    #Redis服务器的随机标识符(用于Sentinel和集群)
    
    tcp_port:6379                                    #Redis服务监听的TCP端口
    
    uptime_in_seconds:7976                           #自Redis服务器启动以来,经过的秒数
    
    uptime_in_days:0                 #自Redis服务器启动以来,经过的天数. 这里还不到1天,故显示为0
    
    hz:10                           # Redis调用内部函数来执行许多后台任务的频率为每秒10次   
    
    lru_clock:1133773                 #以分钟为单位进行自增的时钟,用于LRU管理
    
    config_file:/data/redis_6379/redis.conf  #redis.conf配置文件所在路径

    Clients记录客户信息

    connected_clients:2                #已连接客户端的数量(不包括通过从服务器连接的客户端)
    
    client_longest_output_list:0         #当前的客户端连接中,最长的输出列表
    
    client_biggest_input_buf:0          #当前连接的客户端中,最大的输入缓存
    
    blocked_clients:0                  #正在等待阻塞命令(BLOP、BRPOP、BRPOPLPUSH)的客户端的数量

    Memory记录服务器内存信息

    used_memory:894216            #Redis分配器分配给Redis的内存。例如,当Redis增加了存储数据时,需要的内存直接从分配器分配给它的内存里面取就可以了,也就是直接从used_memory取。而Redis分配器分配给Redis的内存,是从操作系统分配给Redis的内存里面取的(单位是字节)
    
    used_memory_human:873.26K     #以人类可读格式显示Redis消耗的内存
    
    used_memory_rss:2691072        #操作系统分配给Redis的内存。也就是Redis占用的内存大小。这个值和top指令输出的RES列结果是一样的。RES列结果就表示Redis进程真正使用的物理内存(单位是字节)
    
    used_memory_peak:914160        #Redis的内存消耗峰值(单位是字节)
    
    used_memory_peak_human:892.73K  #以人类可读的格式返回Redis的内存消耗峰值
    
    used_memory_lua:35840           #Lua引擎所使用的内存大小(单位是字节)
    
    mem_fragmentation_ratio:3.01      # used_memory_rss和used_memory之间的比率
    
    mem_allocator:jemalloc-3.6.0       #在编译时指定的,Redis所使用的内存分配器。可以是libc、jemalloc或者tcmalloc

    小知识

    理想情况下,used_memory_rss的值应该只比used_memory稍微高一点。
    
    当rss >used,且两者的值相差较大时,表示存在(内部或者外部的)内存碎片。内存碎片的比率可以通过mem_fragmentation_ratio的值看出;
    
    当used>rss时,表示Redis的部分内存被操作系统换出到交换空间,在这种情况下,操作可能会产生明显的延迟。

    Persistence记录RDB持久化和AOF持久化信息

    loading:0           #一个标志值,记录了服务器是否正在载入持久化文件
    
    rdb_changes_since_last_save:0  #距离最后一次成功创建持久化文件之后,改变了多少个键值
    
    rdb_bgsave_in_progress:0       #一个标志值,记录服务器是否正在创建RDB文件
    
    rdb_last_save_time:1427189587  #最近一次成功创建RDB文件的UNIX时间戳
    
    rdb_last_bgsave_status:ok       #一个标志值,记录了最后一次创建RDB文件的结果是成功还是失败
    
    rdb_last_bgsave_time_sec:0     #记录最后一次创建RDB文件耗费的秒数
    
    rdb_current_bgsave_time_sec:-1  #如果服务器正在创建RDB文件,那么这个值记录的就是当前的创建RDB操作已经耗费了多长时间(单位为秒)
    
    aof_enabled:0  #一个标志值,记录了AOF是否处于打开状态
    
    aof_rewrite_in_progress:0  #一个标志值,记录了服务器是否正在创建AOF文件
    
    aof_rewrite_scheduled:0   #一个标志值,记录了RDB文件创建完之后,是否需要执行预约的AOF重写操作
    
    aof_last_rewrite_time_sec:-1     #记录了最后一次AOF重写操作的耗时
    
    aof_current_rewrite_time_sec:-1  #如果服务器正在进行AOF重写操作,那么这个值记录的就是当前重写操作已经耗费的时间(单位是秒)
    
    aof_last_bgrewrite_status:ok   #一个标志值,记录了最后一次重写AOF文件的结果是成功还是失败

    开启AOF持久化功能

    在Persistence部分还会加上以下域:
    aof_current_size:14301     #AOF文件目前的大小
    
    aof_base_size:14301       #服务器启动时或者最近一次执行AOF重写之后,AOF文件的大小
    
    aof_pending_rewrite:0     #一个标志值,记录了是否有AOF重写操作在等待RDB文件创建完之后执行
    
    aof_buffer_length:0       # AOF缓冲区的大小
    
    aof_rewrite_buffer_length:0  #AOF重写缓冲区的大小
    
    aof_pending_bio_fsync:0    #在后台I/0队列里面,等待执行的fsync数量
    
    aof_delayed_fsync:0        #被延迟执行的fsync数量

    Stats记录统计信息

    total_connections_received:8   #服务器已经接受的连接请求数量
    
    total_commands_processed:10673  #服务器已经执行的命令数量
    
    instantaneous_ops_per_sec:0   #服务器每秒中执行的命令数量
    
    rejected_connections:0        #因为最大客户端数量限制而被拒绝的连接请求数量
    
    expired_keys:0               #因为过期而被自动删除的数据库键数量
    
    evicted_keys:0               #因为最大内存容量限制而被驱逐(evict)的键数量
    
    keyspace_hits:1              #查找数据库键成功的次数
    
    keyspace_misses:0           #查找数据库键失败的次数
    
    pubsub_channels:0           #目前被订阅的频道数量
    
    pubsub_patterns:0           #目前被订阅的模式数量
    
    latest_fork_usec:159          #最近一次fork()操作耗费的时间(毫秒)

    Replication记录主从复制的信息

    role:master                 #在主从复制中,充当的角色。如果没有主从复制,单点的,它充当的角色也是master
    
    connected_slaves:1           #有一个slave连接上来
    
    slave0:ip=14.17.119.220,port=6379,state=online,offset=718446,lag=0  #slave的IP、端口、状态等

    如果当前服务器是从服务器的话,那么这个部分还会加上以下域:

    master_host :主服务器的IP地址

    master_port:主服务器监听的端口号

    master_link_status:复制连接当前的状态,up表示连接正常,down表示连接断开

    master_last_io_seconds_ago:距离最近一次与主服务器进行通信已经过去了多少秒

    master_sync_in_progress:一个标志值,记录了主服务器是否正在与这个从服务器进行同步

    如果同步操作正在进行,那么这个部分还会加上以下域:

    master_sync_left_bytes:距离同步完成还缺多少字节的数据

    master_sync_last_io_seconds_ago: 距离最近一次与主服务器进行通信已经过去了多少秒

    如果主从服务器之间的连接处于断线状态,那么这个部分还会加上以下域:

    master_link_down_since_seconds: 主从服务器连接断开了多少秒

    cpu部分记录了CPU的计算量统计信息,它包含以下域:

       used_cpu_sys:75.46   #Redis服务器耗费的系统CPU
    
       used_cpu_user:90.12  #Redis服务器耗费的用户CPU
    
       used_cpu_sys_children:0.00  #Redis后台进程耗费的系统CPU
    
       used_cpu_user_children:0.00  #Redis后台进程耗费的用户CPU
    
    Keyspace部分记录了数据库相关的统计信息,如数据库的键数量、数据库已经被删除的过期键数量。对于每个数据库,这个部分会添加一行以下格式的信息:
    
    db0:keys=25,expires=0,avg_ttl=0   #0号数据库有25个键、已经被删除的过期键数量为0个

    达龙
    250 声望19 粉丝

    天才是重复次数最多的人!