Redis

1、NoSQL:

   ACID:
            原子性,一致性,隔离性,持久性; 
                2phase commit,3phase commit,...
  non SQL,Not Only SQL;Web 2.0
              
                www.nosql-databases.org
                https://db-engines.com/en/ranking
   特性:数据量大,数据变化非常快(数据增长快,流量分布变化大,数据间耦合结构变化快),数据源很多
         
          CAP,BASE
               CAP:
                    C:多个数据节点上的数据一致;
                    A:用户发出请求后的有限时间范围内返回结果;
                    P:network partition,网络发生分区后,服务是否依然可用
            CAP理论:一个分布性系统不可能同时满足C、A、P三个特性,最多可同时满足其两者,对于分布式系统满足分区容错性几乎是必须的。
                AP: 
                    C:弱一致性;
                CP: 一旦出现故障就降级到可读
                    
        BASE:BA,S,E,基于CAP演化而来
            BA:Basically Available,基本可用;
            S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
            E:Eventually consistency,最终一致性;
    
NoSQL:Not Only SQL 
    Key Value / Tuple Store:键值存储数据库,DynamoDB, redis 
    Wide Column Store / Column Families:列式数据库, hbase
    Document Store:文档数据库,mongodb,Elastic
    Graph Databases:图式数据库,Neo4j
    
    Multimodel Databases:多模型数据库
    Object Databases:面向对象数据库
    Time Series / Streaming Databases:时间序列存储

2、Redis:

    开源、内存存储、数据结构存储;
    可用作:数据库、缓存、消息队列;
    
    数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;
    内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:数据结构服务器,k/v,数据结构;
    内存存储:in-memroy
    持久化
    主从(sentinel)
    Cluster(shard)
    
数据结构服务器:
    Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
    PUB/SUB

单进程:
    CPU并非瓶颈;
    
持久化:
    snapshotting

Replication:(复制 )
    主/从
        主:rw
        从:read-only
        
Redis Cluster

3、程序环境

    配置文件:/etc/redis.conf
    主程序:/usr/bin/redis-server
                    6379/tcp
    客户端:/usr/bin/redis-cli
    Unit File:/usr/lib/systemd/system/redis.service
    数据目录:/var/lib/redis
redis:k/v
       key:直接ASCII字符串;
      value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
        
            To get help about Redis commands type:
                "help @" to get a list of commands in 
                "help " for help on 
                "help " to get a list of possible help topics
                "quit" to exit      
        
        group:
            @generic, @string, @list, @...

4、redis-cli命令:

    Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
        
        -h HOST
        -p PORT
        -a PASSWORD
        -n DBID
Redis_第1张图片
image.png
    Server相关的命令:
         CLIENT GETNAME
         *CLIENT KILL
            CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
         *CLIENT LIST
         CLIENT PAUSE
            CLIENT PAUSE timeout
         CLIENT REPLY               
         CLIENT SETNAME:Set the current connection name
         
          SHUTDOWN [NOSAVE|SAVE]
          
         配置参数可运行时修改:
         
            CONFIG GET
            CONFIG RESETSTAT
            CONFIG REWRITE
            CONFIG SET
         
         INFO:服务器状态信息查看;分为多个secion;
            INFO [section]
@string
            SET 创建一个键值
            GET 获取键的值
            EXISTS
            INCR 自增 在Redis中数值是当做字符串处理
            DECR 自减
            SETNX  如果键值不存在则创建
            SETEX   指定一个键的过去时间
            INCRBYFLOAT 一次增加多少
            MGET  获取多个键的值
            MSET  创建多个键值
            APPEND 在之前的键上加上其他的字符
Redis_第2张图片
image.png
@list 
            LPUSH 入栈
            RPUSH
            LPOP 左弹(弹栈)
            RPOP 右弹
            LPUSHX 
            RPUSHX 
            LRANGE
            LINDEX 此时是列表
            LSET
Redis_第3张图片
image.png
@hash 
            HSET
            HMSET
            HGET
            HMGET 
            HKEYS
            HVALS
            HDEL 删除
            HGETALL 获取所有键值对
                         HSTRLEN  获取指定元素的长度 
            ...
             members --> {name:Jerry, age:17, gender:Female }
                                  HKEYS:取出所有键
                                  HVALS:取出所有值
Redis_第4张图片
image.png
@pubsub 发布订阅
            PUBLISH 像一个频道内放入一则消息
            SUBSCRIBE 订阅频道(队列)
            UNSUBSCRIBE 取消订阅
            PSUBSCRIBE 基于模式来订阅
            PUNSUBSCRIBE 取消订阅
            PUBSUB 获取发布一个序列信息
                         ...
image.png

打开另一个终端


Redis_第5张图片
image.png

5、与Connection相关命令:

        help @connection
        
        AUTH  
        ECHO 
        PING 
        QUIT
        SELECT dbid
        
    清空数据库:
         FLUSHDB:Remove all keys from the current database
            清空当前数据库;
         FLUSHALL:Remove all keys from all databases
            清空所有数据库;

6、配置和使用Redis:

    基本配置项
    网络配置项
    持久化相关配置
    复制相关的配置
    安全相关配置
    Limit相关的配置
    SlowLog相关的配置
    INCLUDES
    Advanced配置
    
    通用配置项:
        daemonize, supervised, loglevel, pidfile, logfile, 
        databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
        切换数据库的方法:
             SELECT 
             
    网络配置项:
        bind IP
        port PORT
        protected-mode
        tcp-backlog
        unixsocket 
        timeout:连接的空闲超时时长; 
        
    安全配置:
        requirepass 
        rename-command  
            在AOF或Replication环境中,不推荐使用;
![image.png](http://upload-images.jianshu.io/upload_images/6854899-813a7c23ac2e1e18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Redis_第6张图片
image.png

Limits相关的配置:
maxclients
maxmemory
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法运行时的采样样本数;


image.png
    SlowLog相关的配置:
        slowlog-log-slower-than 10000
            单位是微秒;
        slowlog-max-len 128
            SlowLog记录的日志最大条目;
            
    ADVANCED配置:
        hash-max-ziplist-entries 512
        hash-max-ziplist-value 64   
        
            设置ziplist的键数量最大值,每个值的最大空间; 
        
        client-output-buffer-limit normal 0 0 0
        client-output-buffer-limit slave 256mb 64mb 60
        client-output-buffer-limit pubsub 32mb 8mb 60
            
            
            

7、Redis的持久化:

    RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
        客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
            SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
            BGSAVE:异步;
    AOF:Append Only File, fsync
        记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
           BGREWRITEAOF:AOF文件重写;
    不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件; 
                
    RDB相关的配置:
        *save  
        
            save 900 1
            save 300 10
            save 60 10000
            
            表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;
            
        stop-writes-on-bgsave-error yes
            dump操作出现错误时,是否禁止新的写入操作请求;
            
        rdbcompression yes
        rdbchecksum yes
        
        dbfilename dump.rdb:指定rdb文件名
        *dir /var/lib/redis:rdb文件的存储路径
        
    AOF相关的配置
        *appendonly no
        appendfilename "appendonly.aof"
        
        *appendfsync 
            Redis supports three different modes:
                no:redis不执行主动同步操作,而是OS进行;
                everysec:每秒一次;
                always:每语句一次;
                
        no-appendfsync-on-rewrite no
            是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;
            
        auto-aof-rewrite-percentage 100
        auto-aof-rewrite-min-size 64mb  
            上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB; 
            
        aof-load-truncated yes
        
    注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;
    
    RDB与AOF同时启用: 
        (1) BGSAVE和BGREWRITEAOF不会同时进行;
        (2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
        
复制:
    特点:
        一个Master可以有多个slave主机,支持链式复制;
        Master以非阻塞方式同步数据至slave主机;
        
    配置slave节点:
        redis-cli> SLAVEOF  
        redis-cli> CONFIG SET masterauth 
        
    配置参数:
        *slaveof
        *masterauth 
        
        slave-serve-stale-data yes
        slave-read-only yes
        *repl-diskless-sync no
            no, Disk-backed, Diskless
            
            新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
                Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
                Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
        
        repl-diskless-sync-delay 5
        repl-ping-slave-period 10
        
        *repl-timeout 60
        
        repl-disable-tcp-nodelay no
        repl-backlog-size 1mb
        
        *slave-priority 100
            复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举; 
        
        min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
        min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
        
sentinel:
    主要完成三个功能:监控、通知、自动故障转移
    
        选举:流言协议、投票协议
        
    配置项:
        port 26379
        sentinel monitor    
        sentinel auth-pass  
        
            表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;
                s_down: subjectively down
                o_down: objectively down
        
        sentinel down-after-milliseconds  
            监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
            
        sentinel parallel-syncs  
            指在failover过程中,能够被sentinel并行配置的从节点的数量;
            
        sentinel failover-timeout  
            sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
            
        sentinel notification-script  
            通知脚本,此脚本被自动传递多个参数;
            
        redis-cli -h SENTINEL_HOST -p SENTINEL_PORT 
            redis-cli> 
                SENTINEL masters
                SENTINEL slaves 
                SENTINEL failover 
                SENTINEL get-master-addr-by-name 

8、CLuster:

    集群相关的配置:

        cluster-enabled 是否开启集群配置
        cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
        cluster-node-timeout 集群节点互连超时的阀值,单位毫秒
        cluster-slave-validity-factor 进行故障转移时,salve会 申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
        
    配置过程:
        (1) 设置配置文件,启用集群功能;
        (2) 启动redis后为每个节点分配slots;
            CLUSTER ADDSLOTS
            注意:每个slot要独立创建;
        (3) 设定集群成员关系;
            CLUSTE MEET

redis的集群技术:
    客户端分片
    代理分片:
        豌豆荚:codis
        twitter:twemproxy
    redis cluster               

你可能感兴趣的:(Redis)