• Redis


    1.redis简介

    redis是一个key-value存储系统。和Memcached类似,它支持存储的values类型相对更多,包括字符串、列表、哈希散列表、集合,有序集合。

    1.1企业缓存数据库解决方案对比

    Memcached

    优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。

    缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨房数据同步困难、架构扩容复杂度高

    Redis

    优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高

    缺点:多线程读写较Memcached慢

    总结

    memcached :更加适合多线程连接,少量读写。多核的处理模式

    redis:更加适合于单线程,多次读写,所以说他更加适合时候多实例环境。单核的处理模式。

    1.2Redis特性

    高速读写,数据类型丰富

    支持持久化,多种内存分配及回收策略

    支持弱事务,消息队列、消息订阅

    支持高可用,支持分布式分片集群

    支持的储存数据类型

     {
         'k1':'hiayna',  #第一种字符串格式
         'k2':[11,22,33,44], #第二种列表格式
         'k3':{11,22,33,44}, #第三种集合格式
         'k4':{                 #第四种,字典,也可以叫做哈希散列表,
                 'n1':'xxx',
                 'n2':'fff'
            },
         'k5':{(11,1),('xxx':5)} #有序集合
     }

    2.redis单实例安装

     cd /usr/local/
     wget http://download.redis.io/releases/redis-3.2.10.tar.gz
     tar xzf redis-3.2.10.tar.gz
     mv   redis-3.2.10/   redis
     cd redis/
     make

    启动测试

     src/redis-server & 

    加入坏境变量

     :/application/redis/src

    配置文件配置

     #cp redis.conf{,.bak}
     #grep -Ev '^$|#' redis.conf.bak > redis.conf

    vim

     daemonize yes  #后台运行
     port 6379 #端口
     logfile /var/log/redis.log
     protected-mode no #关闭保护模式
     requirepass 123 #密码

    配置文件详解

    启动

     /usr/local/redis/src/redis-server  /etc/redis.conf

    3.redis常用命令

     set key velue 插入数据
     get key 获取值
     keys *         查看所有key
     type key     查看key类型
     expire key seconds(时间)   过期时间
     ttl key     查看key过期剩余时间        -2表示key已经不存在了
     persist     取消key的过期时间   -1表示key存在,没有过期时间
     
     exists key     判断key存在   存在返回1   否则0
     del keys     删除key   可以删除多个
     dbsize         计算key的数量

    4.reids字符串操作

     set   设置key
     get   获取key
     append 追加string
     mset   设置多个键值对
     mget   获取多个键值对
     del 删除key
     incr 递增+1
     decr 递减-1

    5.list双向队列用法

     lpush         从列表左边插
     rpush         从列表右边插
     lrange         获取一定长度的元素 lrange key  start stop
     ltrim               截取一定长度列表
     lpop                 删除最左边一个元素
     rpop                     删除最右边一个元素
     lpushx/rpushx               key存在则添加值,不存在不处理

    6.set集合类型,天然去重

     sadd/srem   添加/删除 元素
     sismember   判断是否为set的一个元素
     smembers   返回集合所有的成员
     sdiff             返回一个集合和其他集合的差异
     sinter           返回几个集合的交集
     sunion         返回几个集合的并集

    7.有序集合

    都是以z开头的命令

    zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据也是非常高效的。

    用来保存需要排序的数据,例如排行榜,成绩,工资等。

    实例

    利用有序集合的排序,排序学生的成绩

     127.0.0.1:6379> ZADD mid_test 70 "a"
     (integer) 1
     127.0.0.1:6379> ZADD mid_test 80 "w"
     (integer) 1
     127.0.0.1:6379> ZADD mid_test 99 "y"

    排行榜,zreverange 倒叙 zrange正序

     ZREVRANGE mid_test 0 -1 
     ZRANGE mid_test 0 -1

    8.哈希类型

     12.redis哈希类型(字典类型)
     hset 设置散列值
     hget 获取散列值
     hmset 设置多对散列值
     hmget 获取多对散列值
     hsetnx   如果散列已经存在,则不设置(防止覆盖key)
     hkeys     返回所有keys
     hvals     返回所有values
     hlen     返回散列包含域(field)的数量
     hdel     删除散列指定的域(field)
     hexists   判断是否存在

     

     key -field1  -value1 
      -field 2 - value2
      -field 3   - value3

    9.发布订阅

     PUBLISH channel msg
        将信息 message 发送到指定的频道 channel
     
     SUBSCRIBE channel [channel ...]
        订阅频道,可以同时订阅多个频道
     
     UNSUBSCRIBE [channel ...]
        取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
     PSUBSCRIBE pattern [pattern ...]
        订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所   有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有   以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
     PUNSUBSCRIBE [pattern [pattern ...]]
        退订指定的规则, 如果没有参数则会退订所有规则
     PUBSUB subcommand [argument [argument ...]]
        查看订阅与发布系统状态
     注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。

    正则发布-----匹配多个

    窗口1,启动两个redis-cli窗口,均订阅 wang*频道(channel)

     127.0.0.1:6379> PSUBSCRIBE wang*
     Reading messages... (press Ctrl-C to quit)
     1) "psubscribe"
     2) "wang*"
     3) (integer) 1
     1) "pmessage"
     2) "wang*"
     3) "wangbaoqiang"
     4) "jintian zhennanshou "

    窗口2,启动redis-cli窗口,均订阅wang*频道

     127.0.0.1:6379> PSUBSCRIBE wang*
     Reading messages... (press Ctrl-C to quit)
     1) "psubscribe"
     2) "wang*"
     3) (integer) 1
     
     
     
     1) "pmessage"
     2) "wang*"
     3) "wangbaoqiang"
     4) "jintian zhennanshou "

    窗口3,发布者消息

     [root@web02 ~]# redis-cli
     127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
     (integer) 2

    10.RDB持久化

    可以在指定的时间间隔内生成数据集的时间点快照,生成二进制文件。

    优点:速度快,适合于用做备份。

    缺点:会有数据丢失

    修改配置文件

     save 900 1
     save 300 10
     save 60 10000

    配置分别表示:

    900秒(15分钟)内有1个更改 300秒(5分钟)内有10个更改 60秒内有10000个更改 当达到以上定义的配置时间时,就将内存数据持久化到磁盘

    恢复时可以sava触发

    RDB持久化高级配置

     stop-writes-on-bgsave-error yes
     rdbcompression yes
     rdbchecksum yes
     dbfilename dump.rdb
     dir ./redis/data/6379

    以上配置分别表示:

     • 后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致
     • 导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做
     • 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
     • 导出来的rdb文件名
     • rdb的放置路径

    配置文件简单配置

         daemonize yes #后台运行 
      port 6379 #指定端口
      logfile /data/6379/redis.log #指定日志路径
      dir /data/6379 #redis的数据文件,会存放在这里
      dbfilename dbmp.rdb   #   开启rdb持久化,且指定持久化文件的名字
      bind 0.0.0.0
      save 900 1  #定义触发rdb持久化的时间机制
      save 300 10
      save 60  10000

     

    11.AOF持久化

    记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。

    AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

    优点:可以最大程度保证数据不丢

    缺点:日志记录量级比较大

     appendonly yes
     appendfsync always
     appendfsync everysec
     appendfsync no

    配置分别表示:

     • 是否打开aof日志功能
     • 每1个命令,都立即同步到aof
     • 每秒写1次
     • 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.

    配置文件中加入即可

     appendonly yes
     appendfsync everysec

     

    AOF持久化高级配置

     no-appendfsync-on-rewrite yes/no
     auto-aof-rewrite-percentage 100
     auto-aof-rewrite-min-size 64mb

    配置分别表示:

     • 正在导出rdb快照的过程中,要不要停止同步aof
     • aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
     • aof文件,至少超过64M时,重写

    简单配置

     daemonize yes
     port 6379
     logfile /data/6379/redis.log
     dir /data/6379
     appendonly yes #开启aof的俩参数
     appendfsync everysec     #aof的持久化机制

     

    12.如何使用哪种持久化方式

    一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。

    如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

    有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug

    13.不重启切换RDB为AOF

    1.准备一个rdb的redis数据库-切换之前必须备份数据防止丢失 2.通过命令,直接切换aof

     127.0.0.1:6379> CONFIG set appendonly yes   #开启AOF功能
     OK
     127.0.0.1:6379> CONFIG SET save "" #关闭RDB功能
     OK

     

    3.正确情况下,会生成aof日志文件了,此时命令操作都是在aof里面了

    4.还得修改配置文件,以上命令只是临时生效,改完以后,下次指定配置文件启动,就一直是aof了

         port 6379
      logfile /data/6379/redis.log
      dir /data/6379
      dbfilename dbmp.rdb
      save 900 1
      save 300 10
      save 60  10000
      daemonize yes
      appendonly yes  
      appendfsync everysec    

     

    14.AOF文件损坏了怎么办?

    服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:

     为现有的 AOF 文件创建一个备份。
     使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复: $ redis-check-aof –fix
     使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。(可选)
     重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复

    15.备份

    写一个crob 任务 将RDB文件定时备份到其他文件中

    16.redis慢日志查询

    Slow log 是 Redis 用来记录查询执行时间的日志系统。

    slow log 保存在内存里面,读写速度非常快

    可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改

     slowlog-log-slower-than 10000 超过多少微秒
     CONFIG SET slowlog-log-slower-than 100
     CONFIG SET slowlog-max-len 1000 保存多少条慢日志
     CONFIG GET slow*
     SLOWLOG GET
     SLOWLOG RESET

    17.redis主从复制

    #redis的主从复制,可以基于redis的多实例完成,基于不同的端口,就能运行各个独立的redis数据库

    #redis的主从复制,做一个一主三从的实验

    mredis.conf #主库的配置文件 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no

     

    准备一个从库s1redis.conf port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了

    准备第二个从库s2redis.conf port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了

    #创建三个数据库的数据文件夹 mkdir -p /data/{6380,6381,6382}

    #分别启动三个数据库实例 [root@s24_linux myredis]# redis-server mredis.conf [root@s24_linux myredis]# redis-server s1redis.conf [root@s24_linux myredis]# redis-server s2redis.conf [root@s24_linux myredis]# ps -ef|grep redis root 78545 1 0 10:54 ? 00:00:00 redis-server *:6380 root 78550 1 0 10:54 ? 00:00:00 redis-server *:6381 root 78555 1 0 10:54 ? 00:00:00 redis-server *:6382

    #分别查看三个redis数据库的库信息 [root@s24_linux myredis]# redis-cli -p 6380 info replication [root@s24_linux myredis]# redis-cli -p 6381 info replication [root@s24_linux myredis]# redis-cli -p 6382 info replication

    #通过命令,临时给三个数据库添加主从复制信息 redis-cli -p 6381 slaveof 127.0.0.1 6380 #给6381指定为6380的从库 redis-cli -p 6381 info replication #查看6381的复制信息 redis-cli -p 6380 info replication #查看6380的复制信息 redis-cli -p 6382 slaveof 127.0.0.1 6380 #给6382设置为6380的从库 redis-cli -p 6380 info replication

    #进行主从复制读写演示 6380可读可写 6381 6382只读,不给写

    #杀死从库,无所谓,再把从库重新启动,或者再创建一个新的就行

    #杀死主库,必须得手动解决故障,吧从库切换为新的主库,继续主从复制

    只需要剔除当前自己的从的身份即可,剔除6381的从的身份 127.0.0.1:6381> slaveof no one OK

    #再次启动一个新的从库,以6381为主库即可

     

    #redis的哨兵配置,能够自动的解决主从切换故障

    1.准备三个redis数据库实例,配置好,主从关系

     [root@s24_linux myredis]# cat mredis.conf 
     port 6380
     daemonize yes
     pidfile /data/6380/redis.pid
     loglevel notice
     logfile "/data/6380/redis.log"
     dbfilename dump.rdb
     dir /data/6380
     protected-mode no
     [root@s24_linux myredis]# cat s1redis.conf 
     
     port 6381
     daemonize yes
     pidfile /data/6381/redis.pid
     loglevel notice
     logfile "/data/6381/redis.log"
     dbfilename dump.rdb
     dir /data/6381
     protected-mode no
     slaveof 127.0.0.1 6380
     [root@s24_linux myredis]# cat s2redis.conf 
     port 6382
     daemonize yes
     pidfile /data/6382/redis.pid
     loglevel notice
     logfile "/data/6382/redis.log"
     dbfilename dump.rdb
     dir /data/6382
     protected-mode no
     slaveof 127.0.0.1 6380

    分别启动三个redis数据库节点

    2.准备三个哨兵sentinel(哨兵)的配置文件,三个哨兵配置文件,仅仅是端口的不同,默认是26379,26380,26381 s24shaobing.conf port 26379 dir /var/redis/data/ logfile "26379.log"

     // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点
     // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
     // mymaster是主节点的别名
     sentinel monitor s24ms 127.0.0.1 6380 2
     
     //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
     sentinel down-after-milliseconds s24ms 30000
     
     //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
     原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
     sentinel parallel-syncs s24ms 1
     
     //故障转移超时时间为180000毫秒
     sentinel failover-timeout s24ms 180000
     //后台运行哨兵
     daemonize yes

    s24shaobing1.conf s24shaobing2.conf #快速生成2个配置文件 [root@s24_linux myredis]# sed 's/26379/26380/g' s24shaobing.conf > s24shaobing1.conf [root@s24_linux myredis]# sed 's/26379/26381/g' s24shaobing.conf > s24shaobing2.conf #创建数据文件夹 mkdir -p /var/redis/data/

     

    3.分别启动三个哨兵进程 [root@s24_linux myredis]# ps -ef|grep redis root 78952 1 0 11:42 ? 00:00:00 redis-server *:6380 root 78957 1 0 11:42 ? 00:00:00 redis-server *:6381 root 78963 1 0 11:42 ? 00:00:00 redis-server *:6382 root 79051 1 0 11:51 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 79056 1 0 11:51 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 79061 1 0 11:51 ? 00:00:00 redis-sentinel *:26381 [sentinel]

    4.干掉master主库,哨兵会自动的选举一个从库为新的主库

    5.将挂掉的主库,重新启动,查看复制信息

     

     

     

    #redis-cluster集群的搭建

    1.准备6个数据库节点,搭建三主三从的数据库主从机群,6个节点,仅仅是端口的不同 指定7000~7005 6个节点 touch redis-7000.conf

    port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #开启集群模式 cluster-config-file nodes-7000.conf  #集群内部的配置文件

    touch redis-7001.conf touch redis-7002.conf touch redis-7003.conf touch redis-7004.conf touch redis-7005.conf

    sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf

    分别启动6个redis节点

     

    2.配置ruby环境,一键创建redis机群slot槽位分配 yum直接安装ruby解释器 yum install ruby -y 下载ruby操作redis的模块 wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem 一键开启redis集群槽位分配,先找一下这个ruby工具在哪 find / -name redis-trib.rb

     /s24fuxi/redis-4.0.10/src/redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

    3.开启redis集群功能,向集群中写入数据,查看数据重定向

     以集群模式登陆redis-cluster ,写入数据

     

     

    转载 https://www.cnblogs.com/pyyu/p/9843950.html

  • 相关阅读:
    Go 打印出结构化结构体
    GOPROXY设置
    python判断链表是否有环
    单链表python和go的代码
    mongo索引
    python修改srt字幕的时间轴
    python各个版本的排序
    mac使用python识别图形验证码
    selenium运行js代码笔记
    布隆过滤器
  • 原文地址:https://www.cnblogs.com/zdqc/p/9510301.html
Copyright © 2020-2023  润新知