【问题标题】:SQL like insert and select using JEDIS使用 JEDIS 插入和选择类似 SQL
【发布时间】:2017-04-24 21:30:47
【问题描述】:

所以我一直在尝试使用 Jedis 将我们的数据库从 mysql 迁移到 Redis。我明白在 Redis 上,一切都是关键和价值。但我有几个基本问​​题。

1) 假设我有一个 Mammals 类,其成员为 eyes,ears,nose,hand,legs。所以现在我可以有多个值,例如

2,2,1,2,2

2,3,1,1,2

1,2,1,6,2

每一行表示他们拥有的数字。 2个眼睛,2个耳朵,1个鼻子,2个手,2个腿。

我想存储这些数据,就像我们以前在 mySQL 中所做的那样,在那里,每一列都会有它们的值。但是使用Jedis 我该如何实现呢?

我尝试使用自动递增键值并使用jedis.sadd(jedis.get("counter"),stringg_value) 存储所有这些值

当我尝试使用索引打印任何值时,我可以非常清楚地看到, 值不是我添加的顺序。如果我将字符串值添加为“一、二、三、四”,结果将是“四、二、三、一”。而且这是非常随机的,并不是所有的值都会采用这种格式,它们也会发生变化。

我的问题是如何将 csv 格式的数据存储到 Redis 中?

2) 如何根据多个条件从Jedis 获取数据。像哺乳动物一样,有 2 只耳朵、2 只眼睛和 4 只手。我应该使用什么方法?

【问题讨论】:

  • RDBMS 和键值存储是不同的东西。您正在亲眼观察其中的一些差异。为正确的工作使用正确的工具。从 MySQL“迁移”到 Redis 就像把你的汽车变成一艘船。
  • 我明白你在说什么,但是我有一个要求,我必须选择-插入-选择某些数据匹配模式。在那里,SQL 花费了太多时间,但我相信在那种情况下,redis 会像魅力一样工作。
  • 我尝试优化 SQL 端,但无论是否经常,我都会得到某种锁定,最终导致系统变慢。整个计算大约需要 150 毫秒,但是这些许多 SQL 连接最终需要大约 250 毫秒才能完成。我仍在探索这些选项。
  • 听起来您对 SQL 也不是很熟悉。在这种情况下,改变技术并没有真正的帮助。一个更好的主意是创建一个新问题来解释您的 SQL 问题。它可能会比这个解决得更快。
  • 你说得对,没有经验,希望得到一些关于如何摆脱缓慢的指导。这是我之前在 SO 上发布的问题之一:stackoverflow.com/questions/42899224/…

标签: java redis jedis


【解决方案1】:

存储值的一种方法是使用 Redis 哈希类型来存储每一行​​。使用哈希,您可以拥有灵活的模式并按名称存储每个属性。您还需要一个唯一的键来查找每一行,可能是名称。代码看起来像:

 Map<String,String> row = new HashMap<>();

 row.put("eyes", String.valueOf(2));
 row.put("ears", String.valueOf(2));

 ...

 jedis.hmset("wombat", row);

查询更难。 Redis 不像 SQL 那样提供通用查询语言。您需要预先确定查询并维护二级索引结构或根据您的查询将行数据映射到不同的数据结构。

查看Redis.io 以了解可用的数据类型。您可能会发现,根据您的查询,采用完全不同的方法来存储数据可能更有意义。

您可能希望重组数据以创建具有特定属性的不同动物的集合。

ears_2 = ('wombat', 'dragon')
ears_3 = ('mutant wombat', 'mutant dragon')
legs_4 = ('wombat', 'dragon')

然后您可以使用设置交集来模拟您的 AND 查询。

【讨论】:

  • 但是,如果一个人使用redis,他/她将需要存储和查询。如果 redis 只能帮助存储,那么它有什么帮助?这是否意味着一个人也必须使用 redis 和另一个 RDBMS 数据库?
  • 如果您对通用查询语言有强烈的需求并且无法枚举应用程序中的查询,那么使用 Redis 存储和查询数据可能不是最好的解决方案。另一种可能会给您带来更好结果的替代方法是将查询结果缓存在 Redis 中并努力优化您的 MySQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2014-08-05
  • 2014-10-26
  • 2014-10-05
  • 1970-01-01
  • 2013-01-04
  • 2017-05-29
相关资源
最近更新 更多