永发信息网

redis里的hash类型怎么模糊查询value

答案:1  悬赏:0  手机版
解决时间 2021-03-20 00:41
redis里的hash类型怎么模糊查询value
最佳答案
Redis不仅仅是一个简单的key-value内存数据库,Redis官网对自身的定义是“数据结构服务器”。通过用心设计各种数据结构类型的数据存储,可以实现部分的数据查询功能。因为在Redis的设计中,key是一切,对于Redis是可见的,而value对于Redis来说就是一个字节数组,Redis并不知道你的value中存储的是什么,所以要想实现比如
‘select * from users where user.location="shanghai"’

这样的查询,在Redis是没办法通过value进行比较得出结果的。但是可以通过不同的数据结构类型来做到这一点。比如如下的数据定义

users:1 {name:Jack,age:28,location:shanghai}
users:2 {name:Frank,age:30,location:beijing}
users:location:shanghai [1]
其中users:1 users:2 分别定义了两个用户信息,通过Redis中的hash数据结构,而users:location:shanghai 记录了所有上海的用户id,通过集合数据结构实现。这样通过两次简单的Redis命令调用就可以实现我们上面的查询。

Jedis jedis = jedisPool.getResource();
Set shanghaiIDs = jedis.smembers("users:location:shanghai");
//遍历该set
//...
//通过hgetall获取对应的user信息
jedis.hgetAll("users:" + shanghaiIDs[0]);
通过诸如以上的设计,可以实现简单的条件查询。但是这样的问题也很多,首先需要多维护一个ID索引的集合,其次对于一些复杂查询无能为力(当然也不能期望Redis实现像关系数据库那样的查询,Redis不是干这的)。

但是Redis2.6集成了Lua脚本,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。其实,就是说可以让你用Lua这种脚本语言,对Redis中存储的key value进行操作,这个意义就大了,甚至可以将你们系统所需的各种业务写成一个个lua脚本,提前加载进入Redis,然后对于请求的响应,只需要调用一个个lua脚本就行。当然这样说有点夸张,但是意思就是这样的。

比如,现在我们要实现一个‘所有age大于28岁的user’这样一个查询,那么通过以下的Lua脚本就可以实现

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);
List keys = Arrays.asList(allUserKeys);

List args = new ArrayList<>();
args.add("28");

List resultKeys = (List)jedis.evalsha(funcKey, keys, args);
return resultKeys;
注意,以上的代码中使用的是evalsha命令,该命令参数的不是直接Lua脚本字符串,而是提前已经加载到Redis中的函数的一个SHA索引,通过以下的代码将系统中所有需要执行的函数提前加载到Redis中,我们的系统维护一个函数哈希表,后续需要实现什么功能,就从函数表中获取对应功能的SHA索引,通过evalsha调用就行。
String shaFuncKey = jedis.scriptLoad(SCRIPT);//加载脚本,获取sha索引
funcTable.put(funcName_age, shaFuncKey);//添加到函数表中
通过以上的方法,便可以使较为复杂的查询放到Redis中去执行,提高效率。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
全峰快递南岗站在哪里啊,我有事要去这个地方
电池浸水了擦干还可以用吗?
蓝德润滑油质量怎么样?
难看的近义词是什么
akb48 team surprise是什么意思?挑出一些人
微信号被恶意举报发大量垃圾信息封号了,做营
Photoshop CS5中RGB和CMYK中的灰色的颜色值是
请问,有江西省南昌市进贤县白于乡这个地方吗?
老李手抓饭这个地址在什么地方,我要处理点事
青少年该选什么样的牙膏
算命孤身寡须什么意思
一个明星 假唱被发现 后来道歉得到粉丝原谅是
报关金额和信用证金额不一致
找工作要找六点下班还是八九点的,六点下班后
对产品图纸进行工艺性审查的目的是
推荐资讯
男生怎么练小腿塑腿型,穿马裤短裤好看?
劲与美健身馆地址在什么地方,想过去办事
一什么灯光 量词
以我给爷爷捶背为题写一篇作文五百字
红磊窗帘布艺地址好找么,我有些事要过去,
人工挖石渣土应该套什么定额
cf复仇者容易开吗5张可以开出来吗。
零之使魔i say yes的简谱
推荐:POM与PP比,哪个更耐磨
古人将礼分为哪五种
强调货币当局对货币供求起核心影响作用的经济
赵家地址有知道的么?有点事想过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?