Redis进阶(发布订阅,PipeLine,持久化,内存淘汰)

目录

 

1、发布订阅

1.1 什么是发布订阅

1.2 客户端实例演示

1.3 Java API演示

1.4 Redis发布订阅和rabbitmq的区别

2、批量操作

2.1 普通模式与 PipeLine 模式

2.2 适用场景

2.3 源码解析

2.4 Pipelining的局限性

2.5 事务与 LUA Scripting

3、持久化

3.1 为什么需要持久化

3.2 持久化方式

3.3 文件同步方式

3.4 文件重写(压缩)

3.5 总结

4、内存淘汰

4.1 最大内存设置

4.2 数据淘汰机制


1、发布订阅

1.1 什么是发布订阅

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

发布订阅(Pub/Sub):目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者------是不是与设计模式里面的观察者模式一个妈妈生的?

最经典的应用场景就是微博和公众号,任何粉丝只要关注(订阅)了某一个人的微博或者公众号,该微博或者公众号就有有状态更新,都会将消息推送(发布)到粉丝....

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

20210203232133811.png

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

1.2 客户端实例演示

以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:

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

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

redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
​
(integer) 1
​
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
​
(integer) 1
​
# 订阅者的客户端会显示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"

下表列出了 redis 发布订阅常用命令:

序号 命令及描述
1 PSUBSCRIBE pattern... 订阅一个或多个符合语法的频道。---> PSUBSCRIBE redisChat* 订阅所有以redisChat开头的频道
2 PUBLISH channel message 将信息发送到指定的频道。
3 PUNSUBSCRIBE pattern ... 退订所有给定模式的频道。
4 SUBSCRIBE channel ... 订阅给定的一个或多个频道的信息。

 

1.3 Java API演示

1.3.1 引入jedis依赖

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

1.3.2 Publisher (发布者)

package com.ydt.redis.pubsub;
​
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
​
public class Publisher extends Thread{
​
    private final JedisPool jedisPool;
​
    public Publisher(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }
    
    @Override
    public void run() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        Jedis jedis = jedisPool.getResource();   //连接池中取出一个连接
        while (true) {
            String line = null;
            try {
                line = reader.readLine();
                if (!"quit".equals(line)) {
                    jedis.publish("mychannel", line);   //从 mychannel 的频道上推送消息
                } else {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

1.3.3 Subscriber(订阅者)

package com.ydt.redis.pubsub;
​
import redis.clients.jedis.JedisPubSub;
​
//订阅者需要继承JedisPubSub,来重写它的三个方法
public class Subscriber extends JedisPubSub {
​
    public Subscriber(){}
    @Override
    public void onMes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值