redis介绍4--配置文件、持久化、事务、消息的发布与订阅、集群、哨兵模式、Jedis

一、redis的配置文件redis.conf
1.redis配置文件中关于网络的配置
(1)port:指定redis服务所使用的端口,默认使用6379.
(2)bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip;一般情况下,都会配置一个ip,而且通常是一个事实。
如果配置了port和bind,则客户端连接redis服务时,必须指定端口号和ip:
redis-cli -h 192.168.11.128 -p 6380
redis-cli -h 192.168.11.128 -p 6380 shutdown
(3)tcp-keepalive:连接保活策略。

2.redis中的数据库
redis中默认有16个数据库(database),编号为0~15,redis也是一个应用对应一个数据库,与mysql数据库不同的是,redis的数据库由它自身创建,程序员不能手动创建。
如果想要改变redis中数据库的数量可以通过修改redis的配置文件redis.conf的databases的值来改变。

3.安全配置
客户端连接mysql数据库需要用户名和密码,而客户端连接redis数据库不需要用户名和密码,只要知道ip和端口就可以连,所以redis的安全性不如mysql。
redis也可以在服务端设置密码(默认不适用),通过配置文件来设置密码,修改requirepass值。此项需要在protected-mode=yes时起作用,使用密码登录客户端:
redis-cli -h ip -p port -a pwd
一旦设置了密码验证,客户端连接redis服务时,必须使用密码连接。

二、redis的持久化
redis是一种内存数据库,大多数时候它把数据存储在内存中(redis主要作缓存)。除此之外,redis支持持久化(包括RDB和AOF),可以将内存中的数据保存在磁盘中,重启时候可以再次加载进行使用。注意:采用持久化会影响redis的高效性。
1.RDB(Redis Database)策略
在指定的时间间隔内,执行指定次数的写操作(在适当的时机采用适当手段把内存中的数据持久化到磁盘中),会自动触发一次持久化操作。在指定目录下生成一个dump.rdb文件,redis重启时通过加载dump.rdb文件来恢复数据。默认的策略是:
1分钟内改变了1万次;或者5分钟内改变了10次;或者
如果修改RDB策略需修改配置文件中的save的值:
在这里插入图片描述
save < seconds > < changes >:即redis在seconds秒内key改变changes次,redis把快照内的数据保存到磁盘中一次。
禁用RDB策略则直接将配置文件中所有的save都注释掉。
配置文件中的其他值:
dbfilename:redis持久化数据生成的文件名,默认是dump.rdb,也可以通过该值来修改。
dir:持久化数据生成文件保存的目录,默认是./即redis的启动目录,也可以自己配置。

2.AOF策略(对RDB策略的弥补,默认是开启RDB,默认不开启AOF,使用RDB可能进行了写操作但是三个策略一个也没有触发)
采用操作日志来记录进行的每一次写操作(记录的是命令不是数据)。每次redis服务启动时,都会重新执行一遍操作日志中的指令。可行性高但是效率很低。
也是通过修改配置文件来设置该策略。
在这里插入图片描述

三、redis的事务
1.概念
不论是关系型数据库还是非关系型数据库,都有事务的概念。
事务:把一组数据库命令放在一起执行,保证操作的原子性,要么同时成功,要么同时失败。
redis事务:允许把一组redis命令放在一起执行,把命令进行序列化(把命令排个序依次执行),然后一起执行,执行过程中不能保证原子性,只能保证部分原子性(后面解释)。

2.redis事务的基本操作
(1)multi:用来标记一个事务的开始。
(2)exec:用来执行事务队列中所有的命令。
在这里插入图片描述
部分原子性的说明:
(a)错误1
如果一组命令中,有在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。
例如:
在这里插入图片描述
在这里插入图片描述
(b)错误2
如果一组命令在压入队列中正常,但在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其它命令的执行,不能保证事务的原子性。
例如:
在这里插入图片描述
在这里插入图片描述
(3)discard:清除所有已经压入事务队列中的命令,事务也自动会结束。
例如:
在这里插入图片描述
在这里插入图片描述
(4)watch: 监控某一个键,当事务在执行过程中,此键代码的值发生变化时,则本事务放弃执行;否则,正常执行。例如:

watch version
multi 
decrby balance 50
incrby balance2 50
incr version
exec

监控version字符串,只有version值未变事务才能正常执行。
说明:version字段主要用于解决并发执行的情况。
(5)unwatch:放弃监控所有的键

watch version
unwatch
multi 
decrby balance 50
incrby balance2 50
exec

四、redis消息的发布与订阅(了解原理即可)
redis客户端订阅频道(频道可以理解为对于某些数据的关注,比如对于某个数据的修改的情况为一个频道,所有想要关注该数据修改情况的客户端订阅该频道,当该数据被修改时将消息发送到订阅了该频道的客户),消息的发布者往频道上发布消息,所有订阅此频道的客户端都能够接受到该消息。
(1)subscribe:订阅一个或者多个频道的信息

subscribe ch1 ch2 ch3

(2)publish:将消息发布到指定频道

publish ch1 hello

(3)psubscribe:订阅一个或者多个频道,它的功能更强大,频道名支持通配符。

五、搭建redis集群
集群就是将多个服务器搭建成一个集体,多个服务器的数据相同,当有多个请求时,多个服务器可以分配处理请求(哪个服务器空闲着将请求分配给它处理),减轻只有一台服务器时服务器处理请求的压力。集群适用于处理“写少读多”的情况。
1.redis的主从复制
主机数据更新后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主。
主从复制:主写从读,主多从少、读写分离、主写同步复制到从。
2.例如:搭建一主二从的redis集群
(1)搭建3台redis服务
按理需要在三台计算机中分别安装redis软件(服务器),但也可以在用1台redis模拟3台redis服务(假设分别为6379、6380、6381),方法是准备3份redis配置文件,分别将3份配置文件中的bind、pidfile、端口号、dbfilename(持久化文件)和logfile(日志文件)改为不同的值。分别使用3个redis配置文件启动3个redis服务,启动时指定对应的配置文件。
(2)通过3个redis客户端分别连接3台redis服务
(3)查看3台服务在集群中的主从角色

info replication

目前3个redis服务是3个互不关联的主机,都能写和读,都没有从机。
(4)设置主从关系
在6380和6381上执行:slaveof 127.0.0.1(主机ip地址) 6379(主机redis服务的端口),则6379是主机、6380和6381是从机。
(5)全量复制
一旦主从关系确定,会自动把主机中已有的数据会自动同步复制到从机上。
(6)增量复制
主机上修改数据,会自动同步复制到从机上。
(7)读写分离,主写从读
在从机上写数据会报错,从机只能读数据。
(8)主机宕机(主机宕机,默认从机原地待命,主机恢复后一切恢复正常)
关闭6379服务,可以发现6380和6381还是从机,但是连接状态(master-link-status)变成了down(也是通过info replication查看)。重启加粗样式6379服务,可以发现6379还是主机,有两个从机。
(9)从机宕机(从机恢复,需要重新设置主从关系)
关闭6380服务,发现6379还是主机,但是只有一个从机;6381还是从机,主机是6379(即6381不受影响)。重启6380服务,发现6380变成了独立的主机,6379与6381的状态与6380宕机时的状态一样。若要6380作为6379的从机则要重新设置主从关系。
(10)主机宕机,从机上位
关闭6379服务,找到一个性能较好的从机让其上位(变为主机)。
上位步骤:
断开原来主从关系,slaveof no one;
重新设置主从关系,让其它从机转换主机,执行slaveof命令重新设置。
这时再重启6379会发现它是一个没有从机的独立的主机。

六、redis的哨兵模式
哨兵是redis的一段代码,提供一套模式,自动实现“主机宕机、从机上位”。

七、Jedis
使用redis官方推荐的Jedis,在java应用中操作redis。Jedis几乎涵盖了redis的所有命令。操作redis的命令在Jedis中以方法的形式出现。
1.新建一个空项目,编码格式改为utf-8

在这里插入图片描述
2.新建一个module,选择maven的web项目
在这里插入图片描述
3.添加jedis依赖
在这里插入图片描述
4.新建一个java文件夹(directory),make directory as -->sources root
新建jedis包(package),再新建测试类Test。
5.打开redis服务。
6.编写代码,运行。
在这里插入图片描述
jedis.ping()相当于在redis客户端执行ping命令,返回值为“PONG"表示服务端正常运行。
jedis.auth()是在设置了redis连接密码时使用的,可以通过查看配置文件的requirepass值。
在这里插入图片描述
在这里插入图片描述
上述代码相当于”exists k1"命令。
在这里插入图片描述
代码:

public class Test {
    public static void main(String[] args)
    {
        //连接redis,使用Jedis对象,new时传递两个参数,一个为ip地址,一个为port(端口号)
        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.auth("123456");

        /*使用jedis对象来操作redis服务
        String ret = jedis.ping();
        System.out.println(ret);*/

        /*获取服务端中所有的字符串,相当于”keys *“命令
       Set<String>  keys = jedis.keys("*");
       for(String key :keys){
           System.out.println(key);}*/

        /* 相当于"exists k1"命令
        Boolean ret = jedis.exists("k1");
        System.out.println(ret);*/


        //相当于“set k3 3"命令
        jedis.set("k3","3");
        Set<String>  keys = jedis.keys("*");
        for(String key :keys){
            System.out.println(key);}


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值