>데이터 베이스 >Redis >Redis 게시 및 구독 방법을 사용하여 간단한 메시징 시스템을 구현하는 방법

Redis 게시 및 구독 방법을 사용하여 간단한 메시징 시스템을 구현하는 방법

WBOY
WBOY앞으로
2023-05-26 20:52:311355검색

I. 기본 사용법

1. 구성

SpringBoot 2.2.1.RELEASE를 사용하여 프로젝트 환경을 구축하고 pom.xml에 직접 redis 종속성을 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2.1.RELEASE来搭建项目环境,直接在pom.xml中添加 redis 依赖

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml配置中,如下

@Service
public class PubSubBean {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public void publish(String key, String value) {
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                redisConnection.publish(key.getBytes(), value.getBytes());
                return null;
            }
        });
    }
}

2. 使用姿势

redis 的发布/订阅,主要就是利用两个命令publish/subscribe; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现

a. 消息发布

public void subscribe(MessageListener messageListener, String key) {
    redisTemplate.execute(new RedisCallback<Object>() {
        @Override
        public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
            redisConnection.subscribe(messageListener, key.getBytes());
            return null;
        }
    });
}

b. 订阅消息

消息订阅这里,需要注意我们借助org.springframework.data.redis.connection.MessageListener来实现消费逻辑

@RestController
@RequestMapping(path = "rest")
public class DemoRest {
    @Autowired
    private PubSubBean pubSubBean;

    // 发布消息
    @GetMapping(path = "pub")
    public String pubTest(String key, String value) {
        pubSubBean.publish(key, value);
        return "over";
    }

    // 新增消费者
    @GetMapping(path = "sub")
    public String subscribe(String key, String uuid) {
        pubSubBean.subscribe(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] bytes) {
                System.out.println(uuid + " ==> msg:" + message);
            }
        }, key);
        return "over";
    }
}

c. 测试 case

写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个MessageListenerredis가 기본 구성인 경우 추가 구성을 추가할 필요가 없습니다. 다음과 같이 application.yml에서 직접 구성할 수도 있습니다.

notify-keyspace-events Ex

2. Posture

Redis 게시/구독을 사용합니다. 주로 publish/subscribe 두 가지 명령을 사용합니다. SpringBoot에서 게시 및 구독 모드를 사용하는 것은 상대적으로 간단하며 다음과 같이 쉽게 구현할 수 있습니다. RedisTemplate

a. 메시지 게시

subscribe __keyevent@0__:expired

b. 메시지 구독

메시지 구독은 org.springframework.data.redis를 사용합니다. Connection.MessageListener를 사용하여 소비 로직을 구현합니다

rrreee

c. 테스트 케이스

위의 게시 및 구독을 확인하고 이 MessageListener; 두 개의 REST 인터페이스를 제공하는 간단한 WEB 프로젝트를 만듭니다<p>rrreee</p> 먼저 두 개의 소비자를 생성한 다음 메시지를 보낼 때 둘 다 수신되고 메시지를 보낼 때 세 개가 모두 수신됩니다. received<ul class=" list-paddingleft-2"> <li>3. 사용 지침 및 적용 시나리오 <p></p>Redis 게시 및 구독은 상대적으로 간단한 시나리오에만 적합합니다. 위 지침에서 볼 수 있듯이 이는 1에서 N까지 지원하는 간단한 게시 및 구독 모델입니다. 전송된 것은 온라인인 소비자만이 얻을 수 있고(온라인이 아닌 사람은 안타깝다고 할 수밖에 없음), 레디스의 경우 소비자가 소비할 수 있는지 여부는 끝난다. 일반적으로 상관하지 않습니다. </li> <li> 핵심 사항: <p></p> </li> </ul>온라인 소비자만 메시지를 받을 수 있습니다. <p></p> <p><strong> 소비자는 메시지를 한 번만 받을 수 있습니다. </strong></p> <p></p>다음 질문은 어떤 시나리오에서 Redis를 사용할 수 있느냐는 것입니다. 게시와 구독은 어떻습니까? <p><strong></strong>메모리 기반 캐시 무효화</p> <p></p>레이드 + 메모리를 보조 캐시로 사용하는 것은 비교적 일반적인 방법이라고 할 수 있습니다. 메모리 기반 캐시의 도움으로 시스템 부하를 효과적으로 늘릴 수 있지만 문제도 있습니다. 캐시된 데이터의 메모리 무효화는 특히 애플리케이션이 여러 서버에 배포될 때 문제가 됩니다. 동시에 모든 서버의 특정 메모리 캐시를 무효화하려면 redis 게시/구독을 사용하는 것이 더 좋습니다<p></p> <p> SpringCloud Config 구성 새로 고침 <strong></strong></p>SpringCloud Config를 구성 센터로 사용하는 친구는 이러한 문제에 자주 직면할 수 있습니다. 구성 수정 후 동적 새로 고침이 문제입니다(물론 공식 지원은 mq를 통해 버스를 통해 동기화하는 것이며, 또한 )<p></p>redis 게시/구독의 도움으로 구성을 동적으로 새로 고치는 것도 좋은 대안입니다(특정 구현 데모는 나중에 제공될 예정입니다. 관심이 있으시면 계속 따르세요). Yihuihui 블로그)<p></p> <p>redis 키 만료 구독</p>🎜 🎜redis를 캐싱에 사용할 때 일반적으로 만료 시간을 설정합니다. Redis는 기본적으로 활성화되지 않는 만료 이벤트를 제공합니다. 구독을 통해🎜🎜구성을 수정하고 키 만료 이벤트를 활성화하세요🎜rrreee🎜redis를 다시 시작한 후 무효화 이벤트를 구독하세요🎜rrreee

위 내용은 Redis 게시 및 구독 방법을 사용하여 간단한 메시징 시스템을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제