zoukankan      html  css  js  c++  java
  • Redis

    一、概念

    • ACID:原子性、一致性、隔离性、持久性
    • noSQL:non SQL, Not Only SQL,特性:数据量大、数据变化非常快(数据增长快、流量分布变化大、数据间耦合结构变化快)、数据源很多
    • CAP:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的
      • C:多个数据节点上的数据一致;
      • A:用户发出请求后的有限时间范围内返回结果;
      • P:network partition,网络发生分区后,服务是否依然可用;
    • BASE:BA,S,E,基于CAP演化而来
      • BA:Basically Available,基本可用;
      • S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
      • E:Eventually consistency,最终一致性;
    • 分布式一致性协议:Paxos,Raft等

    Key Value / Tuple Store:DynamoDB, redis
    Wide Column Store / Column Families:列式数据库, hbase
    Document Store:文档数据库,mongodb,Elastic
    Graph Databases:图式数据库,Neo4j
    Time Series / Streaming Databases:时间序列存储

    二、Redis简介

    Redis:REmote DIctionary Server 远程数据结构服务器

    Redis是一个开源的,以内存作为存储的,可以作为数据库,缓存,消息(掮客)队列服务器

    支持的数据结构:字符串、列表、集合、hash(关联数组)、有序集合(支持范围查询)、位图、空间索引(支持辐射查询)

    特性:

    • 内建的复制功能(主从复制)
    • Lua脚本引擎
    • LRU的内存淘汰机制
    • 支持事务
    • 不同级别的基于磁盘的持久机制
    • 基于Sentinel所实现的高可用
    • 3.0以后内建支持集群功能
    • 单进程,不会因为CPU出现瓶颈
    • 持久化:snapshotting(默认)和AOF(Apend Only File)

    安装:# yum install redis -y基于epel仓库

    配置文件:/etc/redis.conf

    服务:/usr/lib/systemd/system/redis.service

    主程序:/usr/bin/redis-server

    命令行客户端:/usr/bin/redis-cli

    主配文件简单简述:

    [root@redis ~]# grep "^###" /etc/redis.conf
    ################################## INCLUDES ###################################
    ################################## NETWORK ####################################网络属性
    ################################# GENERAL #####################################通用配置
    ################################ SNAPSHOTTING  ################################快照持久
    ################################# REPLICATION #################################主从复制
    ################################## SECURITY ###################################安全认证
    ################################### LIMITS ####################################资源限制
    ############################## APPEND ONLY MODE ###############################AOF持久
    ################################ LUA SCRIPTING  ###############################LUA脚本
    ################################ REDIS CLUSTER  ###############################集群配置
    ################################## SLOW LOG ###################################慢日志
    ################################ LATENCY MONITOR ##############################延迟监控器
    ############################# EVENT NOTIFICATION ##############################事件通知
    ############################### ADVANCED CONFIG ###############################高级配置
    

    简单配置:

    [root@redis ~]# vim /etc/redis.conf
    bind 0.0.0.0
    port 6379
    [root@redis ~]# systemctl start redis
    [root@redis ~]# redis-cli -h 192.168.0.13
    

    redis-cli命令:

    • -h:指定主机
    • -p:指定端口
    • -a:指定密码
    • -n:指定几号数据库,0-15
    192.168.0.13:6379> help
    To get help about Redis commands type:
          "help @<group>" to get a list of commands in <group>
          "help <command>" for help on <command>
          "help <tab>" to get a list of possible help topics
          "quit" to exit
    

    三、Redis数据库操作命令

    支持的数据结构:字符串、列表、字典、集合、有序集合、发布/订阅队列

    • @string:字符串
    SET [EX|NX|XX] #设定键的值
    GET            #获取键的值
    EXISTS         #判定指定键是否存在
    INCR           #增加相关的键的值
    DECR           #降值
    SETNX          #已存在就不会改变键的值
    SETEX          #设定键的过期时间
    INCRBYFLOAT    #以浮点的方式自增
    MGET           #获取多个键的值
    MSET           #设定多个键的值
    STRLEN         #获取键有几个字符
    APPEND         #在一个键后追加新的内容
    
    • @list:列表
    LPUSH          #左进
    RPUSH          #右进
    LPOP           #左出
    RPOP           #右出
    LPUSHX         #仅当列表存在时入栈
    RPUSHX         #仅当列表存在才从右侧新增元素
    LRANGE         #取指定范围内的键
    LINDEX         #获取指定索引的值
    LSET           #改其中一个元素的值
    LTRIM          #删除指定范围内的键
    LREM           #移除指定范围的元素
    
    • @hash:字典
    HSET           #设定键值
    HMSET          #设定多个键值
    HGET           #获取键的值
    HMGET          #获取多个键的值
    HKEYS          #获取指定键的所有字段
    HVALS          #获取指定键的所有值
    HDEL           #删除字段
    HGETALL        #获取键的所有字段和值
    HSTRLEN        #获取指定键的值的长度
    
    • @set:集合
    SADD           #添加
    SPOP           #弹出
    SREM           #删除指定的元素
    SRANDMEMBER    #
    SINTER         #求交集
    SUNION         #求并集
    SCARD          #列出集合中的所有元素个数
    SMEMBERS       #列出集合中的所有元素
    
    • @sorted_set:有序集合
    ZADD           #增加 > ZADD z1 100 tom 90 jerry 80 maria
    ZCARD          #
    ZCOUNT         #
    ZRANK          #获取指定成员的索引信息
    ...
    
    • @pubsub:发布/订阅
    PUBLISH        #发布消息
    SUBSCRIBE      #订阅某个队列
    UNSUBSCRIBE    #取消订阅
    PSUBSCRIBE     #基于正则表达式订阅某些个队列
    PUNSUBSCRIBE   #基于正则表达式取消订阅
    
    • @connection:连接相关
    PING            #探测服务
    AUTH password   #认证
    SELECT index    #切换数据库
    KEYS pattern    #列出数据库中的键
    QUIT            #退出
    FLUSHDB         #清空当前数据库
    FLUSHALL        #清空所有数据库
    
    • Server相关的命令
    CLIENT GETNAME  #获取客户端名称
    CLIENT LIST     #列出所有连接的客户端
    CLIENT SETNAME local  #设置当前连接的名称
    CLIENT KILL     #关闭客户端
    SHUTDOWN        #关闭服务器
    CONFIG GET requirepass #获取配置
    CONFIG SET      #修改配置
    CONFIG REWRITE  #将内存中的配置覆盖文件中的配置
    INFO            #获取状态信息和统计信息
    

    四、Redis的配置

    • 通用配置项:
    daemonize no                      #是否运行为守护进程
    supervised no
    pidfile /var/run/redis_6379.pid
    loglevel notice                   #日志级别
    logfile /var/log/redis/redis.log
    databases 16                      #定义最大16个数据库,-1:不作限制
    
    • 网络配置项:
    bind 127.0.0.1                    #监听的地址
    protected-mode yes                #保护模式,没有定义bind指令,而且又没有配置密码则激活保护模式
    port 6379                         #监听的端口
    tcp-backlog 511                   #tcp后援队列
    unixsocket /tmp/redis.sock
    timeout 0                         #如果客户端长时间没有操作则断开连接,0为不端口连接
    tcp-keepalive 300                 #tcp连接的超时时长
    
    • 安全配置:
    requirepass <PASSWORD>                    #设定密码
    rename-command <COMMAND> <NEW_CMND_NAME>  #命令重命名,在AOF或Replication环境中,不推荐使用
    
    • 资源限制:
    maxclients 10000                  #最大并发连接数
    maxmemory <bytes>                 #存储内存设置,单位字节,如果不设定则使用所有的内存,如果内存耗尽则会被OOM(Out Of Memory),内核将自动杀死最“吃”内存资源的进程
    maxmemory-policy noeviction       #一旦内存到达maxmemory时的内存淘汰机制
    	volatile-lru    #只对有过期时间的键基于LRU淘汰
    	allkeys-lru     #对所有的键都基于LRU的算法淘汰
    	volatile-random #只对有过期时间的键随机淘汰
    	allkeys-random  #对所有的键都基于随机淘汰
    	volatile-ttl    #对有过期时间的键基于幂序淘汰
    	noeviction      #不淘汰任何键,如果没有空间则返回错误
    maxmemory-samples 5               #采样范围,5个接近真实,10无限接近真实,3个非常快但不是太精准
    
    • 慢查询日志配置:
    slowlog-log-slower-than 10000     #慢日志标准,10000微秒=0.1秒
    slowlog-max-len 128               #SlowLog记录的日志最大条目
    
    • 高级配置:定义各中数据结构最大容纳的数据量
    hash-max-ziplist-entries 512      #字典的每个键中的字段最大512个 
    hash-max-ziplist-value 64         #单个字段的值最大64字节
    client-output-buffer-limit normal 0 0 0         #面向客户端的发送缓冲,普通客户端
    client-output-buffer-limit slave 256mb 64mb 60  #从服务器客户端
    client-output-buffer-limit pubsub 32mb 8mb 60   #订阅队列客户端
    	<hard-limit>          #硬限制
    	<soft-limit>          #软限制
    	<soft-limit seconds>  #软限制超出多少时间清空
    

    五、Redis的持久化存储

    1、RDB:snapshotting

    二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘,数据文件默认为dump.rdb

    客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
    SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
    BGSAVE:异步;backgroud

    dbfilename dump.rdb  #二进制文件名
    dir /var/lib/redis
    rdbchecksum yes      #校验
    rdbcompression yes   #压缩存放
    stop-writes-on-bgsave-error yes  #如果有错误则停止写入操作
    save 900 1
    save 300 10          #在300秒内,有10次数据修改操作,则立即触发快照
    save 60 10000        #在60秒内,有10000次数据修改操作,则立即触发快照
    

    2、AOF

    记录每次写操作至指定的文件尾部实现的持久化,当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库

    BGREWRITEAOF:AOF文件重写;不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件

    appendonly no
    appendfilename "appendonly.aof"
    auto-aof-rewrite-percentage 100  #发生变化的内容占原来数据的100%,则触发自动重写
    auto-aof-rewrite-min-size 64mb   #当数据大于64M时才启动以上自动重写策略
    appendfsync everysec             #多长时间同步内存到磁盘中,一秒一次
    aof-load-truncated yes           #是否修剪残缺数据
    

    注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;

    RDB与AOF同时启用:
    (1) BGSAVE和BGREWRITEAOF不会同时进行;
    (2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

    六、主从复制

    ################################# REPLICATION #################################
    slave-serve-stale-data yes   #如果主节点宕机,从节点是否可以将不新鲜的数据提供给客户端
    slave-read-only yes          #将从节点设置为只读
    repl-diskless-sync no        #向多个从节点同时发送
    repl-diskless-sync-delay 5   #等待5s发送
    repl-ping-slave-period 10    #探测从节点存活性
    repl-timeout 60
    repl-disable-tcp-nodelay no
    slave-priority 100           #从服务器的优先级
    # min-slaves-to-write 3
    # min-slaves-max-lag 10      #如果集群中有10个从节点,有3存活才可以正常工作
    

    master配置:

    [root@master ~]# vim /etc/redis.conf
    bind 0.0.0.0
    requirepass dongfei
    

    Disk-backed:将数据写到磁盘上,适合互联网

    Diskless:直接发送到内存缓存区,适合内网

    slave配置:

    [root@node01 ~]# vim /etc/redis.conf
    bind 0.0.0.0
    requirepass dongfei
    slaveof 192.168.0.13 6379
    masterauth dongfei
    

    查看状态:

    [root@master ~]# redis-cli -a dongfei
    127.0.0.1:6379> INFO replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.0.14,port=6379,state=online,offset=99,lag=0
    master_repl_offset:99
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:98
    

    命令配置slave:

    [root@node02 ~]# vim /etc/redis.conf
    bind 0.0.0.0
    requirepass dongfei
    [root@node02 ~]# systemctl start redis
    [root@node02 ~]# redis-cli -a dongfei
    127.0.0.1:6379> SLAVEOF 192.168.0.13 6379
    127.0.0.1:6379> CONFIG SET masterauth dongfei
    127.0.0.1:6379> CONFIG GET masterauth
    1) "masterauth"
    2) "dongfei"
    127.0.0.1:6379> KEYS *
    1) "z1"
    2) "stus"
    3) "n"
    4) "class"
    5) "stu1"
    6) "newkey"
    127.0.0.1:6379> CONFIG REWRITE
    [root@node02 ~]# tail -3 /etc/redis.conf   
    # Generated by CONFIG REWRITE
    slaveof 192.168.0.13 6379
    masterauth "dongfei"
    

    七、sentinel高可用集群

    主要完成三个功能:监控、通知、自动故障转移

    [root@master ~]# vim /etc/redis-sentinel.conf
    bind 0.0.0.0
    sentinel monitor mymaster 192.168.0.13 6379 2
    sentinel auth-pass mymaster dongfei
    sentinel down-after-milliseconds mymaster 10000
    sentinel parallel-syncs mymaster 2
    sentinel failover-timeout mymaster 180000
    logfile /var/log/redis/sentinel.log
    [root@master ~]# scp /etc/redis-sentinel.conf 192.168.0.14:/etc/
    [root@master ~]# scp /etc/redis-sentinel.conf 192.168.0.15:/etc/
    [root@master ~]# systemctl start redis-sentinel
    [root@node01 ~]# vim /etc/redis-sentinel.conf 
    删除:sentinel myid xxxx
    [root@node01 ~]# systemctl start redis-sentinel
    [root@node01 ~]# redis-cli -p 26379
    127.0.0.1:26379> SENTINEL masters
    1)  1) "name"
        2) "mymaster"
        3) "ip"
        4) "192.168.0.13"  #被监控地址
    127.0.0.1:26379> SENTINEL slaves mymaster
    1)  1) "name"
        2) "192.168.0.15:6379"
    2)  1) "name"
        2) "192.168.0.14:6379"
    [root@node02 ~]# vim /etc/redis-sentinel.conf
    删除:sentinel myid xxxx
    [root@node02 ~]# systemctl start redis-sentinel
    

    SENTINEL failover <MASTER_NAME>
    SENTINEL get-master-addr-by-name <MASTER_NAME>

    八、分布式扩展:Cluster集群相关的配置

    配置过程:
    (1) 设置配置文件,启用集群功能;
    (2) 启动redis后为每个节点分配slots;
    CLUSTER ADDSLOTS
    注意:每个slot要独立创建;可用范围是0-16383,共16384个;
    (3) 设定集群成员关系;
    CLUSTE MEET

    [root@node01 ~]# vim /etc/redis.conf 
    bind 0.0.0.0
    requirepass dongfei
    ################################ REDIS CLUSTER  ###############################
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    cluster-slave-validity-factor 10
    [root@node01 ~]# scp /etc/redis.conf 192.168.0.14:/etc/
    [root@node01 ~]# scp /etc/redis.conf 192.168.0.15:/etc/
    [root@node01 ~]# systemctl start redis
    [root@node02 ~]# systemctl start redis
    [root@node03 ~]# systemctl start redis
    [root@node01 ~]# redis-cli -a dongfei -h 192.168.0.13 -c cluster addslots {0..5499}
    [root@node01 ~]# redis-cli -a dongfei -h 192.168.0.14 -c cluster addslots {5500..10999}
    [root@node01 ~]# redis-cli -a dongfei -h 192.168.0.15 -c cluster addslots {11000..16383}
    [root@node01 ~]# redis-cli -a dongfei
    127.0.0.1:6379> CLUSTER MEET 192.168.0.14 6379
    127.0.0.1:6379> CLUSTER MEET 192.168.0.15 6379
    127.0.0.1:6379> CLUSTER NODES
    2e2905d38d25706f3f78b70aa8763e4faf5d592e 192.168.0.14:6379 master - 0 1532428013117 1 connected 5500-10999
    e512ceda75fecd864fa101a4be23789828d4aaac 192.168.0.15:6379 master - 0 1532428014119 0 connected 11000-16383
    ce6a7525e403171d1ff02443820bda71812d10ac 192.168.0.13:6379 myself,master - 0 0 2 connected 0-5499
    

    感谢阅读!

  • 相关阅读:
    软件工程 团队博客第二阶段成绩
    现代软件工程 10 绩效管理
    现代软件工程讲义 1 软件工程概论
    现代软件工程讲义 0 教学方法
    软件工程 敏捷的酒后问答
    我传递了错误的信息
    起跑点上
    输在起跑点上?
    好可怕的假相
    浪子回头
  • 原文地址:https://www.cnblogs.com/L-dongf/p/9361837.html
Copyright © 2011-2022 走看看