【问题标题】:redis - mass inserts and countersredis - 批量插入和计数器
【发布时间】:2013-08-23 02:32:22
【问题描述】:

这是我在 stackoverflow 上的第一个问题。 亲爱的社区,非常感谢您的综合知识和专业知识!

我是 Redis 新手,所以请多多包涵,因为我确信有一个简单的解决方案。

redis-server --version

=> Redis 服务器 v=2.6.14 sha=00000000:0 malloc=libc bits=64

redis-cli --version

=> redis-cli 2.6.14

我已阅读“如何使用 Redis 批量插入?” How to use Redis mass insertion?
我在谷歌上搜索并阅读了很多对 redis INCR 功能的赞誉。但我并不真正了解所有内容,并且仅在 redis 内部执行此操作无济于事。

我的目标: 我想将 'n' 行文本导入 redis 并稍后按此顺序检索它们。

我为每一行设置一个唯一的键,如 key:1、key:2、key:3 等。 通过使用递增计数器作为键的一部分,我以后可以按照它们在 redis 中存储的相同顺序检索这些行。


现在(没有 redis 批量插入)我很容易解决这个问题 通过使用 awk 脚本生成 redis-cli 调用,例如:

cat data.txt | awk -f myscript.awk | bash

“data.txt”看起来像这样:
这是第一行。
这是更长的第二行。


“myscript.awk”看起来像这样:

#!/usr/bin/awk -f

### This section is being applied before any line is read:
BEGIN {
# Set counter initially to Zero
print "redis-cli SET counter 0"
}

### This section is being applied per line read into awk:
{
# Increase counter by One
print "redis-cli INCR counter"
# Read current counter from redis into an variable
print "MYCOUNTER=`redis-cli GET counter`"
# Use this variable as counter for the key
print "redis-cli SET key:$MYCOUNTER \"" $0 "\""
# Retrive stored value from redis for illustration
print "redis-cli GET key:$MYCOUNTER"
}

“cat data.txt | awk -f myscript.awk | bash”的输出为:

OK
(integer) 1
OK
"This is the first line."
(integer) 2
OK
"This here is the much longer second line."

所以一切都很好。


但不是在每个导入的行中调用两次“redis-cli” 我想使用 redis 的“批量插入”功能。在这里我需要你的帮助:

我将如何仅在 redis 中执行此类操作?

SET counter 0
=> OK
INCR counter
=> (integer) 1
GET counter
=> "1"
SET KEY:{counter} "Content of line 1"
=> OK
INCR counter
=> (integer) 2
GET counter
=> "2"
SET KEY:{counter} "Different content of line 2"
=> OK

等等等等

“GET counter”行仅用于说明。

感谢任何帮助。再次感谢!

伯尼

【问题讨论】:

    标签: redis


    【解决方案1】:

    为此使用一个列表。没有理由为每一行使用一个新密钥。所有的列表命令都是here,但你想要的是RPUSH。您可以在同一行中一次 rpush 多个值,因此您只需这样做:

    RPUSH some_key line1 line2 ... lineN
    

    然后去检索:

    LRANGE some_key 0 -1
    

    快速简单!

    【讨论】:

    • 非常感谢您的快速回答!像魅力一样工作:-) 我对哈希进行了一些修改,但列表元素以随机顺序返回。 LRANGE 完全按照它们使用 RPUSH 存储的顺序返回元素。漂亮! @Eli
    • 糟糕,我的评论有误。对不起!我试过“SADD”和“SMEMBERS”但没有成功。 “SMEMBERS”以随机顺序返回结果。由于Eli的回答@Eli,我很高兴结束我的问题
    猜你喜欢
    • 2013-09-23
    • 2014-04-20
    • 2018-07-18
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多