以一种快速但危险的方式来运行redis

一主一从。主不要用任何持久化存储。。appendonly和快照的方式来存储。。没有io开销。。从机使用appendonly的方式来进行数据持久化。。。

1. 主机不要让redis开机自启动。

2. 在主机redis挂掉后。不要重启主机的redis。需要把从机的redis关掉。。主从交换角色后运行。。否则。就会造成从机的数据全部丢失。。。

最危险的就是主机重启。。所以不能让redis开机自启动。。

 

危险。。但快速。。

微博推到客户端的一些思路。。

关于移动客户端以及msn,gtalk机器人接收新消息的一些假想:
因为msn,gtalk机器人是部署在跟服务器一个机房里。且是作为服务运行的。所以需要分成机器人和移动客户端两种情况:
1. 机器人
机器人是用python写的服务。它可以响应用户上线及下线的事件。以及在必要的时候进行重新初始化用户在线状态的能力。因此。可以在redis里放一个 在线用户的sets里。在用户上线的时候把它放入在线用户的set里同时subscribe这个用户的消息通道。。在下线时。从在线用户set里删掉同时 unsubscribe这个用户的消息通道。。。同时subscribe多个channel(即每个用户的消息通道)
2. 客户端
快信之类的移动客户端。。只代表了单个用户。它可能会因为网络原因断线而不能及时通知redis这个用户已经离线。。因此。需要使用浏览器之类的poll 模型来每隔多长时间告诉我在线。。我在线。。。当然这需要自己开发一个c proxy之类的东西代理订阅。每个用户连到这个proxy上。。则设置一个120s的定时器。定时器过期则把这个用户从redis里在线用户列表删掉。 标识这个用户已经离线。同时unscribe这个用户的消息通道。。移动客户端每隔60s向proxy发一个请求。标识我还在线。。我还在线。。 proxy则重置这个定时器为120s。。

理论上。上面这一些东西。。能够实现把消息推到用户桌面上。。

 

近几天开始着手编写这个c proxy。又有一些想法和思路。写出来。

1. 推

快信subscribe自己gid的channel。。后台以推的方式publish到每个订阅用户的队列

2. 拉

每个快信用户拿到自己的关注列表。过滤出在线的用户。。subscribe这些用户的channel。。。不过这种方式有些问题。在用户关注新的人或取消关注某些人的时候就不太好处理了。。

最终我决定采用推的方式。

新的起点

2007-12-04 10:17上面这个时间。是我在百度博客发表的第一篇文章。。今天把博客搬到这里。。又是一个新的起点。。。有了自己的域名和空间。。。新的开始。加油。 过段时间会把百度博客抓过来。。

 

我是回车。。你是啥?

文本框里的tag标签

有这样一个需求。在文本框里添加要邀请的用户。只用文字表现有点弱。。。找到下面一款插件。。

http://xoxco.com/projects/code/tagsinput/

直接$(‘#tag_1′).tagsInput();就能用。。。不过有几个问题

1. $(‘#tag_1′).tagExist(‘test’)不可用。。。原因是

    $.fn.tagExist = function(val) {

        return (jQuery.inArray(val, $(this)) >= 0); //true when tag exists, false when not
    };

而调用的地方是拆分后的tags_list.tagExist。。。而我们需要这样使用$(#tag_1).tagExist(‘test),改成这样

    $.fn.tagExist = function(val) {
        var id = $(this).attr(‘id’),
            tagslist = $(this).val().split(delimiter[id]);
        return (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not
    };

 

调用的地方改成这样:

var skipTag = $(this).tagExist(value);

 

增加一个方法:

    $.fn.getTagList = function() {
        var id = $(this).attr(‘id’);

        var tagslist = $(this).val().split(delimiter[id]);
        if (tagslist[0] == ”) {
            tagslist = new Array();
        }
        return tagslist;
    }

 

网页版在线聊天nginx来搞定

记得去年的时候使用nginx http push模块来做网页在线聊天的应用。。但是由于当时处于初期就搁下来了。。现在我们要做一个私信变聊天的应用。跟浪浪微博一样的。。

又上nginx module上找那个模块。。突然发现一个新的nginx http push stream模块。呵。这个模块已经production ready了。。就再次试用了一下。比去年那个模块有更多的新的特性:

1. 可以使用stream流的方式来做队列。

2. 可以使用html5的websocket来使用

3. 支持event source的方式

4. 支持传统的long-polling的方式

果断使用这个模块来搞。。官方的github有很详细的文档和example例子。。

但是在认证这里。。我使用了secure download link来作。时间设置的长点。一天。。。。。一天以后链接失效。可以采用其它策略再次向服务器要新的url。。。把/sub/  设置为internal的。只有经过rewrite过来的才会响应。

在我的测试中还有一个问题。就是我需要返回json格式的数据。使用jsonp请求。但是会导致解析失败。php curl过去会自动被pushstream.js转义。。需要在post之前加上addslashes进行二次转义。。。

OK。。。不知道稳定性怎么样。。

 

 

2012.03.07

又:因为pushstream.js在long-polling模式下在172行导致script为undefined。我们的项目是基于jquery的。所以在long-polling模式下进行了重写。不走作者的pushstream.js。代码如下:

    //创建链接的初始化
    connection_init: function(chat_url_info, method) {

var req = $.ajax({ ‘url': ‘http://’ + chat_url_info.server + chat_url_info.pre_path + ‘/’ + chat_url_info.channel,
                    success: function(data){
                        var PATTERN_MESSAGE = /{“id”:([-d]*),”channel”:”([^”]*)”,”text”:”(.*)”}/,
                        match = data.match(PATTERN_MESSAGE);
                        __chat.new_msg_act(match[3]);
                        __chat.connection_init(window.chat_info, ‘longpolling’);
                    },
                    timeout: 30010,
                    ‘dataType': ‘jsonp’});
                req.error(function() {
                        __chat.connection_init(window.chat_info, ‘longpolling’);
                    });

}