使用Redis记录用户在线状态
哈希表(HashTable)是一种数据结构,它实现了“键-值”(Key-Value)的映射。根据Key就能快速找到Value 。并且,无论有多少个键值对,查询时间始终不变。Python的字典就是基于哈希表实现的。
在Redis中也有一个数据结构叫作哈希表。
在Redis中,使用哈希表可以保存大量数据,且无论有多少数据,查询时间始终保持不变。
Redis的一个哈希表里面可以储存2的32次方减1(约等于43亿)个键值对。
现在, 一些论坛网站能够显示用户当前是在线状态还是离线状态。那这个功能是怎么实现的呢?其中一种实现方法就是基于Redis来实现
程序的逻辑非常简单,包括以下几个步骤:
(1).用户登录时,在Redis中添加一个字符串, Key为用户账号, Value为1 。
(2).用户退出网站时,从Redis中删除账号名对应的Key 。
(3).查询时,程序尝试从Redis中获取用户账号对应的字符串:如果值为1 ,则表示“在线";如果值为None,则表示“不在线”。
分别使用字符串和哈希表记录用户的在线信息, 井比较在这个场景下哈希表相对于字符串有什么优势?
如果有1000个用户同时在线,则Redis列出所有Key后的结果如图:
现在,网站又加入了一个积分机制。每个用户都有一个积分数据,由于这个数据需要经常查询和修改,因此也使用Redis来保存
那问题来了, 在线信息使用用户账号作为Key, 积分信息也使用账号作为Key,这不就冲突了吗?
于是有人给不同的Key加上了后缀。例如,记录用户是否在线,使用的Key为“账号:online”。如果用户账号为10032,那他的在线状态Key就是“10032:online” 。记录用户积分的Key为“账号:score”,例如用户10032对应的积分Key为“10032:score”
注意:在Redis中, Key 中的冒号就是普通的字符,用来分割前缀和后缀,没有什么特殊意义。写成“10032_online”或者“10032-score”效果完全一样
使用hash存储的代码示例:
• 第12行代码:向Redis中名为user_online_status的哈希表中添加一个字段, 字段名为用户账号,值为l 。如果不存在名为user_online_status的哈希表, 则自动创建一个。
• 第21行代码:从Redis中名为user online status 的晗希表中删除一个字段,宇段名为用户账号。
• 第30行代码:检查名为user_online_status的哈希表中是否有某个特定的宇段, 如果没有这个字段就返回False,如果有这个字段就返回True。
使用晗希表不仅可以减少Redis 的个数, 还能优化储存空间。Red is 官方就特别说明,哈希表对存储结构进行过特殊的优化,储存相同的内容,占用的内存比字符串要小很多。
- 使用 Redis 统计在线用户人数
- 使用HttpSessionListener接口实现用户在线状态监控
- 记录用户状态与过滤方法(过滤器使用)
- 使用ASP记录在线用户的数量的代码
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(九) 之 用 Redis 实现用户在线离线状态消息处理(一)
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(八) 之 用 Redis 实现用户在线离线状态消息处理
- 使用redis实现获取在线用户列表
- 实战中使用 Redis 统计在线用户人数
- jsp利用session记录登陆状态,保证用户的使用连贯性,并且防止未登录用户绕过登陆页
- 使用ASP记录在线用户的数量的代码
- 在线用户统计使用说明
- 使用python检测手机QQ在线状态的脚本代码
- 浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】
- 使用文件历史记录保护用户文件
- php获取qq用户昵称和在线状态(实例分析)
- 使用HttpSessionBindingListener获取在线用户人数及名单
- 使用Hashtable维护在线用户时的一个小错误。
- 浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】
- c#如何使用webservice、存储过程及存储过程的创建(简单模仿类似QQ统计用户在线时间为例)
- 广泛使用的一个对特定在线用户发送系统消息的程序