欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

redis的安装与使用,发布订阅与集群,安全介绍

程序员文章站 2022-08-06 22:13:53
redis redis的安装一 安装的准备 首先得买一个服务器(我买的阿里云ecs轻量级); 再下载远程客户端(我用的Xshell,Xftp); 打开Xftp将下载好得redis压缩包传输Xftp中,在进入Xshell中Linux命令安装; rides安装 下载地址:https://redis.io ......

redis
    redis的安装一
        安装的准备
            首先得买一个服务器(我买的阿里云ecs轻量级);
            再下载远程客户端(我用的xshell,xftp);
            打开xftp将下载好得redis压缩包传输xftp中,在进入xshell中linux命令安装;
        rides安装
            下载地址:https://redis.io/
            安装:
                1,linux进入redis所在目录;
                2,执行命令:tar -zxvf redis-3.2.10.tar.gz        //个人建议将软件安装在/usr/local目录下,执行命令:tar -zxvf redis-3.2.10.tar.gz -c /usr/local/redis,当然解压完了move也可以;
                3,进入解压后的目录进行编译,cd redis-3.2.10. 执行命令:make    ,make命令后可能报错,如果报错,解决如下:
                    报错一:那可能是没有gcc (linux下的一个编译器,是c,c++程序的编译器)
                        使用命令yum进行安装,yum -y install gcc
                    报错二:error:jemalloc/jemalloc.h:no such file or disectoty    //可能找不到c语言中的头文件
                        执行 make malloc = libc
                4,安装完gcc之后,make distclean 清理下上次make后产生的文件,再make

            redis启动:
                方式一:前端启动模式,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,而且当前命令窗口处于一种阻塞状态,想要执行其它命令需要重新开启一个新命令窗口
                    执行命令:cd /usr/local/redis/redis-3.2.10/bin
                    再执行命令:./redis-server
                    //ps -f | grep redis     查看进程        kill pid(进程号)        杀掉进程
            
                方式二:后台启动模式,./redis-server &        //建议后台启动
                             后台启动并输出日志到 nohup.out 文件:nohup /usr/local/redis-3.2.10/src/-server &
                             再回车确定
                             ls查看文件会发现出现一个nohup.out文件
                             cat nohup.out   就会将日志打在此文件中
            redis关闭:./redis -cli shutdown
    
    redis的安装二
        https://www.jb51.net/article/146751.htm

    redis客户端
        redis命令行客户端:redis -cli (./redis -cli -h 127.0.0.1 -p 6379)    //redis自带基于命令行得redis客户端

        redis desktop manager(远程客户端):                //要下载
            远程连接redis需要修改redis主目录下的redis.conf配置文件:
                1,bind ip 绑定ip注释掉
                2,protected-mode yes 保护模式改为no;
            可以进入目录配置文件改,也可以命令改,命令如下:
                进入目录:cd /usr /local /redis-3.2.10 /
                进入文件:vim redis.conf  回车确定
                注释bind ip;protected-mode yes 保护模式改为no;回车确定
                ps -ef | grep redis    //查看进程
                kill  pid        //杀掉当前进程再重启
                nohup /usr/local/redis-3.2.10/src/redis - server  /usr/local/redis-3.2.10/redis.conf &        //重启进程并打出日志文件
            进入下载好的远程客户端:
                connection 连接自己的远程服务器地址;        //这里一定要填自己的远程ip,不能填本地
                ok

        phpredisadmin(远程客户端):
            需要安装php运行环境
            php开发自行下载xampp

        redis编程客户端:
            redis的java客户端:
                jedis:
                    jedis源码:https://github.com/xetorhio/jedis
                    api文档:http://xetorthio.geihub.io/jedis/

    redis的使用
        基础命令:
            1, ./redis -cli    //启动
                输入ping,redis会返回pong表示服务运行正常
            2,redis默认16个库,但是可以再redis.conf中修改。        //可进文件改,也可命令改
                进入文件:vim redis.conf  回车确定
                找到databases 16                //可改
            3,redis默认使用0号库,select db                //切换库    例:select 2
            4,删除
                删除所有库数据 : flushall
                删除当前库数据 : flushdb
            5,获取redis的所有配置 :config get *
            6,退出连接:exit / quit
            7,查看当前数据库中key的数目:dbsize
            8,查看redis服务器的统计信息:info

        命令与使用文档:
            命令:
                key命令
                字符串类型 :string
                哈希类型 :hash
                列表类型 :list
                集合类型 :set
                有序集合类型 :zset(sorted set)
            文档:
                中文:https://redis.io/commands
                英文:https://redisdoc.com/
        redis常用命令 :
            keys *                //列出所有key
            exists key              //检查某个key是否存在
            set key value            //存入key值    例:set k1  v1
            move key db             //将当前的key移动到给定的库db中,例:move k1 2
            expire key seconds            //设置key值过期时间        例:expire k1 8
            ttl key (time to live)            //查看是否过期,-1永不过期,-2 已过期或key不存在
            type key                //查看key所存储值得类型
            del key                //删除key
        redis更多使用方法请移步菜鸟教程:https://www.runoob.com/redis/redis-install.html

        redis5中数据类型命令
            字符串类型 string(可以存储任何形式的字符串)
                set key value            将字符串值value设置到key中
                get key                获取key中的value
                incr key                将key中存储的数字加一,若key不存在,key得值先被初始化为0,再执行incr操作(只对存储的数字有用)
                decr key                将key中存储的数字减一,若key不存在,key得值先被初始化为0,再执行incr操作(只对存储的数字有用)
                setex key seconds value        设置key值及过期时间(set expire)
                setnx key value            给无值或者不存在的key给值,有值则不设置值
                getset key value            给key设置新值并返回旧值
                strlen key                返回key所存储字符串长度
                append key value            若key存在且为字符串,则追加(跟jquery一样);key不存在将追加的设为新值
                incrby key increment            将key所存储的值加上增质量(自定义量),若key不存在,则key的值初始化为0,再执行incrby
                decrby key increment        将key所存储的值减去增质量(自定义量),若key不存在,则key的值初始化为0,再执行incrby
                getrange key start end        截取key中字符串值,从star开始,end结束(类似substring)
                setrang key offset value        从字符串指定位置替换value,例:k1值为helloworld,执行setrang k1  5(第五个位置) redis  则输出:helloredis
                mset key1 value key2 value2 ...        同时设置多个key-value
                mget key1 key2 keyn ...        同时获取多个key-value
                msetnx key1 value key2 value2 ...    同时设置多个key-value,当且仅当所有给定key都不存在时才能设置成功,有一个key存在值都不行

            哈希类型hash(string类型的映射,适合存储对象)
                hset key field value            将哈希表key中的域field的值设置为value    例:hset k1 id 1001
                hget key field            取值        例:hget k1 id
                hmset key1 field value ...        同时设置多个值    例:hmset k2 id 1002 name likauhua age 10 pwd 123 ...
                hmget key field ...            同时取多个值    例:hmget k2 id name age
                hgetall key            查询哈希表key里所有值
                hdel key                删除哈希表key中一个或多个指定值field
                hkeys key                查看哈希表key中所有field域(查询所有字段)
                hvals key                查看哈希表key中所有域的值(字段所对应的值)
                type key                查案key存储的数据类型
                hlen key                查看哈希表key中域field的个数(字段个数)
                hexists key            查看哈希表key中,给定域field是否存在(字段是否存在还)例:hexists k1 id
                hincrby key field increment        为哈希表key中的域的值加上增量        例:hincrby k1 id 5
                hincrbyfloat key field increment    为哈希表key中的域的值加浮点数上增量    
                hsetnx key field value        将哈希表key中的域field的值设为value,当且仅当field不存在时才设置,否则不设置    例:hsetnx k1 age(这个字段不存在时才能设置)  18

            列表类型list(简单的字符串列表,按照插入排序,元素可重复)
                lpush key value1 value2 value3        将一个或多个值value插入到列表key的表头(最左边)    例:lpush k1 1 2 3 4 5
                rpush key    value1 value2 value3        将一个或多个值value插入到列表key的表尾(最右边)    例:lpush k1 7 8 9 10 11
                lrange key start stop            获取表key中指定区间内元素,0为第一元素,-1为倒数第一元素。 例:lrange key 0 -1    (区间所有元素)
                lpop key                从左边获取列表key的第一个元素,并将该元素移除
                rpop key                从右边获取列表key的第一个元素,并将该元素移除
                lindex key index            获取列表key中下标为指定index元素    例:lindex key 3
                llen key                获取列表key的长度
                lrem key count value            从左至右删除列表中指定个数与指定value值相等的value    例:lrem k1 1 4    4这个元素被删除了
                 ltrim key start stop            删除指定区域外的元素
                rpoplpush source destination        将列表source中的尾元素插入到列表destination中,作为头元素    例:rpoplpush k1 k2    (将本列表尾元素放另一个列表当头元素)
                lset key index value            将列表key下标为index的元素设为value    例:lset k1 0 222(将0下标下的元素替换成22)
                linsert key before|after pivot value    将值插入到指定值之前或之后    例:linsert k1 before  5 100(将k1域内值5前插入100,元素非下标)


            集合类型 set(redis的set时string类型的无序集合,成员唯一,集合中不重复)
                sadd key member member ...        将一个或多个member元素加入集合key中,已存在集合的member元素不加入      例:sadd k1 1 2 3 4
                smembers key             获取聚合key中所有元素
                sismember key member        判断member是否是集合key的成员    例:sismember k1  1
                scard  key                获取聚合中元素个数
                srem key member            删除聚合中一个或多个元素(指定删除某个元素)    例:srem k1 2
                srandmemner key [count]        随机返回集合中一个或多个元素  count 是返回的个数            
                spop key                随机删除集合中的一个元素
                smove source destination member    将member元素从一个集合移到另一个集合    例:smove k1 k2 2(将元素2从k1 移到k2)

            有序聚合zset(sorted set):跟set差不多,不同的是zset得每个元素都会关联一个分数(分数可重复),redis通过分数来为集合中的成员进行排序
                zadd key score member        将一个或多个member元素及其score值加入到有序集合        例:zadd k1 100 likaihua 90 likaihua2
                zrange key start stop        获取有序集合key中,指定区间的成员,按score大小排序    例:zrange k1 0 -1
                zrevrange key start stop        获取有序集合key中,指定区间的成员,按score小大排序    例:zrange k1 0 -1
                zrem key member            删除有序集合key中得一个或多个成员        例:zrem k1 likaihua
                zcard key                获取集合个数
                zrank key member            获取有序集合key中,成员member排名,有序集成员按score值从小到大排列    例:zrank k1 likaihua
                zrevrank key member        获取有序集合key中,成员member排名,有序集成员按score值从大到小排列
                zrangebyscore key start stop        获取有序集合key中,所有score值介于min和max之间的成员    例:zrange k1 100 90
                zrevrangebyscore key start stop    获取有序集合key中,所有score值介于max和min之间的成员
                zcount key min max            获取有序集合key中,所有score值介于min和max之间的成员个数    例:zcount k1 10 100
                score(分数)    
                
            table键        补全命令
            官方命令文档:redisdoc.com
        

    redis的发布和订阅
        发布订阅:redis发布订阅(pub/sub)是一种消息通信模式;也称为生产者模式,实现消息队列的一种方式
        消息队列三要素:1,生产者(producer)2,消费者(consumer)3,消息服务(broker)
        三者关系:1 (producer)——>3 (redis在次充当consumer)——>2(consumer)
        一个消息发布者,多个消息订阅者
        
        命令实现:1,开启4个redis客户端,三个作为消息订阅者,一个作为消息发布者:./redis-cli
            2,消息订阅者:subscribe channel
                // 如果是订阅匹配模式:psubscribe chan *    表示匹配以chan开头的频道主题都能拿到
            3,消息发布者:publish channel message    
                //就跟扶贫一样,国家把钱给**,*(*===消息发布者)发钱,带有精准扶贫这个标识人就可以凭此去拿钱(贫困户==消息订阅者)

        jedis编程实现:
            订阅者:
                public void onmessage(string channel, string message){        //封装的回调函数
                    system.out.println("频道"+channel+"发布了消息"+message);
                }

                public static void main (string [ ] arg){
                    jedis jedis = new jedis ("192.168.0.1" ,6379);    //连接redis
                    sub sub = new sub();            //创建订阅者对象
                    jedis.subscribe(sub, "channel");
                }
            发布者:
                public static void main (string [ ] arg){
                    jedis jedis = new jedis ("192.168.0.1" ,6379);    //连接redis
                    jedis.publish("channel", "hello world");        //发布消息
                    jedis.close();                
                }

        redis事务(redis中的事务是一组命令集合,至少两条以上命令,redis事务保证这些命令被执行时不会被其他操作打断)
            正常流程:1,multi:该命令告诉redis接下来的命令暂不执行,将其暂存(开启事务)
                2,sadd "user1" 第一天命令进入等待队列
                3,sadd "user2"第二条命令进入等待队列
                4,exec 告知redis执行暂存的命令(提交事务)    //放弃事务:discard,不执行,事务放弃
                    
                    //就跟坐客车(事务 == 大客车)一样,单个不走,包车不准。等人多了,包圆儿了一块走。
                命令示例:
                    multi
                    set  k2(key)  v2(value)
                    set  k3(key)  v3(value)
                    exec
                也存在异常和例外情况:1,语法错误,事务回滚不执行
                            2,语法正常,逻辑错误,例如incr给一个字符加1,或者不给值,能够入队,但提交事务后会显示该语句存在错误
                
            
            锁:
                悲观锁:当有人读取数据时会被认为要更改数据,因此每次在读取数据时会先上锁,直到这个线程拿到锁为止。(本线程结束后其他线程才能进来读取数据。就跟上厕所似的,进去先锁门,自己拉完了别人才能进来拉)
                
                乐观锁:当有人读取数据时不会被认为更改数据,不上锁。但在更新时会判断在此期间是否有人更改数据,一般用版本号机制进行判断。

                    悲观锁的判断机制:大多数基于数据版本号机制实现。版本号?:即为数据增加一个版本标识。
                                     一般通过为数据库表添加“version”字段来实现读取数据时,也将此版本一同读出。之后来读取数据的人提交数据更新时,会对此版本号加1。
                                     此时提交数据的版本号与数据库表对应记录的当前版本号对比,若提交数据版本号大于数据库表当前版本号,则准予更新(数据库当前版本号只会更新一次)
                    
                        示例:
                            1,a操作员将用户数据读取(version=1),进行修改操作。
                            2,b操作员将用户数据读取(version=1),进行修改操作。
                            3,a完成操作,提交数据时(version +1 =2),提交更新。此时提交数据版本号大于数据库记录的当前版本号,准许提交。
                            4,b完成操作,提交数据时(version +1 =2),提交更新。但是此时的数据库记录的版本号已经被a提交数据后更新为2了,所以b提交的版本号不大于数据库记录的当前版本号,则不准予提交数据更新。
                            因为数据库记录的版本号只更新一次,谁快先更新了,版本号就变了,必须等上一个线程完成后再进去操作。(就争媳妇似的的,谁下手快生了娃,谁就稳了)

                    redis的watch机制实现乐观锁(监视一个或多个key,如果在事务exec执行之前这个key被其他命令更改,那么该事务将会被打断)
                        命令如下:
                            set k1 1                //设k1为1
                            watch k1                //监视k1
                            set k1 2                //k1值在被监视时被更改为2,另外人开客户端更改也一样
                            multi                //开始事务
                            set k1 3                //将k1值改为3
                            exec                //提交事务
                            输出null,事务被放弃。检测到k1也被更改为2,不再是1了。
                            (就像本来你跟你女朋友快要结婚了,但是结婚前一天在你爸妈的眼皮子底下决定跟别人私奔,你爹妈知道了不想让你背锅,在你们结婚时强行拆散,唉,真惨。)
                            
        redis的持久化机制
            持久化概述:持久化==存储,就一直存着可以。
            redis持久化:redis数据存储在内存中,内存是瞬时的,如果发生宕机或者系列糟糕情况,内存会丢失。redis提供两者持久化机制
                
                //就跟男人一样,要持久,持之以恒,坚定不移。

            rdb方式:在指定的时间间隔内将内存中的数据快照写入磁盘,数据恢复时将快照文件直接再读到内存
                   步骤:在redis.conf文件中配置
                配置格式:save <seconds><changes>
                    save 900 1                //900秒内一次数据更改会保存一次
                    save 3000 10
                    save 6000 20

                配置文件redis.conf中搜索snapshtting:dbfilename:设置rdb文件名。默认文件名为dump.rdb        //就是可以修改保存文件的名字
                                dir:指定rdb和aof的文件目录                //修改保存文件的指定目录
                    //修改redis.conf文件后要重启一下redis

            aof方式:redis每收到一条修改命令时,它将命令写道一个aof文件中(不记录读命令),当redis重启时,再通过aof中的所有命令在恢复
                   步骤:rdis.conf文件中搜索append only mode
                       1,将append only改为yes,默认no;

                  aof相关设置: 1,appengfilename:aof文件名,可改,默认:appendonly.aof        
                        ////查看aop文件存储的命令:1,ll *.aop;2,cat  appendonly .aof
                              2,appendfsync:配置向aof文件写命令数据策略:
                                1,append fsync always        每次执行写入都会执行同步,慢且安全
                                2,append fsync  everysec        每秒执行一次同步操作
                                3,append fsync  no            不主动进行同步操作,交给系统来做,30秒一次,快但不且不安全

                             3,auto-aof-rewrite-percentage(例如:100):设置当目前aof文件大小超过上一次重写时aof文件大小的百分之多少时,将再次进行重写;若之前未进行重写,则以启动时最小aof文件大小为依据;
                        //进行文件优化,例:set k1 1 后再执行 set k1 2,那么set k1 1则不被记录,只记录有用的命令
                             4,auto-aof-rewtite-min-size(例如:64mb):设置允许重写的最小aof文件大小
        总结:可以同时使用两种方式,默认优先加载aof



    redis集群
           主从复制
        主从复制(master/slave):
            简介:redis做集群,为保证单点故障,就将数据复制多芬岛多台不同服务器,即使其中一台出现故障,其他服务仍可运行。
            实现:部署多台redis,并在配置文件中指定之间的主从关系。主负责写,同时将写入数据实时同步到从机器,即主从复制。master/slave,redis默认master用于写,slave用于读。

        配置方式一:修改配置文件,启动时,服务器读取配置文件,自动成为指定服务器的从服务器,构成主从复制关系。
            主服务器(master)
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6380
                pidfile /var/run/redis6380.pid
                logtile 6380.log
                dbfilename dump6380.rdb

            从服务器(slave)
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6381
                pidfile /var/run/redis6380.pid
                logtile 6381.log
                dbfilename dump6381.rdb
                slaveof 127.0.0.1 6380

        示例:(由于只有一台服务器,因此在一个redis中启三个实例,一个master两个slave)方便观看就开4个客户端窗口。
            以下为客户端窗口 1。
            bin目录下
            cp redis.conf redis6380.conf        //复制原来redis6379.conf配置文件,并生成新的redis6380.conf配置文件
            ll                //出现redis6380.conf文件
            >redis6380.conf            //滞空redis6380.conf文件
            vim redis6380.conf            //进入redis6380.conf文件,添加主服务的配置
                  配置master    
                include /usr/local/redis-5.0.3/redis.conf
                daemonize yes
                port 6380
                pidfile /var/run/redis6380.pid
                logtile 6380.log
                dbfilename dump6380.rdb
                :wq                        //如果无法保存退出,就按下esc键再,:wq a.txt

            配置从slave
                cp redis6380.conf redis6381.conf            //复制redis6380.conf文件
                vim redis6381.conf                    //进配置文件配置从
                    include /usr/local/redis-5.0.3/redis.conf
                    daemonize yes                //表示后台启动
                    port 6380
                    pidfile /var/run/redis6380.pid
                    logtile 6380.log
                    dbfilename dump6380.rdb
                    slaveof 127.0.0.1 6380            //设置是6380的从服务器
                    :wq                    //如果无法保存退出,就按下esc键再,:wq a.txt

                cp redis6380.conf redis6382.conf            //复制redis6380.conf文件
                vim redis6381.conf                    //进配置文件配置从
                    include /usr/local/redis-5.0.3/redis.conf
                    daemonize yes
                    port 6380
                    pidfile /var/run/redis6380.pid
                    logtile 6380.log
                    dbfilename dump6380.rdb
                    slaveof 127.0.0.1 6380            //设置是6380的从服务器
                    :wq                        //如果无法保存退出,就按下esc键再,:wq a.txt
            
            客户端窗口2
            ./redis-server ../redis6380.conf            //后台启动master        
            ./redis-server ../redis6381.conf            //后台启动slave
            ./redis-server ../redis6382.conf            //后台启动slave
            ps -ef | grep redis                //查看这三个进程是否启动
            如果已经有三个进程的了,也可以检查各个端口所处角色
            ./redis -cli -p 6380                //开启6381客户端
            info replication                //插看服务器角色命令
                查看的信息:
                role:master(主)            //角色master
                connected_slaves:2            //两个从,端口号分别为
                slave0:port:6381            
                slave1:port:6382
        
                客户端窗口3
            ./redis -cli -p 6381                //开启6381客户端
            info replication                //插看服务器角色命令
            查看的信息:
                role:slave(从)            //角色slave
                master_host:127.0.0.1        //主是本地的
                master_port:6380            //端口号为6380            
                master_link_status:up        //开启状态

               客户端窗口4
            ./redis -cli -p 6382                //开启6381客户端
            info replication                //插看服务器角色命令
            查看信息与3一样

        配置完成可测试
            1,回到master所在客户端窗口
                set k1 v1
                set k2 v2                //设置两个值,在从服务器去取,看是否能读取值
            
            2,回到任意一个slave所在客户端窗口
                get k1
                get k2
            3,看能否读到值,读到即配置成功
                get k3                //读master为设置的值看是否能读到
                输出null,未读到;
            
            4,回到master所在客户端窗口
                set k3 v3                //设置k3,再去slave读,看是否能读取

            5,回到任意一个slave所在客户端窗口
                get k3
            输出:v3                    //读取成功
        主从关系配置完成

    如果现在出现问题了,master服务器宕机了,关闭了,主没了,只有从了,怎么办?
        引入新的处理方式
            容灾处理(冷处理):当master服务出现故障后,需要手动将slave中的一个提升为master,将剩下的slave重新挂至新的master上;
                  命令如下:
                slaveof no one :将一台slave服务器提升为master
                slaveof 127.0.0.1 6381(新提上slave端口号):将slave挂至新的master上

        操作示例:
            1,在master所在服务器客户端
                shutdown                //关闭master,模拟master出故障
                ps -ef | grep redis            //查看redis6380.conf进程是否被关闭

            2,在任意一个slave所在服务器客户端
                slaveof no one             //提升为主
                info replication            //查看所处角色即从服务
                显示信息
                    role:master        //角色为主
                    connected_slaves:0        //没有从服务器

            3,在另外slave中的任意一个slave所在服务器客户端
                slaveof 127.0.0.1 6381        //将本slave挂至新的master上去
                info replication            //查看角色及主服务
                显示信息
                    role:slave
                    master_host:127.0.0.1
                    master_port:6381        //挂在了新的master上了

            4,假如现在原来的master6380服务器修好
                ./redis-server  ../redis6380.conf        //后台启动
                ps -ef | grep redis            //查看进程是否被启动
                ./redis-cli -p 6380            //进入redis
                info replication            //查看角色
                显示信息
                    role:master        //角色为master
                    connected_slaves:0        //slaves为0
                原来master重启后,默认角色为master现在将它挂至新的6381master上去

                slaveof 127.0.0.1 6381        //将本slave挂至新的master上去

            总结:
                1,使用到的相关命令:
                    ./redis-cli -p 6380        进入指定客户端端口
                    info replication        查看redis服务器所处角色
                    如果不配置启动,默认为master
                2,master下线,写请求无法执行;slave下线,读请求处理性能下降
                3,master故障,需要手动提升一个slave为master。其他的slave要重新挂至新的master上去
                4,主从复制模式的故障转移需要手动操作,需要实现自动化处理,就再次引入sentine哨兵,实现故障自动转移


        哨兵模式(热处理)
        作用:sentine哨兵可以来监控多个redis服务实例运行情况
        sentinel配置:
            1,复制三份文件:sentinel26380.conf,sentinel26381.conf,sentinel26382.conf;
            2,修改每个配置文件
                port 26380;port 26381;port 26382;
                sentinel monitor mymaster 127.0.0.1 6380 2
                sentinel会根据master的配置自动发现master和slave,sentinel默认端口是26379
            3,启动三个实例
                 ./redis-sentinel  ../sentinel26380.conf
                 ./redis-sentinel  ../sentinel26380.conf
                 ./redis-sentinel  ../sentinel26380.conf    
                启动三个实例后,会创建三个监视master服务的sentinel实例
            4,哨兵模式已启动;    

        操作示例:
               redis6379客户端窗口
            1, cd usr/local/redis-5.0.3/bin            //进入bin文件夹
            2,ll                    //会看到一个
                //    redis-sentinel            哨兵可执行文件,读取配置文件,站岗
                //    sentinel.conf            哨兵配置文件
              3,复制三个sentinel.conf配置文件
                cp  sentinel.conf  sentinel26380.conf        //复制sentinel26379配置文件生成新的sentinel26380文件
            cp  sentinel.conf  sentinel26381.conf
            cp  sentinel.conf  sentinel26382.conf

               4,逐个修改sentinel.conf文件
            vim  sentinel26380.conf
                port 26380 (进哪个端口改那个)
                sentinel  monitor  mymaster  127.0.0.1   6381  2
                    //  2  投票数:这个投票数就是哨兵的投票数。检测master的这个哨兵发现这个master挂了,但它不能直接确定,
                    //会让其他的哨兵也来检测这个master,认为挂了的哨兵就投一票,等票数过半了,就确定真挂了。
                :wq    //保存退出
            
            vim  sentinel26381.conf
                port 26381 (进哪个端口改那个)
                sentinel  monitor  mymaster(可修改文件名)  127.0.0.1   6381(主服务端口号,上面新提升的slave) 2(投票数)
                :wq    //保存退出

            vim  sentinel26382.conf
                port 26382 (进哪个端口改那个)
                sentinel  monitor  mymaster(可修改文件名)  127.0.0.1   6381(主服务端口号,上面新提升的slave) 2(投票数)
                :wq    //保存退出

                     /*
                       解析:
                sentinel  monitor  mymaster(文件名可修改)  127.0.0.1(本地地址)   6381(master,主服务端口号)  2(投票数)
                      2  投票数:这个投票数就是哨兵的投票数。检测master的这个哨兵发现这个master挂了,但它不能直接确定master挂了,
                        会让其他的哨兵也来检测这个master,认为挂了的哨兵就投一票,等票数过半了,就确定真挂了。

                    */

                5,ls                        //查看文件会看到三个sentinel.conf文件
                     ./redis-sentinel  ../sentinel26380.conf        //启动文件

                6,在新建两个客户端窗口方便启动,1窗口,2,窗口
            1窗口
            ./redis-sentinel ../sentinel26381.conf
            2窗口
            ./redis-sentinel ../sentinel26382.conf

                7,回到之前的master客户端窗口,关闭master,演示故障转移
            shutdown
            ps -ef | gerp redis            //查看进程,redis6381是否被关闭

               8,看1,2窗口,是否打印的日志信息
            ...
            # + failover-end master mymaster 127.0.0.1 6381                //6381进程end
            # + switch-master mymaster 127.0.0.1 6381  127.0.0.1 6380            //master6381替换成6380

               9,回到6380客户端窗口查看角色
            info replication
            信息显示
                role:slave            //角色slave
                master-port:6380            //它的master是6380
            
               10,回到6381(被停掉的master服务器),重启服务看看
            ./redis-server  ../redis6381.conf            //重启服务
            ./redis -cli -p 6381                //进入redis客户端
            info replication
            显示信息
                role:slave            //角色slave
                master-port:6380            //它的master是6380
               示例完成;

        总结:哨兵模式你补了容灾处理需要手动处理的缺陷。哨兵监控master主服务,当它发现master挂了的时候会自动进行古故障转移。
                  自动将其中的slave与挂了的master进行角色交换,而后就算挂了的master服务重启后也不再是master,而是自动修改成新master服务的slave服务。
        
        

    redis相关安全
        redis设置密码:redis.conf文件配置中 requirepass    123456
            操作示例:
                cd usr/local/redis-5.0.3
                vim redis.conf            //进入配置修改
                找到requirepass去掉注释,后面加上密码    123456
                :wq
                kill 6379                //杀掉进程重启
                ./redis-server ../redis.conf &        //启动后台
                ./redis -cli -p 6379            //启动6379客户端
                auth 123456
            在jedis连接客户端时也要密码
                jedis.auth("123456");

        绑定ip:#bin 127.0.0.1 去点注释,127.0.0.1换成你允许连接的ip.表示只允许这个ip进行访问;

        命令禁止和重命名(也是在redis.conf配置中进行):
            rename-command flushall  del    重命名flushall命令为del
                注意:这里重命名前提是appendonly.aof文件中没有flushall命令,否则服务器无法启动
                //因为redis.conf配置里改名了,appendonly.aof文件中还存在flushall命令,那会冲突,无法识别del新命令
            
            rename-command flushall  ""    禁用flushall    //flushall      清空本库所有信息
            rename-command flushdb  ""    禁用flushdb    //flushdb        清空所有库所有信息
            rename-command config   jijjmkxw        重命名config命令
            rename-command config   ""            禁用config命令        //config查看所有配置   config get *


        redis特点:
            简单稳定;支持丰富的内存结构;读写速度快;有持久化支持;支持部分事务操作;

转自:https://www.cnblogs.com/-zyz/p/12675110.html