CNode

关于redis的hash存储

Ppeiweippww发布于13 年前最后回复13 年前7 回复18974 浏览0 收藏

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)

P
peiweippww#1·13 年前

别沉

A
a272121742#2·13 年前

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

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

P
peiweippww#3·13 年前
引用 a272121742当然可以,就要使用我写的JSV了。(不过貌似没发布,只有我们团队的在用) 大致是这样的,JSON你可以理解为他是等同于XML的。XML有PATH解析,那么JSON也有PATH解析工具。我之前写...

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

J
jiangzhuo#5·13 年前

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

S
shiedman#6·13 年前

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

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

再以一个array来维护在线user_id

参与回复
登录后即可参与回复。登录