• redis


    day 7 下午

    redis学习

    mysql 关系型数据库
    非关系型数据库 redis mongodb
    nosql 不仅仅是sql

    数据持久化,可以将数据存储到磁盘上,以文件形式存储

    redis是内存性的数据库,读写是非常快的
    缺点是:断电释放内存数据,redis数据丢失,redis进程挂掉,数据丢失,redis提供了持久化机制

    redis的安装方式
    1.yum install redis -y
    rpm

    源码编译(在选择编译的时候,注意删掉之前的yum安装的)
    1.yum remove redis -y

    2.下载redis的源代码包
    wget http://download.redis.io/releases/redis-4.0.10.tar.gz

    3.解压缩源码包
    编译三部曲:

    (此redis压缩包,已经提供好了makefile,只需要执行,编译的第二,第三曲)

    2.执行gcc的make指令,执行makefile文件
    make
    3.开始安装
    make install

    4.会安装在当前的源码包中的src目录,且帮你配置好了PATH变量
    在src下:通过redis-加上tab补全查看所有命令

    redis-benchmark redis-check-rdb redis-sentinel
    redis-check-aof redis-cli redis-server

    5.制定一个安装可靠的redis数据库,如下功能通过配置文件定义
    1.更改端口
    2.设置密码
    3.开启redis的安全启动模式

    默认直接输入redis-server可以启动服务端,默认端口6379,且没有密码
    redis-cli登录

    redis.conf 内容如下,有多少参数,就有多少功能,

    bind 192.168.16.142    #绑定redis启动的地址
    protected-mode yes		#开启redis的安全模式,必须输入密码才可以远程登录
    port 6380			 #指定redis的端口  
    daemonize no			#让redis以守护进程方式在后台运行,不占用窗口
    pidfile /var/run/redis_6379.pid   #记录redis的进程id号的文件
    loglevel notice    		#日志运行等级 .严重级别,警告级别,debug调试界别.....logging
    requirepass haohaio     #设置redis的密码,是 haohaio
    
    指定配置文件的启动方式
    redis-server  s20redis.conf  
    
    #此时登录redis必须加上参数了,并且登录了之后,必须输入密码才可以使用 
    redis-cli -p 6380 -h 192.168.16.142
    

    	# 在另一个窗口redis-cli -h 192.168.230.132	
    	# (error) NOAUTH Authentication required.
    	#auth haohaio   #认证才可以操作  
    
    持久化 touch s20rdb.conf
    	daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename  dbmp.rdb
    bind 127.0.0.1
    
    save 900 1
    save 300 10
    save 60  10000
    
    touch s20aof.conf
    daemonize yes
    port 6379   
    logfile /data/6379/redis.log
    dir /data/6379	
    appendonly yes
    appendfsync everysec		 #每秒做一次持久化
    

    学习redis的数据类型使用

    1.常用redis的公共命令

    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的数量
    


    2.学习string类型的操作

    通过set设置的就是string类型的key -value

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

    list类型,双向队列

    dic1={
    'k1':{"k2":"v2"}
    }

    dic1[k1][k2]

    redis的发布订阅

    QQ群

    详细命令看博客

    1 开多个窗口 redis-cli

    PUBLISH football dafdfas		(integer) 2
    SUBSCRIBE football music 	# channel 订阅多个
    SUBSCRIBE football 
    

    2

     PUBLISH python20 dafdfas		(integer) 2
    PUBLISH python19 dafdfas		(integer) 1
    
     PSUBSCRIBE python20
    PSUBSCRIBE python*
    

    redis的持久化机制

    分为aof和rdb两种,具体看博客

    在不重启redis的情况下,切换rdb中的数据,到aof中的操作

    环境准备
    1.配置一个rdb的redis服务端
    s20rdb.conf内容如下

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

    两种都有的情况下 ,只执行aof的数据 删了aof dbmp里数据也没了

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

    2.基于这个文件启动redis,支持rdb的数据库
    redis-server s20rdb.conf

    3.登录redis设置key,然后手动触发save,生成rdb数据文件

    4.通过登录redis,两条命令,切换为aof持久化方式
    127.0.0.1:6379>
    127.0.0.1:6379> CONFIG set appendonly yes
    OK
    127.0.0.1:6379> CONFIG SET save ""
    OK

    5.第四部的操作,仅仅是临时生效(下一回登录s20rdb.conf还是原来),还得修改配置文件,保证下次重启,也得用aof进行持久化

    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    bind  127.0.0.1
    appendonly yes
    appendfsync always
    

    save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
    save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
    save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

    redis是单线程的,由c编写

    redis的主从复制

    -1 建一个文件夹 /opt/sd

    0 建存数据的文件夹
    一条命令(整明白): mkdir -p /var/redis/data/{6379,6380,6381}

    1.redis和mysql都是支持多实例功能,基于配置文件区分,就是一个数据库单独的实例

    环境准备,一个6379的redis(master),和一个6380的redis(slave)

    分别准备2个配置文件,内容如下
    redis-6379.conf

    port 6379
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/var/redis/data/6379"
    

    redis-6380.conf (从)

    port 6380
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/6380" 
    slaveof 127.0.0.1 6379 
    

    redis-6381.conf (从)

    port 6381
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/6381" 
    slaveof 127.0.0.1 6379
    

    2.分别启动2个redis实例

    redis-server redis-6381.conf

    !ps 查看上一条,是进程
    3.登录数据库,查看两人之间的关系

    查看80的身份信息:
    redis-cli -p 6380 info replication
    role:slave
    master_port:6379
    

    登录6379数据库,输入如下命令
    127.0.0.1:6379> info replication

    6380数据库查看如下关系
    [root@s20 smredis]# redis-cli -p 6380 info replication

    4.数据读写查看
    在6379中是可以读写的
    redis-cli -p 6379 set name5 haoxiangxiake

    redis-cli -p 6380 get name5

    5.主从复制故障恢复
    从库挂了无所谓
    主库挂了得立即恢复主库,或者将从库切换为主库,继续工作

    -.实验步骤
    1.分别启动 6379  6380 6381 三个数据库实例,建立好主从关系
    
    2.杀死6379主库,此时6380 6381 群龙无首
    
    3.选择让6381为新的主库,就要去除6381的从的身份
    redis-cli -p 6381 slaveof  no one 
    #查看此时6381的身份
    redis-cli -p 6381 info replication
    
    4.此时将6380的主人改为6381
    redis-cli -p 6380 slaveof 127.0.0.1 6381
    

    6.redis的哨兵,自动的主从故障切换
    配置步骤

    1.环境准备,准备3个redis数据库实例,分别是 6379 6380 6381
    redis-6379.conf
    port 6379
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/var/redis/data/6379"

    redis-6380.conf
    port 6380
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/6380"
    slaveof 127.0.0.1 6379

    redis-6381.conf
    port 6381
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/6381"
    slaveof 127.0.0.1 6379

    2.分别启动三个redis数据库实例
    1106 redis-server redis-6379.conf
    1107 redis-server redis-6380.conf
    1108 redis-server redis-6381.conf

    3.准备三个redis-sentinel哨兵的配置文件

    redis-sentinel-26379.conf

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

    如下26380和26381的配置文件,仅仅是端口的不同,可以快速生成

    一条命令 生成

    sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
    
    追加: echo 'daemonize yes' >> redis-26381.conf
    

    redis-sentinel-26380.conf
    redis-sentinel-26381.conf

    生成命令如下

    1119 sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
    1121 sed "s/26379/26381/g" redis-26379.conf > redis-26381.conf

    4.分别运行三个哨兵进程
    (保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)

    创建哨兵的数据文件夹

    1126 mkdir -p /var/redis/data/26380
    1127 mkdir -p /var/redis/data/26379
    1128 mkdir -p /var/redis/data/26381

    分别启动三个哨兵

    1134 redis-sentinel redis-26379.conf
    1137 redis-sentinel redis-26380.conf
    1138 redis-sentinel redis-26381.conf

    5.检查redis的哨兵状态
    redis-cli -p 26379 info sentinel

    查看到如下参数,哨兵就正确了

    master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

    6.杀死主库,检查主从状态,是否会切换

  • 相关阅读:
    [LintCode] Flatten Nested List Iterator 压平嵌套链表迭代器
    [LintCode] Reverse Pairs 翻转对
    [CareerCup] 17.9 Word Frequency in a Book 书中单词频率
    [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
    [CareerCup] 17.7 English Phrase Describe Integer 英文单词表示数字
    [LeetCode] Reverse Vowels of a String 翻转字符串中的元音字母
    [CareerCup] 17.6 Sort Array 排列数组
    [LeetCode] 344. Reverse String 翻转字符串
    [CareerCup] 17.5 Game of Master Mind 猜字游戏
    [CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值
  • 原文地址:https://www.cnblogs.com/Doner/p/11135241.html
Copyright © 2020-2023  润新知