关于redis的hash存储
发布于 11 年前 作者 peiweippww 18494 次浏览 最后一次编辑是 8 年前

redis可以通过hash存储来做数据的存储,如: data_obj = { fight_state : 1, other_state : 0 }; redis_client.hset( ‘online_users’, user_id, JSON.stringify( data_obj ), cb ); 然后这样我们就可以得到一个在线用户的列表online_users。同时如果某个用户状态就行更新我们也可以用 redis_client.hset去更改某个用户的值,而不用像memcache一样去更新整个用户列表。

我的问题是: 这样得到的列表只有一层目录,如果我只想更新某个用户下面fight_state,而不是通过整个date_obj替换来实现局部数据更新,可以实现不?

7 回复

当然可以,就要使用我写的JSV了。(不过貌似没发布,只有我们团队的在用)

大致是这样的,JSON你可以理解为他是等同于XML的。XMLPATH解析,那么JSON也有PATH解析工具。我之前写过一个,用起来超爽的那种。

可能是我没表述清楚,我不是指JSON的PATH解析,我的问题是:redis支不支持不止一层路径的修改操作,hash存储只能做一层目录,再往下走就得全部替换了。

@peiweippww 要不考虑直接用redis 的orm 算了…https://github.com/maritz/nohm

可以考虑用lua scripting 来实现,如果修改fight_state不是一个很耗时的操作,可以考虑一下这种实现。 不过一般遇到这种情况,大家会把fight——state other——state 拆成两个使用 另外一种方法是修改redis自己实现一下,这种方法老外似乎比较喜欢用,谁让redis开源呢。

每个用户对应一个独立的hash

hset('online_user:id1',fight_state,1);
hset('online_user:id2',fight_state,0);

再以一个array来维护在线user_id

@peiweippww 通过path解析可以做到深层、多层修改,JSON.set('a.b.c.d',value);

回到顶部