这是我当前在 bash 中的代码(基于 https://redis.io/docs/latest/develop/use/patterns/bulk-loading):
head=$(redis-cli -h $redis_server get .git-head)
if [[ ! $head ]]; then
redis-cli -h $redis_server flushdb
for fileOrFolder in $(ls -1); do
time {
find $fileOrFolder -type f |
LC_ALL=C xargs -n1 bash -c 'echo -e *3\\r\\n\$3\\r\\nSET\\r\\n\$${#0}\\r\\n$0\\r\\n\$$(stat -c%s $0)\\r && cat $0 && echo -e \\r' |
redis-cli -h $redis_server --pipe
}
done
redis-cli -h $redis_server set .git-head $(git rev-parse HEAD)
fi
它可以工作,但有一个问题 - 值的类型是
string
,而不是 JSON
。至少 Redis Insights 是这么告诉我的。
我的问题是 - 如何修改代码以确保存储的值是
JSON
类型?或者甚至 - 我应该修改它吗?也许 string
类型已经足够好了,不会限制我们的查询能力。
如果不需要对数据本身执行复杂的查询,那么使用字符串就可以了。 如果你仍然想以JSON类型存储,你可以使用JSON.SET命令而不是SET 针对您的问题
time {
find $fileOrFolder -type f |
LC_ALL=C xargs -n1 bash -c 'file_content=$(cat $0 | jq -Rs .); \
file_size=$(stat -c%s $0); \
redis-cli -h $redis_server json.set $0 . "{\"file\":\"$0\",\"size\":\"$file_size\",\"content\":$file_content}"'
}