- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经开始使用 redis今天,我已经完成了教程和 stackoverflow 上的一些链接,但我无法理解如何正确使用 redis 来处理它似乎是一个非常简单的用例。
目标: 将多个用户数据保存到 redis 中并一次读取所有用户。
我启动了一个 Redis 客户端,我首先添加了第一个 ID 为 1
的用户:
127.0.0.1:6379> hmset user:1 name "vitor" age 35
OK
127.0.0.1:6379> hgetall user:1
1) "name"
2) "vitor"
3) "age"
4) "35"
我添加了几个用户,执行了几个这样的命令:
127.0.0.1:6379> hmset user:2 name "nuno" age 10
我(可能是错误的)希望现在能够通过以下方式查询我的所有用户:
hgetall "user:"
甚至
hgetall "user:*"
事实上我在教程中没有看到这样的东西,这有点告诉我我没有为这个用例正确使用 redis。
您能告诉我这个用例应该采用什么方法吗?
最佳答案
要理解为什么这些类型的操作在 NoSQL 实现中看起来很重要,最好考虑一下 NoSQL 存在(并且变得非常流行)的原因。
当您查看像 memcached 这样的早期 NoSQL 实现时,第一个用例非常简单,但非常重要:分布式数据的超快缓存,例如缓存网页数据。很快就添加了集群和分片之类的东西,因此并非所有数据都必须同时在集群中的每个节点上随处可用,但可以按需收集。
NoSQL 与关系数据存储有很大不同。不要过度使用它。还要考虑关系数据库,因为它们有时更适合您要完成的任务。在您设计的所有内容中,问问自己“这种扩展性好吗?”。
好的,回到你的问题。进行通配符搜索通常是不好的做法。以可扩展的方式检索数据的方式准备数据。
Redis 是一个非常别致的解决方案,允许您以优雅的方式克服许多 NoSQL 限制。
如果获取“所有用户的列表”不是您必须经常做的事情,或者不需要很好地扩展,则总是“我真的总是想要所有用户”,因为无论如何,它都是用于每日扫描的,请使用 HSCAN
。具有适当批量大小的 SCAN
操作不会妨碍其他客户端,您一次只需检索几千条记录,几次调用后您就拥有了一切。
您还可以将用户存储在 SET
中。集合中没有顺序,所以没有分页。它有助于使您的用户名保持唯一。
如果您想执行诸如“获取所有以字母 'a' 开头的用户”之类的操作,我会使用 ZSET
。 ZRANGEBYLEX
我会等待一两周,它即将发布,就在我们说话的时候。或者使用像 Josiah Carlsons 的“rom”包这样的 ORM。
当您问自己“但是现在我在存储数据时必须执行三个调用而不是一个调用...?!”:是的,这就是它的工作原理。如果您需要原子性,请使用 Lua 脚本或 MULTI+EXEC 流水线。 Lua 通常更容易。
您也可以问问自己是否需要使用 HSET
。您需要检索各个数据成员吗?每个键或成员都有一些开销。最重要的是,HGETALL
具有 O(N)
的 Big-O 规范,因此它不能很好地扩展。最好使用 JSON 或 MsgPack 将整个行序列化,并将其存储在一个 HSET
成员中,或者只是一个简单的 GET
/SET
。另请阅读 SORT
。
希望这有帮助,TW
关于Redis:如何存储用户哈希列表并检索它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22923287/
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!