zoukankan      html  css  js  c++  java
  • Redis学习笔记

    、随着访问量的上升,要使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。通过文件缓存cache来缓解数据库的压力,多台web机器通过文件缓存不能共享,大量的小文件也带来了较高的IO压力。memcached就自然成为一个好的技术产品。
    、Mysql主从读写分离。memcached只能缓解数据库读取压力。

    为何使用NoSQL? (Not Only SQL) 不仅仅是SQL,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
    随着数据,信息复杂,传统的关系型数据库已经不能适应了。NoSQL泛指非关系型数据库。
    NOSQL:易扩展,数据之间无关系,非常容易扩展。  
    大数据量高性能,多样灵活的数据类型,没有声明性查询语句,没有预定义的模式,键值对存储,列存储,文档存储。
    最终一致性:而非ACID属性
    非结构化和不可预知的数据
    CAP定理
    高性能、高可用和可伸缩性
                                                                                                                         
    高并发:线程
    高可扩:纵向扩展(一台机器内存,cpu等等) 横向扩展(多台)
    高性能:处理故障,keep-alive等

    NoSQL数据库模型简介:
    以一个电商客户、订单、订购、地址模型来对比关系型数据库和非关系型数据库。
    聚合模型:KV键值对  Bson  列族  图形

    NoSQL数据库的四大分类:
    KV键值 
    文档型数据库:MongoDB基于分布式文件存储的数据库。CounchDB
    列存储数据库:Casandra.HBase 分布式文件系统
    图关系数据库:不是放图形的,放的关系比如:朋友圈社交网络,广告推荐系统。Neo4J InfoGrid

    传统的关系数据库:
    ACID:(Atomicity原子性 事务中所有操作要么全部做完,要么都不做,事务成功的条件是事务里所有的操作都成功,只要有一个操作失败,整个事务就会失败)
     (Consistency一致性数据库要一直处于一致的状态,事务的运行不会改变数据库原本一致性的约束)
     (IsoLation独立性 所谓独立性是指并发的事务之间不会相互影响。如果一个事务要访问的数据正在被另一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响) 
    (Durability持久性 持久性是指一旦事务提交之后,它所做的修改就会永久保存在数据库上,即时宕机也不会丢失)
    NoSQL:CAP+base(base就是为了解决关系数据库强一致性引起的问题 可用性降低而提出的解决方案 他的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上的改观。。。最终一致)
    C:Consisitency(强一致性) 
    A:Availability(可用性)
    P:partition tolerance(分区容错性)
    CAP只能3进2:根据CAP原理将NoSQL数据库分成了CA原则、CP原则、AP原则

    CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性,分区容错性这三个性能需求,最多只能同时较好地满足两个
    CA:单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大
    CP:满足一致性,分区容错性的系统,通常性能不是特别高

    AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些。(用这个)

    CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等现象,所以分区容忍性是我们必须要实现的/
    我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点
    CA:传统的Oracle数据库
    AP:是大多数网站架构的选择.
    CP:Redis Mongodb  

    分布式:不同的多台服务器上面部署 不同 的服务模块(工程),它们之间通过Rpc/Rmi之间通信和调用,对外提供服务和组内协作。
    集群:不同的多台服务器上面部署 相同 的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问

    redis:高性能key/value分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库。
    redis三个特点:redis支持数据的持久化,可以将内存中的数据保存在磁盘上,重启时可以再次加载进行使用
    redis不仅仅支持简单的key-value类型数据,同时还提供list set hash等数据结构的存储
    redis支持数据的备份即 master-slave模式的数据备份。

    内存存储和持久化:redis支持异步将内存中的数据写到硬盘,同时不影响继续服务


    Redis:启动
    单进程模型处理客户端的请求,对读写事件的响应是通过epoll函数来包装。redis实际处理速度完全靠主进程的执行效率。
    默认16个数据库(见配置文件) select  index 可以切换库
    DBSIZE:查看库中键的数量。 KEYS *查看键  会多余3个

    FLUSHDB:删除当前库
    FLUSHALL:删除所有库

    统一密码管理,16个库都是同样密码,要么OK要么一起连接不上
    redis索引从0开始,默认端口是6379


    Redis数据类型:
    5大数据类型。String  Hash List  Set(hash_set)  Zset(sorted set 有序集合)
    string 是redis最基本的类型,你可以理解成与memcached一模一样的类型,一个key对应一个value
    Hash是一个string类型的field和value映射表,hash特别适合用于存储对象  map<string,obj>
    List(列表)

    http://redisdoc.com  命令大全



    Redis 的key相关的操作:
    EXISTS k1 (k1键是否存在)
    move key db(index) 将当前库key-value移到另一个库,被移除了
    expire key 秒数:为给定的key设置过期时间
    ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已经过期(过期的键值就要移除内存系统)
    type key:查看你的key是什么类型
    del key:删除某个键

    Redis 的string操作:
    set/get/del/append/strlen (对string类型的键进行操作)
    Incr/decr/Incrby/decrby :键值value一定要是数字才能进行加减
         127.0.0.1:6379> INCRBY k2 3
        (integer) 6
    setex(set with expire) key 秒数 值(setex k4 10 v4)/setnx(set if not exist)
    getrange(获取指定区间里的值,类似于between and)  获取string 的从某一位到某一位之间的值/setrange
        127.0.0.1:6379> GETRANGE k1 0 3
        "ty12"
        127.0.0.1:6379> SETRANGE k1 0 xxx
        (integer) 7
        127.0.0.1:6379> get k1
        "xxx2345"
    mset/mget/msetnx :设置多个  mset k1 v1 k2 v2 k3 v3 这些操作如果有一个不成功,就都不成功(一致性)


    Redis :List(列表) 单值多value  它是一个字符串链表,left、right都可以插入添加;如果键不存在,创建新的链表;如果键已存在,新增内容;如果值全移除,对应的键也就消失了。链表的操作无论是头尾效率极高,但如果对中间元素操作效率很低
    LPUSH list01 1 2 3 4 5
    LRANGE list01 0 -1  结果是 5 4 3 2 1
    RPUSH list02 1 2 3 4 5
    LRANGE list02 0 -1  结果 1 2 3  4 5

    LPOP list01  :5
    LPOP list02 :1

    RPOP list01: 1
    RPOP list02: 5

    lindex list01 0  : 4
    lindex list01 1  : 3

    lrem key N value:删除n个值  RPUSH list03 1 1 1     LREM list03 2 1   就还剩一个1
    ltrim key  start  end:截取指定范围的值后再赋值给key
    lset key index value: lset list01 0 x    LRANGE list01 0 -1   (x 3 2)

    Redis:set集合 单值多value
    sadd set01 1 1 2 2 3 3   
    SMEMBERS set01  : 1 2 3
    SISMEMBER set01 1:判断是否在集合中
    scard:获取集合中元素个数
    srem set01 1:删除集合中1这个元素
    srandmember key 某个整数:随机出几个数
    spop key:随机出一个数
    ***数学集合类操作***:sdiff差集  sinter交集   sunion并集
     sadd set01 1 2 3 4 5
     sadd set02 1 2 3 a b
     sdiff set01 set02
    1) "4"
    2) "5"
    sdiff set02 set01
    1) "b"
    2) "a"

    Redis:Hash(kv模式不变,但v是一个键值对)
    hset user id 11     hget user id    hset user name z3   hget user name
    hmset custermor id 11 name l4 age 26
     hmget custermor id name age
    HGETALL custermor:id 11 name l4 age 26
    HEXISTS custermor name(hexists key field 在key里面某个值的key是否存在)
    hkeys/hvals:hkeys custermor 所有的key   hvals custermor 所有的值

    Redis:zset 在set基础上加一个score值,之前set是k1 v1 v2 v3 现在zset是k1 score1 v1 score2 v2
    注意:score v是一个整体来看。zset会根据score来排序
    ZADD zset01 60 v1 70 v2 80 v3 90 v4 100 v5   
    ZRANGE zset01 0 -1
     ZRANGE zset01 0 -1 withscores
     ZRANGEBYSCORE zset01 60 90:v1 v2 v3 v4
    ZRANGEBYSCORE zset01 60 (80:V1 V2     (表示不包含
    ZRANGEBYSCORE zset01 60 90 limit 2 2: v3 v4
    zrem key 某score下对应的value值,作用是删除元素:zrem zset01 v5    ZRANGE zset01 0 -1 :v1 v2 v3 v4
    zcard zset01: 4 统计个数
    ZCOUNT zset01 60 80:3  后面跟score区间
    zrank zset01 v4:3 获取v4的下标值
    zscore zset01 v4:90 获取v4对应的分数
    ZADD zset02 90 v1 30 v2 40 v3 80 v4 10 v5
    ZRANGE zset02 0 -1 withscores:"v5" "10" "v2" "30""v3""40" "v4" "80""v1" "90"


    config get requirepass 获取登录密码
    config set requirepass "123456" 设置登录密码
    config get dir
    AUTH <PASSWORD>输入密码进行登录  auth 123456
    Redis配置文件:
    Units单位 配置大小单位,开头定义一些基本的度量单位,只支持bytes,不支持bit.对大小写不敏感
    当你需要为某个配置项指定内存大小的时候,必须要带上单位。
    Includes:假如说你有一个可用于所有的 redis server 的标准配置模板,但针对某些 server 又需要一些个性化的设置,你可以使用 include 来包含一些其他的配置文件

    redis.conf配置项说明:
    1 redis默认的不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize no
    2 当redis以守护进程方式运行的时候,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile
    pidfile  /var/run/redis_6379.pid
    3 指定redis监听端口,默认端口是6379
    port 6379
    4 绑定的主机地址
    bind 127.0.0.1
    5 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300
    6 指定日志记录级别,redis一共支持4个级别:debug verbose notice warning 默认是verbose
    loglevel verbose
    7 日志记录方式,默认是标准输出,如果配置redis为守护进程,而这里配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout
    8 设置数据库的数量,默认数据库为0号库,可以使用select 命令选择库
    database 16
    9 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合。
    save  <seconds> <changes>
    redis提供了三个条件
    save 900 1
    save 300 10
    save 60 10000
    分别表示900s内有1个key更改 300s内有10个更改 60s内有10000个keys更改就会自动触发RDB,自动进行备份

    10 指定存储本地数据库时是否压缩数据,默认是yes.redis采用LZF压缩,如果节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
    11 指定本地数据库文件名 默认值为dump.rdb
    dbfilename dump.rdb
    12 指定本地数据库存放目录
    dir ./
    13 设置当本机为slave服务时,设置master服务的ip地址和端口,在redis启动时,它会自动从master进行数据同步
    slaveof  <masterip> <masterport>
    14 当master服务设置了密码保护时,slav服务连接master的密码
    masterauth <master-password>
    15 设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过auth <password>命令提供密码,默认关闭
    requirepass foobared
    16 snapshotting快照配置文件:
    stop-writes-on-bgsave-error: 默认配置为yes 如果配置为no 表示你不在乎数据不一致或者其他手段发现和控制
    rdbcompression yes:默认启动压缩算法,对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU,可以关闭
    rdbchecksum yes:在存储了快照可以进行数据校验

    Redis RDB持久化:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话中的snapshot快照,它恢复时是将快照文件直接读到内存中。
    redis会单独创建fork一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了,再用这个临时文件替换上次持久化好了的文件。整个过程中
    主进程不需要进行任何IO操作,这确保了极高的性能。如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效。RDB的缺陷是最后一次持久化的数据可能会丢失。

    rdb保存的是dump.rdb文件.
    如何触发RDB快照:
    1、配置文件中默认的快照配置。
    2、命令save(阻塞)或者bgsave
    3、执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。
    如何恢复?
    将备份的文件dump.rdb移动到redis安装目录并启动服务即可
    优势:适合大规模数据恢复,对数据完整性和一致性要求不高
    劣势:fork的时候,内存中数据被克隆一份,大致2倍膨胀;在一定间隔时间做一次备份,所以如果意外关机,就会失去最后一次快照后的所有修改
    如何停止?动态所有停止RDB保存规则的方法:redis-cli config set save ""


    redis AOF持久化:以日志形式来记录每个写操作,将redis执行过的所有的写指令记录下来(读操作不记录)只许追加文件但不可以改写文件
    redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据恢复工作。
    APPEND ONLY MODE配置项:
    appendfsync always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    appendfsync everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失
    appendfsync no


    RDB和AOF可以共存,优先加载的是aof文件
    AOF启动/修复/恢复:正常恢复 启动:设置yes修改默认的appendonly no 改为yes 将已有数据的aof文件复制一份保存到对应目录。恢复:重启redis然后重新加载

    Rewrite:AOF采用文件追加方式,文件会越来越大,为避免出现这种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof.
    重写原理:AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename)遍历新进程的内存中数据,每条记录有一条set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件。
    触发机制:redis会记录上次重写时aof的大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发
    auto-aof-rewrite-percentage 100     auto-aof-rewrite-min-size 64mb  重写基准值和百分比

    AOF优势:
    每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    每秒同步:appendfsync everysec 每秒同步,异步操作,每秒记录,如果一秒内宕机 有数据丢失
    不同步:appendfsync no 从不同步

    AOF劣势:
    相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
    aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同


    Redis的事务:
    可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞
    一个队列中,一次性、顺序性、排他性的执行一系列命令
    行锁:
    表锁:对整张表加锁,安全一致性较好,并发性较差
    悲观锁:每次去拿数据的时候都认为别人会修改,所以每次去拿数据的时候都会上锁,这样别人想拿这个数据就会block直到拿到锁。传统的关系新数据库里边就用到了很多这种锁机制,比如行锁,表锁等 读锁写锁等都是在操作之前先上锁
    乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号。乐观锁适用于多读的应用机制,这样可以提高吞吐量。
    使用版本号实现乐观锁
    使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新的版本号。
    CAS(check and set):redis中使用check-and-set实现乐观锁。 WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

    事务三阶段:MULTI开启一个事务;入队:将多个命令入队到事务中,这些命令不会被立即执行,而是放到等待执行的事务队列里;执行:由EXEC命令触发事务


    redis的发布订阅:
    是什么:进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息


    Redis主从复制:
    1、配从不配主:
    2、从库配置:slaveof  主库ip  主库port  每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
    复制原理:slave启动成功连接到master后会发送一个sync命令
    master接到命令之后启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
    全量复制:slave 服务在接收到数据库文件后,将其存盘并加载到内存中。
    增量复制:Master继续将服务器新的所有收集到的修改命令以此传递给slave,完成同步。但是只要是重新连接Master,一次完全同步将被自动执行。

    哨兵模式(sentinel):自动以的/myredis目录下新建一个文件sentinel.conf文件(名字绝对不能错)
    配置哨兵,填写内容:sentinel monitor   被监控数据库主机的名字(自己起名字)  127.0.0.1  6379  1 
    上面最后一个数字1表示主机挂掉以后slave投票看让谁接替成为主机。
    启动哨兵:redis-sentinel  /myredis/sentinel.conf





  • 相关阅读:
    java获取年份的后两位
    jdbcTemplate的Dao层封装
    beta准备
    福大软工 · 第十一次作业
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/7929969.html
Copyright © 2011-2022 走看看