Redis、会话过期和反向查找

2024-05-09

我目前正在构建一个网络应用程序,并想使用 Redis 来存储会话。登录时,会话会使用相应的用户 ID 插入到 Redis 中,并且过期时间设置为 15 分钟。我现在想实现会话的反向查找(获取具有特定用户 ID 的会话)。这里的问题是,由于我无法搜索Redis键空间,因此如何实现这一点。一种方法是为每个 userId 设置一个 redis,其中包含所有会话 ID。但由于 Redis 不允许集合中的项目过期,并且会话设置为过期,因此集合中将存在大量不存在的会话 ID。

在密钥过期时从集合中删除 id 的最佳方法是什么?或者,有没有更好的方法来完成我想要的(反向查找)?


在当前版本分支上雷迪斯 (2.6),当物品过期时,您无法收到通知。它可能会随着下一个版本而改变。

同时,为了支持您的要求,您需要手动实现过期通知支持。所以你有了:

session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>

你需要删除sessionid会话过期时从用户设置。因此,您可以维护一个额外的排序集,其分数是时间戳。

当您为用户 100 创建会话 10 时:

MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC

然后,您需要构建一个守护进程,它将轮询 zset 以识别要过期的会话(ZRANGEBYSCORE https://redis.io/commands/zrangebyscore)。对于每个过期的会话,它必须维护数据结构:

  • 将会话从 zset 中弹出(ZREMRANGEBYRANK https://redis.io/commands/zremrangebyrank)
  • 检索会话用户 ID (HMGET https://redis.io/commands/hmget)
  • 删除会话(DEL https://redis.io/commands/del)
  • 从用户 ID 集中删除会话(SREM https://redis.io/commands/srem)

主要困难是确保守护进程轮询和处理项目时不存在竞争条件。请参阅我对此问题的回答,了解如何实施:

基于redis如何处理session过期? https://stackoverflow.com/questions/11810020/how-to-handle-session-expire-basing-redis/11815594#11815594

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis、会话过期和反向查找 的相关文章

  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • 通过 StackExchange.Redis 连接到 Redis Servier

    我尝试使用以下方法制作一个测试项目Redis https redis io服务器 通过 Virtual Box 安装在 Linux Ubuntu 虚拟机上 Linux 机器通过 Virtual Box 的桥接适配器与本地网络连接 Virtu
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • 如何使用 Redis 自动删除与模式匹配的键

    在我的 Redis DB 中 我有很多prefix
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • Spring Redis 排序键

    我在 Redis Spring Data Redis 中有以下键 localhost gt Keys 1 id 1 Name C5796 Site DRG1 2 id 2 Name CX1XE Site DG1 3 id 3 Name C5
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP

随机推荐

  • jQuery 查找 id 以total 开头的所有li

    我有以下内容 但只想循环 lines 中 id 以total 开头的行 lines li each function 有任何想法吗 Lee lines li id total each function
  • 如何检查 Gmail 标签是否有嵌套子标签?

    使用Google Apps脚本 是否有一个功能可以检查Gmail标签是否有嵌套子标签 如果标签有一个或多个子标签 我想将它们从代码序列中排除 没有直接的方法可以从 父 标签获取标签 但是使用简单的方法来获取标签非常简单getUserLabe
  • 我可以将日历事件与 Microsoft Graph API 同步吗?

    我正在使用 Microsoft Graph api 尝试从 Outlook 同步日历事件 我在看本文 https msdn microsoft com en us office office365 api calendar rest ope
  • 是否可以开发一个可以跟踪其他应用程序使用情况的应用程序?

    我很想知道是否有可能为 iOS 开发一款类似的应用程序 就像本周刚刚发布的 Android 版应用程序一样 https play google com store apps details id com appuccino Frequenc
  • 如何从 SonarQube api 获取超过 500 个问题

    我在 java 工具中使用 SonarQube API 来处理问题并向其添加注释 更改问题状态 例如不会修复 api issues search 功能的页面大小限制为最多 500 个 我有超过 500 个问题 需要阅读此内容 我想过执行多个
  • 双击事件 - 多个范围

    我正在寻找为双击事件在多个范围内进行编码的最佳方法 Private Sub Worksheet BeforeDoubleClick ByVal Target As Range Cancel As Boolean If Not Interse
  • 如何为背景图像添加内边距

    我有一个LinearLayout其中有一个背景图像 一个 9 修补的 png 文件 如何向左和右添加填充 以使背景图像不占据整个宽度 我努力了android paddingLeft and android paddingRight 但这并没
  • vue:转义并渲染 HTML 字符串?

    我正在尝试在模板中渲染一些 HTML 字符串 但我希望它们是字符串 我不想渲染 富文本 我开始于
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • 如何使用 SVN/Tortoise 从 Google Code 下载代码?

    我刚刚看到一个非常酷的 WPF Twitter 客户端 我认为它是由 Herding Code 播客开发的畜牧法 http www herdingcode com called Witty http code google com p wi
  • 科学规划中的可重复性

    除了产生不正确的结果之外 科学编程中最令人担忧的事情之一就是无法重现生成的结果 哪些最佳实践有助于确保您的分析具有可重复性 在线发布原始原始数据并免费提供下载 使代码库开源并可在线下载 如果在优化中使用随机化 则重复优化多次 选择结果的最佳
  • 在 React Native 中集成 Stack、Drawer 和 Tab Navigator

    我尝试在一个项目中一起实现 Stack Drawer 和 Tab Navigator 但它没有达到我的预期 首先 创建选项卡导航器 一个是 主页 另一个是 职业 接下来 创建 Stack Navigator 并将抽屉集成到 Navigati
  • 如何在 where 子句中使用别名? [复制]

    这个问题在这里已经有答案了 可能的重复 在 WHERE 子句中引用列别名 https stackoverflow com questions 8370114 referring to a column alias in a where cl
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • JavaScript 数组中的负索引是否会影响数组长度?

    在javascript中我定义了一个像这样的数组 var arr 1 2 3 我也可以做 arr 1 4 现在如果我这样做 arr undefined 我也失去了对值的引用arr 1 所以对我来说 从逻辑上来说 arr 1 也是arr 但是
  • 如何在对话框中配置自定义按钮?

    这里我有一个自定义对话框 里面有背景 2 ImageButton 问题是 当我尝试为该按钮设置 onclick 侦听器时 程序将返回 NullPointerException 我不知道为什么会发生这种情况 无论如何如何将操作分配给对话框内的
  • 资源注入不适用于 glassfish 4,而查找可以工作

    我在应用程序范围托管 bean 中使用 glassfish 4 进行资源注入 但 glassfish 无法工作 而是使用默认的 derby 数据库 这是我的代码 Named value dbManager ApplicationScoped
  • Docker 构建器构建与 docker 构建

    在 Docker 的文档页面上 有一个条目码头工人建造者 https docs docker com engine reference commandline builder 这是父命令docker 构建器构建 https docs doc
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无