Redis存储

NoSQL:

NoSQL DEFINITION: Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable.

ACID:
    原子性、一致性、隔离性、持久性;
    2phase commit, 3phase comit, ...

non SQL, Not Only SQL; Web 2.0

    www.nosql-databases.org
    https://db-engines.com/en/ranking

特性:数据量大、数据变化非常快(数据增长快、流量分布变化大、数据间耦合结构变化快)、数据源很多;

    CAP、BASE
        CAP:
            2000年,PODC(Principle of Distributed Computing)会议, Brewer
                Consistency、Availablity、Partition tolerence
                    C:多个数据节点上的数据一致;
                    A:用户发出请求后的有限时间范围内返回结果;
                    P:network partition,网络发生分区后,服务是否依然可用;
            CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。新时代P出现的可能性很小,故而3个条件可同时满足;
                AP: 
                    C:弱一致性;
                CP:

        BASE:BA,S,E,基于CAP演化而来
            BA:Basically Available,基本可用;
            S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
            E:Eventually consistency,最终一致性;

NoSQL:Not Only SQL  NOSQL流派
    Key Value / Tuple Store:DynamoDB, redis 
    Wide Column Store / Column Families:列式数据库, hbase
    Document Store:文档数据库,mongodb,Elastic
    Graph Databases:图式数据库,Neo4j

    Time Series / Streaming Databases:时间序列存储

    Multimodel Databases:
    Object Databases:

Redis:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. 
    开源、内存存储、数据结构存储;
    可用作:数据库、缓存、消息队列;

It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
    数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;

Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
    内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:数据结构服务器,k/v,数据结构;

单进程:
    CPU并非瓶颈;
    单进程即只能跑到一个内核核心上
持久化:
    snapshotting
    AOF

程序环境:
    配置文件:/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 @<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      

    group:
        @generic, @string, @list, @...  可以用tab键进行不全。

    @string
        SET
        GET
        EXISTS
        INCR    递增值
        DECR    递减值
        SETNX   不存在时设定
        SETEX   存在时修改
        INCRBYFLOAT 以浮点数类型向上递增
        MGET    一次获取多个建的值
        MSET    一次设定多个键的值

    @list   注意栈是先进后出的
        LPUSH   左侧入栈
        RPUSH   右侧入栈
        LPOP    左边出栈
        RPOP    右边出栈
        LPUSHX  栈存在就左入栈
        RPUSHX  栈存在就右入栈
        LRANGE  标定范围内的元素列表
        LINDEX  以指定索引找元素
        LSET    设定特定索引上的元素的值
        LLEN    显示指定键的元素长度

LREM 删除元素
@set
SADD 在集合中添加元素,如果集合不存在就创建
SPOP 随机弹出一个数据
SREM 删除指定的数据
SRANDMEMBER 从成员中得到一个或者多个随机成员
SINTER 交集
SUNION 并集

    @sorted_set
        ZADD
        ZCARD
        ZCOUNT
        ZRANK
        ...

    @hash 
        HSET    设定一个hash
        HMSET   一次设定hash的多个字段
        HGET    获取一个hash
        HMGET   获取多个hash
        HKEYS   获取指定hash的所有字段,不列出值
        HVALS   列出一个hash中的所有值,不列出字段
        HDEL    删除一个hash的指定的键值
        HGETALL 获取一个hash的所有的字段和值
        ...

        members -> {name:jerry, age:17,gender:Female}
            HKEYS
            HVALS

    @pubsub     消息队列
        PUBLISH
        SUBSCRIBE
        UNSUBSCRIBE
        PSUBSCRIBE
        PUNSUBSCRIBE
        ...

    @geo    

    @hyperloglog         

回顾:

分布式系统两个基础理论:CAP/BASE
    CAP:AP
        C、A、P:三者其中之二;
            AP:可用性、分区容错性、弱一致性;
    BASE:BA,S,E
        BA:基本可用、S:软状态、E:最终一致性;

分布式系统:  
    分布式存储:
        NoSQL:
            kv、document、column families、GraphDB
        分布式文件系统:文件系统接口
            分布式存储:API,不能挂载;                                 
        NewSQL:
            PingCAP:TiDB(MySQL protocol)... 重构的既能够支持事务,又能够支持分布式系统
    分布式运算:mapreduce, ...

redis:REmote DIctionary Server
    数据结构:String, List, Set, sorted_set, Hash, pubsub ...

Redis(2)

redis-cli命令:
    Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]

        -h HOST, 127.0.0.1
        -p PORT, 6379/tcp
        -a PASSWORD
        -n DBID
            0-15

    与Connection相关命令:
        help @connection            
        AUTH <password> 
        ECHO <message>
        PING 
        QUIT
        SELECT dbid

    清空数据库:
         FLUSHDB:Remove all keys from the current database
            清空当前数据库;
         FLUSHALL:Remove all keys from all databases
            清空所有数据库;

配置和使用Redis:
    基本配置项
    网络配置项
    持久化相关配置
    复制相关的配置
    安全相关配置
    Limit相关的配置
    SlowLog相关的配置
    INCLUDES
    Advanced配置

    通用配置项:
        daemonize, supervised, loglevel, pidfile, logfile, 
        databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
        切换数据库的方法:
             SELECT <dbid>
        解释:

daemonize:是否以守护进程方式运行
supervised:是否接受某个进程的管控
网络配置项:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:连接的空闲超时时长;

    安全配置:
        requirepass <PASSWORD>
        rename-command <COMMAND> <NEW_CMND_NAME>
            在AOF或Replication环境中,不推荐使用;  防止到另一环境中命令不识别;

    Limits相关的配置:
        maxclients
        maxmemory <bytes>
        maxmemory-policy noeviction
            淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
         maxmemory-samples 5
            淘汰算法运行时的采样样本数;  采样是看哪个快过期或随机取等

    SlowLog相关的配置:
        slowlog-log-slower-than 10000   超出10毫秒就记录为慢日志,以方便优化
            单位是微秒;
        slowlog-max-len 128
            SlowLog记录的日志最大条目;

    ADVANCED配置:
        hash-max-ziplist-entries 512    存储的最大的键值对数
        hash-max-ziplist-value 64   每一个value不能太长,为64字节

            设置ziplist的键数量最大值,每个值的最大空间; 

        client-output-buffer-limit normal 0 0 0 正常连接redis服务器复制数据,服务器缓冲

区有多大;
client-output-buffer-limit slave 256mb 64mb 60 redis从服务器复制数据客户端
client-output-buffer-limit pubsub 32mb 8mb 60 客户端订阅了服务器的发行服务
<hard-limit> 最大不能超过此值
<soft-limit> 可以超过此值
<soft-limit seconds> 超过上值最多使用多长时间

redis-cli命令:
    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]

Redis的持久化:
    RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
        客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
            SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
            BGSAVE:异步;backgroud
        记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
            BGREWRITEAOF:AOF文件重写;   重写是直接从内存快照之后进行重构命

令,使得原来的多个重复操作一步到一个值。更加简化高效
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件; 在重启服务时将记录的命令操作执行一遍。优点是不会丢失数据或丢失数据很少,而缺点是如计数器的操作记录要进行很多次,不如直接设置计数器的值。

    RDB相关的配置:
        *save <seconds> <changes>

            save 900 1
            save 300 10
            save 60 10000
            save 5  200000

            表示:三个策略满足其中任意一个均会触发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 <MASTER_IP> <MASTER_PORT>
        redis-cli> CONFIG SET masterauth <PASSWORD>

    配置参数:
        *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:
    主要完成三个功能:监控、通知、自动故障转移   主故障,从变主,依靠sentinel判断,最

好将sentinel和redis不要放到一台主机

        选举:流言协议、投票协议

    配置项:

bind 0.0.0.0 必须写,不然不能进行故障转移
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>

            <quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;奇数个
                s_down: subjectively down
                o_down: objectively down

        sentinel down-after-milliseconds <master-name> <milliseconds>
            监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;

        sentinel parallel-syncs <master-name> <numslaves>
            指在failover过程中,能够被sentinel并行配置的从节点的数量;

        sentinel failover-timeout <master-name> <milliseconds>
            sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;单位为毫秒;

        sentinel notification-script <master-name> <script-path>
            通知脚本,此脚本被自动传递多个参数;

        redis-cli -h SENTINEL_HOST -p SENTINEL_PORT 
            redis-cli> 
                SENTINEL masters
                SENTINEL slaves <MASTER_NAME>
                SENTINEL failover <MASTER_NAME>
                SENTINEL get-master-addr-by-name <MASTER_NAME>
        注意:如果从变成主,主要想成为从,需要加上从的配置;
CLuster:
    集群相关的配置:

先关闭服务,停止主从
cluster-enabled 是否开启集群配置
cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。

    配置过程:
        (2) 启动redis后为每个节点分配slots;
            CLUSTER ADDSLOTS
            注意:每个slot要独立创建;可用范围是0-16383,共16384个;
            在执行以下分配狭槽的命令执行前必须确保每个节点都没有数据,也没有分配过插槽

rm -rf /var/lib/redis/redis-cluster.conf 删除集群配置文件
rm -rf /var/lib/redis/dump.rdb 删除节点数据
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
(3) 设定集群成员关系;
CLUSTE MEET
注意:只是单纯的集群,并没有对主从复制进行配置; 测试时由于不是智能客户端,所以需
要在访问到本地时才能测试成功
set nikey hi
之后再对每个节点单独做主从就可以了

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

需要redis3.0或者更高版本
优点:
无中心的P2P Gossip分散式模式
更少的来回次数并降低延迟
自动于多个redis节点进行分片
不需要第三方软件支持协调机制
缺点
依赖于redis3.0或更高版本
没有后台界面
需要智能客户端
redis客户端必须支持redis cluster架构
较codis有更多的维护升级成本

    博客作业:
        (1) replication, sentinel,cluster
        (2) rdb, aof 

    课外实践:
        (1) codis
        (2) cerberus

听课总结:
1、从下到上的工作流程:运维工程师-->DBA-->业务流程-->应用管理;现在的大型站点如京东等,都是一个电商网站上调用了很多的其他服务,这些服务有如支付宝系统、短信发送服务等这些服务通过设计的业务流程进行相互调用,返回结果;
2、结构化数据:关系型数据库SQL;如mysql等,要数据的改变需要先进行检查约束条件是否满
足;这极大的消耗了时间;效率低下;由此引出了半结构化数据;NOSQL数据库,键值数据库,此数据结构可以进行分布式数据的按片冗余,每个机器放一部分数据,有副本。文档存储;非结构化数据使用文件系统存储数据,挂载或客户端访问,分布式文件系统需要借助于FUSE协议模块进行挂载;网络分布式文件系统。对象式系统,是将数据和元数据存放到一起的。
3、阿里倡导的去IOE计划:I指的是IBM小型机(精简指令集),O指的是Oracle,E是指EMC公
司(已经被戴尔收购了);
4、malloc:串行的内存分配器;jemalloc:并行的内存分配器,效率高,用于redis;

转载于:https://blog.51cto.com/angwoyufengtian/2126386

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值