Redis进阶之发布订阅

本文介绍Redis的发布订阅(pub/sub)模式,一种消息通信方式,发送者(pub)发送消息,订阅者(sub)接收消息。适用于实时消息系统、聊天系统及关注系统。通过示例展示如何使用Jedis进行发布与订阅。

Redis发布订阅

Reids发布订阅(pub/sub)是一种消息通信模式:发送者pub发送消息,订阅者sub接收消息。微信,微博,关注系统!Redis客户端可以订阅任意舒朗的频道
订阅/发布消息图
第一个:消息发送者,第二个:频道,第三个:消息订阅者
在这里插入图片描述
下图展示了频道channel1,以及订阅这个频道的三个客户端–client1,client2,client5之间的关系
在这里插入图片描述
当有新消息通过PUBLISH命令发送给channel1时,这个消息就会被发送给订阅他的三个客户端。
在这里插入图片描述
在这里插入图片描述

测试

#订阅者
127.0.0.1:6379> SUBSCRIBE smallcosmos   #订阅一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "smallcosmos"
3) (integer) 1
1) "message"     #消息
2) "smallcosmos"  #哪个频道
3) "hello,smallcosmos"  #消息的具体内容
1) "message"
2) "smallcosmos"
3) "hello,redis"

#发布者
127.0.0.1:6379> PUBLISH smallcosmos "hello,smallcosmos"  #发布者发布消息到频道
(integer) 1
127.0.0.1:6379> PUBLISH smallcosmos "hello,redis"
(integer) 1


jedis测试

package cn.smallcosmos;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

/**
 * @Date 2020/5/15 上午11:15
 * @Created by zhaoli
 */
public class pubsub {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1",6379);
        Jedis jedis2 = new Jedis("127.0.0.1",6379);
        new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 0;
                while (true){
                    jedis.publish("smallcosmos","hello,pubsub"+count++);
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {

                jedis2.subscribe(new JedisPubSub() {
                    @Override
                    public void onMessage(String channel, String message) {
                        System.out.println("onMessage"+"---"+channel + ":" + message);
                    }
                },"smallcosmos");
            }
        }).start();
    }
}

使用场景:
1、实时消息系统
2、实时聊天系统
3、订阅关注系统

### Java与Redis结合的高级用法及技巧 在Java项目中,Redis的高级用法可以显著提升应用性能和功能复杂度。以下是关于Java与Redis结合的一些高级用法及技巧: #### 1. HyperLogLog 数据结构 HyperLogLog 是一种用于估算集合基数的数据结构,适用于大数据场景下的唯一值统计。通过 `pfadd` 和 `pfcount` 命令,可以在Redis中实现高效的基数统计[^2]。 ```java Jedis jedis = new Jedis("localhost", 6379); jedis.pfadd("unique-users", "user1", "user2", "user3"); long estimatedCount = jedis.pfcount("unique-users"); System.out.println("Estimated unique users: " + estimatedCount); ``` #### 2. 发布/订阅模式 Redis 提供了发布/订阅功能,允许客户端订阅特定频道并接收消息推送。这种模式非常适合实现实时通知系统[^2]。 ```java // 订阅者 JedisPubSub subscriber = new JedisPubSub() { @Override public void onMessage(String channel, String message) { System.out.println("Received message: " + message); } }; jedis.subscribe(subscriber, "news-channel"); // 发布者 jedis.publish("news-channel", "Breaking news: Something happened!"); ``` #### 3. Redis事务处理 Redis 支持事务机制,通过 `MULTI`、`EXEC`、`DISCARD` 等命令实现多个操作的原子性执行。 ```java Jedis jedis = new Jedis("localhost", 6379); jedis.multi(); jedis.set("key1", "value1"); jedis.set("key2", "value2"); List<Object> results = jedis.exec(); System.out.println("Transaction results: " + results); ``` #### 4. 分布式锁实现 分布式锁是多节点环境中协调资源访问的重要工具Redis 的 `SETNX` 命令可以用来实现简单的分布式锁[^5]。 ```java public static boolean acquireLock(Jedis jedis, String lockKey, int expireTime) { String result = jedis.set(lockKey, "locked", "NX", "EX", expireTime); return "OK".equals(result); } public static void releaseLock(Jedis jedis, String lockKey) { jedis.del(lockKey); } ``` #### 5. 全局唯一ID生成 Redis 可以用作全局唯一ID生成器,通过 `INCR` 命令实现递增计数器。 ```java Jedis jedis = new Jedis("localhost", 6379); long uniqueId = jedis.incr("global-id-counter"); System.out.println("Generated unique ID: " + uniqueId); ``` #### 6. Lazy Free机制优化 Redis 6.0及以上版本支持 `lazy-free` 机制,可以将耗时的内存释放操作放到后台线程中执行,减少主线程阻塞[^4]。 ```properties # 在redis.conf中配置 lazyfree-lazy-user-del yes ``` #### 7. 高效数据序列化 为了提高Redis的存储效率,可以使用JSON或二进制序列化工具(如Gson、Jackson)对复杂对象进行序列化后再存储到Redis中[^3]。 ```java Gson gson = new Gson(); MyObject obj = new MyObject("example", 123); String json = gson.toJson(obj); jedis.set("my-object", json); String storedJson = jedis.get("my-object"); MyObject retrievedObj = gson.fromJson(storedJson, MyObject.class); ``` #### 8. 持久化与高可用性 Redis 支持多种持久化方式(RDB和AOF),可以根据业务需求选择合适的策略。同时,通过主从复制和哨兵模式,可以实现高可用性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值