美文网首页
【转】Redis中Hash实现条件查询

【转】Redis中Hash实现条件查询

作者: 囍冯总囍 | 来源:发表于2020-09-03 14:26 被阅读0次

TAG

Redis,Lua,Redis条件查询,Redis Hash条件查询,Redis根据值内容查询

原文链接

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

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

List<String> resultKeys = (List<String>)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中去执行,提高效率。

相关文章

  • 【转】Redis中Hash实现条件查询

    TAG Redis,Lua,Redis条件查询,Redis Hash条件查询,Redis根据值内容查询 原文链接 ...

  • 03-Redis 操作之Hash操作

    Redis 操作之Hash操作 Hash操作,redis中Hash在内存中的存储格式如下: hset(name, ...

  • redis

    字符串 hash 哈希实际应用 一个关联的二维数组 多对多查询数据可以 塞在hash中 redis中的事务 tp...

  • redis数据结构详解之Hash

    redis中hash对单个key/value操作的命令演示 redis中hash的添加命令hset,如果key不存...

  • 一致性hash.md

    jedis中sharejedis一致性hash实现 Redis服务器节点划分:将每台服务器节点采用hash算法划分...

  • redis学习笔记(四)redis缓存与数据库一致性问题

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内...

  • 工作中遇到的hashtable

    一.redis 中使用的字典 redis的字典是由hash表实现的,代码主要是在dict.cpp/dict.h中 ...

  • linux下常用的一些命令

    查询8080端口 先找到进程号,在根据进程号找到启动信息 有关redis中hash的取值方式可以看到hashkey...

  • Redis 一致性Hash客户端实现

    Redis 一致性Hash客户端实现 Redis 分区有一种实现方案就是使用支持一致性Hash的客户端 Java好...

  • t_hash.c

    Redis的t_hash.c是对hash字典数据结构的实现。主要是基于ziplist、dict、sds实现。 当元...

网友评论

      本文标题:【转】Redis中Hash实现条件查询

      本文链接:https://www.haomeiwen.com/subject/voonsktx.html