zoukankan      html  css  js  c++  java
  • redis看这一篇就够了

    redis的下载安装

    准备相关依赖

    yum install gcc
    

    下载安装包

    # 切换到存放安装包到目录
    cd /usr/local
    
    # 下载安装包
    wget  http://download.redis.io/releases/redis-4.0.10.tar.gz
    
    # 等待下载完成
    

    解压

    # 默认解压是当前目录
    tar -zxvf redis-4.0.10.tar.gz
    
    # 解压到制定目录
    tar -zxvf redis-4.0.10.tar.gz /tmp
    
    # 等待解压完成
    

    编译安装

    # 切换到redis源码目录
    cd redis-4.0.10
    
    # 编译源文件
    make && make install
    
    # 编译好后,/usr/local/redis-4.0.10/src/下面有编译好的redis指令
    

    配置文件

    # 在/etc下创建存放redis配置的目录
    mkdir /etc/redis-conf
    
    # 创建配置文件
    vim /etc/redis-conf/redis-6379.conf
    
    # 相关配置
    

    编辑配置文件

    port 6379                         # 运行在6379的redis数据库实例
    daemonize yes                     # 后台运行redis  
    pidfile /data/6379/redis.pid      # 存放redis pid的文件
    loglevel notice                   # 日志等级
    logfile "/data/6379/redis.log"    # 指定redis日志文件的生成目录
    dir /data/6379                    # 指定redis数据文件夹的目录
    protected-mode yes                # 安全模式
    requirepass   qiuxiang            # 设置redis的密码
    
    
    """
    注意:1./data/6379/这个目录要先创建,不然会报错
    """
    

    redis的启动

    启动redis服务

    # 指定用哪个配置来启动
    redis-server /etc/redis-conf/redis-6379.conf
    

    启动redis客户端

    # 根据服务配置的端口指定端口,有密码加 -a password
    redis-cli -p6370
    

    redis的基本数据类型及使用

    字符串strings

    # 设置key   set key value
    127.0.0.1:6379> set name 'aaa' 
    OK
    
    # 获取value	get key
    127.0.0.1:6379> get name    	
    "tt"
    
    # 覆盖key	set key value
    127.0.0.1:6379> set name 'bbb'  #覆盖key
    OK
    
    # 获取value	get key
    127.0.0.1:6379> get name   
    "bbb"
    
    # 追加key的string
    127.0.0.1:6379> append name 'AAA'   
    (integer) 6
    
    # 获取value
    127.0.0.1:6379> get name  
    "bbbAAA"
    
    # 设置多个键值对 mset key1 value1 key2 value2
    127.0.0.1:6379> mset name1 'aaa' name2 'bbb'    
    OK
    
    127.0.0.1:6379> get name1   
    "alex"
    127.0.0.1:6379> get name2    
    "xiaopeiqi"
    
    # 找到所有key keys partten
    127.0.0.1:6379> keys *     
    1) "name"
    2) "name1"
    3) "name2"
    
    # 获取多个value
    127.0.0.1:6379> mget name1 name2 name   
    1) "aaa"
    2) "bbb"
    3) "bbbAAA"
    
    # 删除key
    127.0.0.1:6379> del name        
    (integer) 1
    
    # 获取不存在的value,为nil
    127.0.0.1:6379> get name        
    (nil)
    
    # string类型实际上不仅仅包括字符串类型,还包括整型,浮点型。redis可对整个字符串或字符串一部分进行操作,而对于整型/浮点型可进行自增、自减操作。
    127.0.0.1:6379> set num 10    
    OK
    
    127.0.0.1:6379> get num
    "10"
    
    # 给num string 加一 INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,可以用作计数器
    127.0.0.1:6379> incr num    
    (integer) 11
    
    127.0.0.1:6379> get num  
    "11"
    
    # 递减1
    127.0.0.1:6379> decr num        
    (integer) 10
    
    # 递减1
    127.0.0.1:6379> decr num    
    (integer) 9
    127.0.0.1:6379> get num
    "9"
    
    # 待更新
    

    列表lists

    # 从左边插入lpush
    127.0.0.1:6379> lpush name3 'aaa' 'bbb' 'ccc'
    (integer) 3
    
    # 查看name3中的全部数据
    127.0.0.1:6379> lrange name3 0 -1
    1) "ccc"
    2) "bbb"
    3) "aaa"
    
    # 查看name3的长度
    llen name3
    
    # 从右边插入rpush
    127.0.0.1:6379> rpush name4 'AAA' 'BBB' 'CCC'
    (integer) 3
    
    # 查看name4中的全部数据
    127.0.0.1:6379> lrange name4 0 -1
    1) "AAA"
    2) "BBB"
    3) "CCC"
    
    # key存在则添加 dsb元素,key不存在则不作处理
    lpushx duilie2  'dsb'  
    
    
    # 截取队列的值,从索引0取到2,删除其余的元素
    ltrim duilie 0 2  
    
    # 删除左边的第一个
    lpop 
    
    # 删除右边的第一个
    rpop 
    
    # 待更新
    

    集合sets

    # 添加集合,有三个元素,不加引号就当作字符串处理
    127.0.0.1:6379> sadd age 18 19 20
    (integer) 3
    
    # 查看集合age中的数据
    127.0.0.1:6379> smembers age
    1) "18"
    2) "19"
    3) "20"
    
    # 删除age中的某个成员
    127.0.0.1:6379> srem age 20
    (integer) 1
    127.0.0.1:6379> smembers age
    1) "18"
    2) "19"
    
    # 判断该成员是否是集合age中的信息,不存在返回0,存在返回1
    127.0.0.1:6379> sismember age 220
    (integer) 0
    
    # 再把该成员添加到age集合中,后查看
    127.0.0.1:6379> sadd age 220
    (integer) 1
    127.0.0.1:6379> smembers age
    1) "18"
    2) "19"
    3) "220"
    
    
    # 添加新集合gender
    127.0.0.1:6379> sadd gender man women 220
    (integer) 2
    127.0.0.1:6379> smembers gender
    1) "women"
    2) "man"
    3) "220"
    
    
    # 找出集合gender中有的,而age中没有的元素
    127.0.0.1:6379> sdiff gender age
    1) "women"
    2) "man"
    
    # 找出age中有,而gender没有的元素
    127.0.0.1:6379> sdiff age gender
    1) "18"
    2) "19" 
    
    # 找出age和gender的交集
    127.0.0.1:6379> sinter age gender
    1) "220" 
    
    # 找出age和gender的并集
    127.0.0.1:6379> sunion age gender
    1) "women"
    2) "220"
    3) "19"
    4) "18"
    5) "man"
    

    哈希hash

    redis hash是一个string类型的field和value的映射表
    
    语法  hset key field value  
    
    # 插入一条hash数据
    127.0.0.1:6379> hset user:paul age 18
    (integer) 1
    
    # 添加一个school内容   
    127.0.0.1:6379> hset name:paul school qinghua
    (integer) 1
    
    # 获取name:paul的学校
    127.0.0.1:6379> hget name:paul school
    "qinghua"  
       
    # 获取多对name:paul的 值 
    127.0.0.1:6379> hmget name:paul gender school
    1) "man"
    2) "qinghua"
    
    # 获取name:paul的所有key
    127.0.0.1:6379> hkeys name:paul
    1) "school"
    2) "gender"
    3) "age"
    
    # 获取name:paul的所有vals
    127.0.0.1:6379> hvals name:paul
    1) "qinghua"
    2) "man"
    3) "18"
    
    # 获取name:paul的多个值
    127.0.0.1:6379> hmget name:paul age school
    1) "18"
    2) "qinghua"
    
    # 判断name:paul是否有age,不存在返回0,存在返回1 
    127.0.0.1:6379> hexists name:paul age
    (integer) 1
    
    # 新增一个字段
    127.0.0.1:6379> hset name:aaa age 220
    (integer) 1
    127.0.0.1:6379> hvals name:aaa
    1) "220"
    
    # 待更新
    

    有序集合sorted sets

    # 待更新
    

    redis持久化存储

    持久化的功能,这个功能可以将redis在内存中的的状态保存到硬盘中,它可以手动执行。也可以在redis.conf中配置,定期执行。

    Redis DataBase

    RDB持久化产生的RDB文件是一个压缩的二进制文件,这个文件被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。

    其原理是:在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot),它速度快,适合做备份,主从复制就是基于RDB持久化功能实现

    # 配置
    port 6379                        
    daemonize yes                     
    pidfile /data/6379/redis.pid     
    loglevel notice                  
    logfile "/data/6379/redis.log"    
    dir /data/6379                                       
    protected-mode yes               
    requirepass   haohaio   
    dbfilename  dbmp.rdb                        # 持久化存储的文件名
    
    save 900 1          # rdb机制  每900s 内存种有一个修改记录就自动存储
    save 300 10          # 每 300s     10个修改记录
    save 60 10000       # 每60s       10000修个记录      
    

    Append Only File

    AOF(append-only log file):记录服务器执行的所有变更操作命令(例如set del等),并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以redis协议的格式保存,新命令追加到文件末尾。

    优点:最大程度保证数据不丢失 (比RDB要好,因为RDB有可能丢失数据)

    缺点:日志记录非常大

    # 配置
    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename  dbmp.rdb
    requirepass redhat
    save 900 1
    save 300 10
    save 60  10000
    
    appendonly yes
    appendfsync  always
    
    """
    appendfsync  always    总是修改类的操作
    
    appendfsync  everysec	每秒做一次持久化
    
    appendfsync  no 依赖于系统自带的缓存大小机制           
    """
    

    AOF VS RDB

    RDB: 
        """
        优点: 1.适合备份    2.恢复大数据集时速度比AOF快
        缺点: 1.手动save   2.耗时长  3.备份时宕机数据易丢失
        """
       
    AOL:
        """
        优点: 1.追加到日志文件后面		 2.数据不易丢失
        缺点: 1.速度较慢	     		2.文件体积较大  
    

    redis主从同步

    准备

    # 准备三个redis库到配置文件
    redis-6379.conf
    redis-6380.conf
    redis-6381.conf
    
    # 配置三个配置文件的信息,同时在redis-6380.conf/redis-6381.conf添加配置,申明是6379的从库
    slaveof 127.0.0.1 6379
    
    # 在data中创建三个文件夹6379/,6380/,6381/
    

    启动三个redis服务

    # 启动这三个redis服务
    redis-server -p 6379 /opt/redis-conf/redis-6379.conf
    redis-server -p 6380 /opt/redis-conf/redis-6380.conf
    redis-server -p 6381 /opt/redis-conf/redis-6381.conf
    
    

    启动redis客户端

    # 启动6379 redis的客户端
    redis-cli -p 6379 
    

    插入数据

    # 在启动的这个redis-cli中插入数据
    set name 'aaa'
    
    # 退出
    exit
    
    # 登录其他两个redis-cli验证
    

    检测同步是否成功

    # 登录6380客户端
    redis-cli -p 6380
    
    # 检测数据是否存在
    keys *
    
    # 退出6380,登录6381检测
    

    故障时身份切换

    # kill 6379进程,模拟主库挂掉
    kill -9 进程id
    
    # 检测
    

    更改主库信息

    # 登录6380
    redis-cli -p 6380
    
    # 更改slaveof信息
    slaveof no one
    
    # 退出6380
    exit
    

    更改从库信息

    # 登录6381
    redis-cli -p 6381
    
    # 更改从库信息
    slave no one
    slave 127.0.0.1 6380
    

    查看主从库信息

    # 查看6380库的信息
    redis-cli -p 6380 info replication
    
    # 查看6381库的信息
    redis-cli -p 6381 info replication
    
    # 
    

    redis-sentinel

    准备

    # redis库的准备,同上,准备三个独立的redis库,和配置文件
    

    配置

    # redis库配置同上
    
    # 配置三个哨兵
    cd /opt/redis_conf
    vim redis-26380.conf
    vim redis-26381.conf
    vim redis-26382.conf
    
    # 写入三个配置文件
    port 26379                  # 哨兵的端口
    dir /var/redis/data/
    logfile "26379.log"
    sentinel monitor mymaster 127.0.0.1 6379 2      # 监听主库的端口
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    daemonize yes
    

    启动哨兵

    [root@qishi666 redis_conf]# redis-sentinel redis-26379.conf 
    [root@qishi666 redis_conf]# redis-sentinel redis-26380.conf 
    [root@qishi666 redis_conf]# redis-sentinel redis-26381.conf
    

    检查哨兵是否成功通信

    redis-cli -p 26379 info sentinel
    

    常见问题

    1. 如果哨兵没有正常启动,那么就在哨兵的配置文件中的ip信息检验
    2. 如果哨兵没有正常通信,那么就从主从同步开始重新配置

    redis集群

    准备节点

    vim redis-7000.conf
    vim redis-7001.conf
    vim redis-7002.conf
    vim redis-7003.conf
    vim redis-7004.conf
    vim redis-7005.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         # 集群内部的配置文件
    
    # 不同配置文件的端口不同
    

    启动节点

    redis-server redis-7000.conf
    redis-server redis-7001.conf
    redis-server redis-7002.conf
    redis-server redis-7003.conf
    redis-server redis-7004.conf
    redis-server redis-7005.conf
    

    检查

    # 随便登录一个端口,写入数据
    (error)CLUSTERDOWN Hash slot not served    
    
    # 报错,没有hash槽
    

    准备ruby环境

    # 下载ruby
    wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
        
    # 安装ruby
    tar -xvf ruby-2.3.1.tar.gz
    
    # 释放源
    ./configure --prefix=/opt/ruby/
    
    # 编译
    make && make install
    
    # 配置环境变量
    PATH=$PATH:/opt/ruby/bin
        
    # ruby准备完成
    

    安装ruby gem管理工具

    # 下载
    wget http://rubygems.org/downloads/redis-3.3.0.gem
     
    # 安装
    gem install -l redis-3.3.0.gem
    
    
    #查看gem有哪些包
    gem list -- check redis gem
    
    # 安装redis-trib.rb命令
    root@yugo /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/
    

    一键开始redis-cluster集群

    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
    
    # 集群完成
    

    查看集群状态

    redis-cli -p 7000 cluster info  
    
    redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息
    
    # 集群主节点状态
    redis-cli -p 7000 cluster nodes | grep master
    
    # 集群从节点状态
    redis-cli -p 7000 cluster nodes | grep slave
    

    测试写入数据

    #  登录集群必须使用redis-cli -c -p 7000			必须加上-c参数
    

    参考文档

    http://doc.redisfans.com/

  • 相关阅读:
    REDELK的安装和使用
    Palo Alto GlobalProtect上的PreAuth RCE
    渗透 Facebook 的思路与发现
    抓取腾讯视频MP4文件
    JS中整数的取整、取余、向上取整
    centos7安装docker
    业界难题-“跨库分页”的四种方案(转)
    centos7设置时间
    简单实现Shiro单点登录(自定义Token令牌)
    nginx 反向代理时丢失端口的解决方案(转)
  • 原文地址:https://www.cnblogs.com/oden/p/10677613.html
Copyright © 2011-2022 走看看