redis里的hash类型怎么查询value?

 我来答
___Acrowded
2018-01-04 · TA获得超过1.5万个赞
知道小有建树答主
回答量:137
采纳率:100%
帮助的人:2.1万
展开全部

这样的查询,在Redis是没办法通过value进行比较得出结果的。

但是可以通过不同的数据结构类型来做到这一点,比如如下的数据定义:

  1. users:1 {name:Jack,age:28,location:shanghai}
    users:2 {name:Frank,age:30,location:beijing}
    users:location:shanghai

  2. 其中users:1 users:2 分别定义了两个用户信息,通过Redis中的hash数据结构users:location:shanghai 记录了所有上海的用户id,通过集合数据结构实现。

  3. Jedis jedis = jedisPool.getResource();SetshanghaiIDs = jedis.smembers("users:location:shanghai");//遍历该set//...//通过hgetall获取对应的user信息jedis.hgetAll("users:" + shanghaiIDs[0]);

  4. ID索引的集合,其次对于一些复杂查询无能为力(当然也不能期望Redis实现像关系数据库那样的查询,Redis不是干这的);

  5. 但是Redis2.6集成了Lua脚本,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。其实,就是说可以让你用Lua这种脚本语言,对Redis中存储的key value进行操作,这个意义就大了,甚至可以将你们系统所需的各种业务写成一个个lua脚本;

  6. public static final String SCRIPT ="local resultKeys={};"+ "for k,v in ipairs(KEYS) do "+ " local tmp = redis.call('hget', v, 'age');"+ " if tmp > ARGV[1] then "+ " table.insert(resultKeys,v);"+ " end;"+ "end;"+ "return resultKeys;";执行脚本代码Jedis jedis = jedisPool.getResource();jedis.auth(auth);Listkeys=Arrays.asList(allUserKeys);Listargs = new ArrayList<>();args.add("28");ListresultKeys = (List)jedis.evalsha(funcKey, keys, args);return resultKeys;

    注意:以上的代码中使用的是evalsha命令,该命令参数的不是直接Lua脚本字符串,而是提前已经加载到Redis中的函数的一个SHA索引,通过以下的代码将系统中所有需要执行的函数提前加载到Redis中,我们的系统维护一个函数哈希表,后续需要实现什么功能,就从函数表中获取对应功能的SHA索引,通过evalsha调用就行。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式