NutzCN Logo
问答 关于cache的问题
发布于 2517天前 作者 zp8821138 1505 次浏览 复制 上一个帖子 下一个帖子
标签:
public void fire(String key) {
        Jedis jedis = null;
        try {
            jedis = LCacheManager.me.jedis();
            String channel = (LCacheManager.PREFIX + name);
            String msg = LCacheManager.me().id + ":" + key;
            log.debugf("fire channel=%s msg=%s", channel, msg);
            jedis.publish(channel, msg);
        } finally {
            Streams.safeClose(jedis);
        }
    }

这段代码的意义是啥啊 发布了以后 接收的代码是

   public void onPMessage(String pattern, String channel, String message) {
        log.debugf("channel=%s, msg=%s", channel, message);
        if (message.startsWith(LCacheManager.me.id))
            return;
        String cacheName = channel.substring(LCacheManager.PREFIX.length());
        LCache cache = LCacheManager.me.caches.get(cacheName);
        if (cache != null && cache.list.size() > 1)
            ((Cache) cache.list.get(0)).remove(message.substring(LCacheManager.me.id.length() + 1));
    }

这个为啥message.startsWith(LCacheManager.me.id) 直接return了。。

9 回复

因为LCacheManager也监听着同一个channel, 它会收到自己的message, 既然是自己发过来, 那就不需要处理了,return之

之所以需要订阅发布机制,是因为ehcache通常是单机缓存,写入缓存时,需要通知其他机器清除对应的ehcache缓存,否则照常缓存不同步,比如我现在部署在1,2,3台服务器中,他访问的是1号服务器,那么清除的也是1号服务器的ehcache中的缓存啊 ,怎么能清除2,3号服务器的ehcache中的缓存呢 ?

jedis.publish(channel, msg); // 广播出去, 其他机器的LCacheManager就会收到清除ehcache缓存的消息

喔 明白了。。每个服务对应一个LCacheManager。。

是每个 "服务器" 有一个LCacheManager, 不是每个服务...

貌似叫服务也对,你明白就行...

额,如果我在一台服务器上部署两个tomcat呢,那应该是两个LCacheManager把

好吧 tomcat也是服务器。傻了

嗯嗯, 如果是一个tomcat两个webapp, 那也是两个两个LCacheManager

添加回复
请先登陆
回到顶部