Redis發佈訂閱PHP與Java案例

零、前言

Redis的發佈訂閱是個強大而實用的功能,本文分別在php端與Java端進行了測試。相對memcache而言,Redis支持數據持久化備份恢復、密碼安全驗證等功能,比較吸引人。php

1、測試環境

環境 版本
操做系統 Win7 64bit
服務器 UPUPW NAK v1.1.4
PHP版本 5.6.32
Redis版本 2.8.2101

2、php 客戶端

一、發佈

<?php  
$redis = new Redis();  
$redis->connect('127.0.0.1', 6379);  
$message='新年快樂';  
$ret=$redis->publish('redisChat',$message);

二、訂閱

<?php ini_set('default_socket_timeout', -1); //不超時  $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $result=$redis->subscribe(array('redisChat'), 'callback'); function callback($instance,$channelName,$message){ echo $message; } 

三、對象發佈

數組對象轉化成Json字符串數據發佈css

<?php //發佈  $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $message['msg']='新年快樂'; $message['time']=time(); $ret=$redis->publish('redisChat',json_encode($message));

php可發佈消息,java訂閱接受消息進行處理;不建議php訂閱否則會形成程序和用戶瀏覽阻塞。html

3、Java客戶端

一、訂閱

SubTest01.javajava

public class SubTest01 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        RedisMsgPubSubListener listener = new RedisMsgPubSubListener();
        jedis.subscribe(listener, "redisChat");
        //other code
    }
}

注意:subscribe是一個阻塞的方法,在取消訂閱該頻道前,會一直阻塞在這,只有當取消了訂閱纔會執行下面的other code。redis

RedisMsgPubSubListener.javajson

public class RedisMsgPubSubListener extends JedisPubSub {

    @Override  
    public void unsubscribe() {  
        super.unsubscribe();  
    }  

    @Override  
    public void unsubscribe(String... channels) {  
        super.unsubscribe(channels);  
    }  

    @Override  
    public void subscribe(String... channels) {  
        super.subscribe(channels);  
    }  

    @Override  
    public void psubscribe(String... patterns) {  
        super.psubscribe(patterns);  
    }  

    @Override  
    public void punsubscribe() {  
        super.punsubscribe();  
    }  

    @Override  
    public void punsubscribe(String... patterns) {  
        super.punsubscribe(patterns);  
    }  

    @Override  
    public void onMessage(String channel, String message) {  
        System.out.println("channel:" + channel + "receives message :" + message);  
// this.unsubscribe(); 
    }  

    @Override  
    public void onPMessage(String pattern, String channel, String message) {  

    }  

    @Override  
    public void onSubscribe(String channel, int subscribedChannels) {  
        System.out.println("channel:" + channel + "is been subscribed:" + subscribedChannels);  
    }  

    @Override  
    public void onPUnsubscribe(String pattern, int subscribedChannels) {  

    }  

    @Override  
    public void onPSubscribe(String pattern, int subscribedChannels) {  

    }  

    @Override  
    public void onUnsubscribe(String channel, int subscribedChannels) {  
        System.out.println("channel:" + channel + "is been unsubscribed:" + subscribedChannels);  
    }  
}

二、發佈

PubTest01.java數組

public class PubTest01 {
    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = new Jedis("localhost");  
        jedis.publish("redisChat", "我是天才");  
        Thread.sleep(5000);  
        jedis.publish("redisChat", "我牛逼");  
        Thread.sleep(5000);  
        jedis.publish("redisChat", "哈哈");  
    }
}

三、測試效果圖

這裏寫圖片描述

注意:Redis不支持直接發佈對象,須要JSON化安全

參考網址
redis可視化管理
http://www.javashuo.com/article/p-vjxbazgq-w.html
PHP https://blog.csdn.net/gxinkai/article/details/54630516
PHP https://blog.csdn.net/u012946588/article/details/79014492
Java http://www.runoob.com/redis/redis-java.html
Java https://blog.csdn.net/u011734144/article/details/51782085
redis備份與恢復
http://www.runoob.com/redis/redis-backup.html
Redis爲何是單線程
http://www.javashuo.com/article/p-fglcgeto-ng.html服務器

相關文章
相關標籤/搜索