Redis学习笔记(3)

Redis学习笔记(3)

1.Redis的事务管理

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客 户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历以下三个阶段:

​ 开始事务。

​ 命令入队。

​ 执行事务。

实例 以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由

EXEC 命令触发事 务, 一并执行事务中的所有命令: 示例1:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set bookname java
QUEUED
127.0.0.1:6379> set bookname c++
QUEUED
127.0.0.1:6379> set bookname html
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

示例2:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set u1 user1
QUEUED
127.0.0.1:6379> get u1
QUEUED
127.0.0.1:6379> sadd tag c++ html java
QUEUED
127.0.0.1:6379> smembers tag
QUEUED
127.0.0.1:6379> exec
1) OK
2) "user1"
3) (integer) 3
4) 1) "java"
2) "html"
3) "c++"

2.Redis发布订阅模式

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

在这里插入图片描述

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

在这里插入图片描述

在我们实例中我们创建了订阅频道名为 redisMessage:

127.0.0.1:6379> subscribe redisMessage
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisMessage"
3) (integer) 1

现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisMessage 发布两次消息,订阅者就能接收到消 息。

127.0.0.1:6379> publish redisMessage "demo1 test"
(integer) 1
127.0.0.1:6379> publish redisMessage "demo2 test"
(integer) 1
127.0.0.1:6379> publish redisMessage "demo3 test"
(integer) 1

订阅者的客户端会显示如下消息

127.0.0.1:6379> subscribe redisMessage
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisMessage"
3) (integer) 1
1) "message"
2) "redisMessage"
3) "demo1 test"
1) "message"
2) "redisMessage"
3) "demo2 test"
1) "message"
2) "redisMessage"
3) "demo3 test"

3.Jedis连接Redis

第一步:创建项目,导入依赖

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.7.2</version>
</dependency>

注意: 1)确认远程服务器是否可以ping通: ping 服务器的ip地址

在这里插入图片描述

2)确认防火墙是否关闭或放行

service iptables stop

service iptables status

第二步:链接服务器

方案一 单实例链接

Jedis jedis = new Jedis(“ip地址”, 端口号);//建立链接

核心代码:

public static void main(String[] args) {
	Jedis jedis=new Jedis("192.168.197.129",6379);
	//设置值
	jedis.set("java001","java工程师");
	String java001 = jedis.get("java001");
	System.out.println(java001);
}

常见异常:

在这里插入图片描述

解决方案: 服务器客户端连接的ip是127.0.0.1,意思是连接的本机,其他机器无法连接,这里需要修改配置文件,将连接地址改为服务器的地址,就可以了. 修改redis.conf文件里面的 bind 连接地址,将连接地址改为自己服务器的ip

bind 150.158.154.148

重新启动服务,Jedis就可以正常连上了

方案二:

连接池 jedis连接池连接,后面会使用Spring的配置文件来整合。

// 1.获取连接池配置对象,设置配置项
JedisPoolConfig config = new JedisPoolConfig();
// 1.1最大的连接数
config.setMaxTotal(30);
// 1.2最大的空闲
config.setMaxIdle(10);
// 2.获取连接池
JedisPool jedisPool = new JedisPool(config, "192.168.197.129", 6379);
Jedis jedis = null;
try {
	jedis = jedisPool.getResource();
    // 3.设置数据
	jedis.set("name", "张三");
	String name = jedis.get("name");
	System.out.println("name=" + name);
} catch (Exception e) {
	e.printStackTrace();
} finally {
	if (jedis != null) {
	jedis.close();
	}
	// 4.虚拟机关闭的时候,释放资源
	if (jedisPool != null) {
	jedisPool.close();
	}
}

4.Redis主从复制

  • 持久化保证了即使redis服务重启也不会丢失数据,但是当redis服务器的硬盘损坏了可能会导致数据丢失,通 过redis的主从复制机制就可以避免这种单点故障(单台服务器的故障)。

  • 主redis中的数据和从上的数据保持实时同步,当主redis写入数据时通过主从复制机制复制到两个从服务上。

  • 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求.

  • 主机master配置:无需配置

推荐主从模式同步数据:

在这里插入图片描述

工作中一般选用:一主两从或一主一从 数据会同步到从服务器。在这个集群中的几台服务器上都有同样的数据。

主从搭建步骤:

主机:不用配置。仅仅只需要配置从机,从机slave配置:(这里是伪集群)

第一步:复制出一个从机,注意使用root用户

[root@localhost myapps]# cp redis/ redis1 -r
[root@localhost myapps]# ll
总用量 40
drwxr-xr-x. 3 root root 4096 2月 1 09:26 redis
drwxr-xr-x. 3 root root 4096 2月 1 09:27 redis1

第二步:修改从机的redis.conf

语法:replicaof // replicaof 主机ip 主机端口号

提示:检索文件: 输入:/replicaof 当前页没有时,输入n,查找下一页

在这里插入图片描述

第三步:修改从机的port地址为6380
注意:修改端口后,一定要把防火墙的端口打开(博主配置了一下午,结果发现是防火墙的端口没打通)
在从机redis.conf中修改

在这里插入图片描述

第四步:清除从机中的持久化文件

在这里插入图片描述

[root@localhost redis]# ./bin/redis-server ./redis.conf

第六步:启动6380的客户端

[root@localhost redis]# ./bin/redis-cli -p 6380
127.0.0.1:6380> keys *
1) "mylist"
2) "num"
3) "bookCate1"
4) "newbook"
127.0.0.1:6380>

停止客户端: ./bin/redis-cli -p 6380 shutdown

注意:

  • 主机一旦发生增删改操作,那么从机会自动将数据同步到从机中

  • 从机不能执行写操作,只能读

127.0.0.1:6380> get username
"hehe"
127.0.0.1:6380> set username haha
(error) READONLY You can't write against a read only slave.
复制的过程原理
  • 当从库和主库建立MS(master slaver)关系后,会向主数据库发送SYNC命令;

  • 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来;

  • 快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;

  • 从Redis接收到后,会载入快照文件并且执行收到的缓存命令;

  • 主Redis每当接收到写命令时就会将命令发送从Redis,保证数据的一致;【内部完成,所以不支持客户端在从 机人为写数据。】

复制架构中出现宕机情况?
从Redis宕机:重启就好
主Redis宕机:

r)关系后,会向主数据库发送SYNC命令;

  • 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来;

  • 快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;

  • 从Redis接收到后,会载入快照文件并且执行收到的缓存命令;

  • 主Redis每当接收到写命令时就会将命令发送从Redis,保证数据的一致;【内部完成,所以不支持客户端在从 机人为写数据。】

复制架构中出现宕机情况?
从Redis宕机:重启就好
主Redis宕机:

从数据库(从机)中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务[把一个从做为 主机,这个时候新主机[之前的从机]就具备写入的能力];主服务器修好后,重新启动后,执行SLAVEOF命令,将其 设置为从库[老主机设置为从机]。[手动执行,过程复杂,容易出错。]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值