zoukankan      html  css  js  c++  java
  • Redis的安装和部署

    一、基础知识

    1.1 redis的数据类型

    字符串(string)、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)

    1.2 redis与memcache

      1) redis可以用来做存储(storge)、而memcache是来做缓存(cache)。这个特点主要是因为其有“持久化”功能

      2)存储的数据有“结构”,对于memcache来说,存储的数据,只有一种类型--->“字符串”,而redis则可以存储字符串、链表、集合、有序集合、哈序结构

    1.3 持久化的两种方式:

      Redis将数据存储于内存中,或被配置为使用虚拟内存

      实现数据持久化的两种方式:

        1)使用截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失)

        2)使用类似mysql的方式,记录每次更新的日志

    二、安装redis

    2.1 redis各版本下载地址

    http://download.redis.io/releases/

    2.2 下载、解压并安装redis只需要执行make命令即可

     [root@db1 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
     [root@db1 ~]# tar xf redis-3.2.12.tar.gz -C /usr/local/
     [root@db1 ~]# mv /usr/local/redis-3.2.12/ /usr/local/redis
     [root@db1 ~]# cd /usr/local/redis/
     [root@db1 /usr/local/redis]# make

    2.3 将目录配置到环境变量中

     [root@db1 ~]# vim /etc/profile
     PATH=/usr/local/redis/src:$PATH
     [root@db1 ~]# source /etc/profile

    2.4 启动和关闭redis命令

     [root@db1 ~]# redis-server &
     [root@db1 ~]# redis-cli shutdown

    三、 redis常用命令及配置文件

    3.1 常用命令

     [root@db1 ~]# redis-server /etc/redis.conf                       # 指定配置文件起动服务
     [root@db1 ~]# redis-cli shutdown                                   # 关闭redis服务器
     [root@db1 ~]# redis-cli -h 127.0.0.1 -p 6379 -a password          # 连接指定的redis服务 

    3.2 键的常用用操作

    # 通用操作
    > KEYS *                                                            # 查询所有的键的名字
    > FLUSHALL # 清空所有的键

    > SET name leon # 设置key值 > GET name # 获取key值 > EXISTS name # 查询key是否存在 > EXPIRE name 30 # 以秒为单位设定生存时间,PTTL以毫秒为单位 > TTL name # 以秒为单位查看生命周期剩余时间,PTTL是以毫秒为单位 > DEL name # 删除一个key > TYPE fans # 返回键所存储值的类型> RENAME fans myfans # 修改键的名字

    # string类型
    > INCR zan # 数值型整数,每次加1,若key不存在,设置key初始值为0,增加后结果为1
    > DECR zan # 每次减1
    > decrby zan 3 # 直接n个数字

    > MSET name leon id 1 age 30 # 生成多个键值对
    > MGET name id age # 获取多个键值

    # hash类型(字典类型)类似于mysql的一种类型:hmset 表 列 值 列 值 ...
    > HMSET student id 1001 name leon age 33 gender M
    OK
    > HGETALL student
    1) "id"
    2) "1001"
    3) "name"
    4) "leonx9d"
    5) "age"
    6) "33"
    7) "gender"
    8) "M"

    # list类型
    127.0.0.1:6379> LPUSH mylist a b c 1 2 # 若key不存在,创建该键及与其关联的list,依次a b c 1 2,若list类型的key存在,则插入value中
    (integer) 5
    127.0.0.1:6379> LPUSHX mylist2 xx # 若key不存在,此命令无效,若key存在则插入value中
    (integer) 0
    127.0.0.1:6379> LINSERT mylist before a a1 # 在a的前面插入新元素a1
    (integer) 6
    127.0.0.1:6379> LINSERT mylist after c p1 # 在c的后面插入新元素p1
    (integer) 7
    127.0.0.1:6379> RPUSH mylist y z # 在链表尾部先插入z,在插入y
    (integer) 9
    127.0.0.1:6379> RPUSHX mylist p2 # 若key存在,在尾部插入p2,若key不存在则无效
    (integer) 10
    127.0.0.1:6379> RPOPLPUSH mylist mylist2 # 将mylist的尾部无素弹出,再插入到mykey2的头部(原子性操作)
    "p2"
    127.0.0.1:6379> del mylist2 # 删除已有的键
    (integer) 1

    # SET集合类
    127.0.0.1:6379> SADD mr yuwen shuxue yingyu gaoshu
    (integer) 4
    127.0.0.1:6379> SADD xs yingyu dili gaoshu jisuanji
    (integer) 4
    127.0.0.1:6379> SUNION mr xs # mr和xs的并集
    1) "gaoshu"
    2) "shuxue"
    3) "jisuanji"
    4) "dili"
    5) "yingyu"
    6) "yuwen"
    127.0.0.1:6379> SINTER mr xs # mr的xs的交集
    1) "gaoshu"
    2) "yingyu"
    127.0.0.1:6379> SDIFF mr xs # mr和xs的差集
    1) "shuxue"
    2) "yuwen"

    # sortedset(有序集合)排行榜应用场景,取TOP N操作
    127.0.0.1:6379> ZADD music 0 xxy 0 jmjmjh 0 xhn 0 qys
    (integer) 4
    127.0.0.1:6379> ZINCRBY music 999 xxy
    "999"
    127.0.0.1:6379> ZINCRBY music 888 jmjmjh
    "888"
    127.0.0.1:6379> ZINCRBY music 777 xhn
    "777"
    127.0.0.1:6379> ZINCRBY music 500 qys
    "500"
    127.0.0.1:6379> ZREVRANGE music 0 -1
    1) "xxy"
    2) "jmjmjh"
    3) "xhn"
    4) "qys"
    127.0.0.1:6379> ZREVRANGE music 0 -1 withscores
    1) "xxy"
    2) "999"
    3) "jmjmjh"
    4) "888"
    5) "xhn"
    6) "777"
    7) "qys"
    8) "500"

    # 生产者/消费者模型,发布订阅,不能进行消息堆积
    127.0.0.1:6379> SUBSCRIBE fm1024 # 订阅一个管道fm1024
    127.0.0.1:6379> PUBLISH fm1024 yimiyangguang # 向1024管道发送内容

    3.2 配置文件

    [root@db1 ~]# cp /usr/local/redis/redis.conf /etc/
    [root@db1 ~]# redis-server /etc/redis.conf
    # redis默认不是以守护进程的方式运行,设置成yes为守护进程 daemonize yes # 以守护方式运行时,指定pid的位置 pdifile /var/run/redis.pid # 配置绑定主机的IP地址 bind 192.168.7.80 127.0.0.1 # 默认监听端口为6379 port 6379 # 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 timeout 300 # 日志等级分为4级,debug,rerbose,notice和warning,默认为verbose loglevel verbose # 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null logfile "/var/log/redis/redis.log" # 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id database 16 # 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 save <seconds> <changes> Redis默认配置文件中提供了三个条件: save 900 1 save 300 10 save 60 10000 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。 # 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 rdbcompression yes # 指定本地数据库文件名,默认值为dump.rdb dbfilename dump.rdb # 指定本地数据库存放目录 dir ./ # 设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步 slaveof <masterip> <masterport> # 当master服务设置了密码保护时,slave服务连接master的密码 masterauth <master-password> # 设置redis连接密码,如果设置了密码,客户端连接的时候需要使用-a参数,若未加-a参数,进后之后再auth 123 requirepass 123 # 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 maxclients 128 # 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区 maxmemory 1024 # 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no appendonly no # 指定更新日志条件,共有3个可选值 no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值) appendfsync no # 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中 vm_enabled no # 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享 vm_swap_file /tmp/redis.swap # 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0 vm_max_momery 0 # Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值 vm_page_size 32 # 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。 vm_pages 134217728 # 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4 vm_max_thrrads 4 # 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件 include /data/redis/redis.conf

     四、redis主从复制搭建

    4.1 原理

    1. 从服务器向主服务器发送SYNC命令。

    2. 接到SYNC命令的主服务器会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有写命令。

    3. 当主服务器执行完BGSAVE命令时,它会向服务器发送RDB文件,而从服务器则会接收并载入这个文件。

    4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。

    4.2 命令传播

    在主从服务器完成同步之后,主服务器每执行一个写命令,它都会将被执行的写命令发送给从服务器执行,这个操作被称为“命令传播”

    命令传播是一个持续的过程,只要复制仍在继续,命令传播就会一直进行,使用主从服务器的状态可以一直保持一致

    4.3 PSYNC

    在Redis2.8+版本,Redis的slave在与master断开连接重连的时候,默认是使用新的PSYNC同步方法,而不是原来的SYNC,因为断线重连时,slave是包含有数据的,只是可能落后于master,所以没必要又进行一次全量同步。

    4.4 使用多实例的方法搭建主从复制

    主节点6380端口,从节点6381和6382端口

    A. 创建目录及配置文件

    [root@db1 ~]# mkdir -p /redis/638{0..2}
    
    [root@db1 ~]# cat /redis/6380/redis.conf 
    port 6380
    daemonize yes
    pidfile /redis/6380/redis.pid
    loglevel notice
    logfile /var/log/redis.log
    dir /redis/6380
    dbfilename dump.rdb
    protected-mode no
    [root@db1
    ~]# cat /redis/6381/redis.conf port 6381 daemonize yes pidfile /redis/6381/redis.pid loglevel notice logfile /var/log/redis.log dir /redis/6381 dbfilename dump.rdb protected-mode no
    [root@db1
    ~]# cat /redis/6382/redis.conf port 6382 daemonize yes pidfile /redis/6382/redis.pid loglevel notice logfile /var/log/redis.log dir /redis/6382 dbfilename dump.rdb protected-mode no

    B. 启动三个redis服务

    [root@db1 ~]# redis-server /redis/6380/redis.conf 
    [root@db1 ~]# redis-server /redis/6381/redis.conf 
    [root@db1 ~]# redis-server /redis/6382/redis.conf

    C.登录从库,设置主从复制,并查看复制详情

    [root@db1 ~]# redis-cli -p 6381
    127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
    OK
    127.0.0.1:6381> INFO replication
    
    [root@db1 ~]# redis-cli -p 6382
    127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
    OK
    127.0.0.1:6382> INFO replication

    D. 关闭主库模拟故障,主从切换

    [root@db1 ~]# redis-cli -p 6380 shutdown           # 关闭主库
    [root@db1 ~]# redis-cli -p 6381                    # 登录从库
    127.0.0.1:6381> SLAVEOF no one                     # 关闭从库主从复制,则从库自动变为主库
    OK 
    127.0.0.1:6381> INFO replication
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    # 登录6382将6381设置为主库
    [root@db1 ~]# redis-cli -p 6382
    127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
    127.0.0.1:6382> INFO replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6381
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:1
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0

    五、Redis-Sentinel(哨兵)

    Sentinel(哨岗、哨兵)是redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sntinel系统。
    其主要作用是可以监视任意多个主服务器,以及这些主服务器树下的所有从服务器,并在被监视的主服务器进入下线的状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后又新的主服务器代替已经下线的主服务器继续处理命令请求。

    其实哨兵模式存在的意义就是使redis高可用,当redis出现问题的时间可以让redis实现热切换

    A. 创建目录及配置文件

    mkdir /redis/26380
    [root@db1 ~]# cd /redis/26380/
    [root@db1 /redis/26380]# vim sentinel.conf
    port 26380
    dir /redis/26380
    sentinel monitor mymaster 127.0.0.1 6380 1           # mymaster自已定义的名字,1表示有多少个sentinel认为主库down了,就是真的down了
    sentinel down-after-milliseconds mymaster 5000       # 如果sentinel 5秒内联系不到主库,则认为主库down了    

    B. 启动redis-sentinel服务

     [root@db1 ~]# redis-sentinel /redis/26380/sentinel.conf &
    [1] 15517
     [root@db1 ~]#                 _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 3.2.12 (00000000/0) 64 bit
      .-`` .-```.  ```/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in sentinel mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26380
     |    `-._   `._    /     _.-'    |     PID: 15517
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    15517:X 27 May 17:21:02.962 # Sentinel ID is 3db4dd02a815226e6cbdbe6ac674103a733840bd
    15517:X 27 May 17:21:02.962 # +monitor master mymaster 127.0.0.1 6380 quorum 1
    15517:X 27 May 17:21:02.963 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:21:02.964 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
    redis-sentinel /redis/26380/sentinel.conf &

    C. 测试DOWN掉6380的主库

     [root@db1 ~]# redis-cli -p 6380 shutdown
    # 在主窗口能看到redis-sentinel打印的信息
    15517:X 27 May 17:27:22.296 # +sdown master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.296 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
    15517:X 27 May 17:27:22.296 # +new-epoch 1
    15517:X 27 May 17:27:22.296 # +try-failover master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.299 # +vote-for-leader 3db4dd02a815226e6cbdbe6ac674103a733840bd 1
    15517:X 27 May 17:27:22.299 # +elected-leader master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.299 # +failover-state-select-slave master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.389 # +selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.389 * +failover-state-send-slaveof-noone slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:22.465 * +failover-state-wait-promotion slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:23.320 # +promoted-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:23.320 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:23.374 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:24.327 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:24.327 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:24.428 # +failover-end master mymaster 127.0.0.1 6380
    15517:X 27 May 17:27:24.428 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6382
    15517:X 27 May 17:27:24.428 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
    15517:X 27 May 17:27:24.428 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
    15517:X 27 May 17:27:29.469 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
    redis-cli -p 6380 shutdown

    D. 当把6380启动后,会自动加入集群中

    [root@db1 ~]# redis-server /redis/6380/redis.conf 
    # 屏幕端打印信息
    15517:X 27 May 17:30:54.393 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
  • 相关阅读:
    springmvc 与 springfox-swagger2整合
    [转]TensorFlow如何进行时序预测
    CORSFilter
    [转]完美解决)Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs
    基础开发平台要求
    ssm配置
    mysql重置root密码,并设置可远程访问
    angularjs写日期组件
    看angularjs项目的一些知识记录
    AngularJS 指令的 Scope (作用域)
  • 原文地址:https://www.cnblogs.com/cyleon/p/10930997.html
Copyright © 2011-2022 走看看