Redis应⽤(⼀)实时在线⽤户
前⾔
本系列教程是在学习《Redis实战》同时,利⽤ Redis 解决实际的业务问题。
问题
项⽬⾥有⼀个功能是实时数据看板,其中有⼀项数据是实时在线⽤户数。
解决⽅案
常见的解决⽅案有三种:
1. 列表
2. 数据库
3. Redis
列表
使⽤编程语⾔⾥的列表,⽐如C#的List或者Java的ArrayList,保存到内存⾥。
好处:读写快,访问内存快。
坏处:程序内⽆法共享,⽐如在 api 层记录⽤户状态,在后台显⽰数据。
数据库
把⽤户的状态保存到数据库⾥,读取时也从数据库查询。
好处:连接上数据库的应⽤都能访问。
坏处:并发⾼时,数据库会出现性能问题。
Redis
以上两种⽅法,都存在各⾃的问题,⽽Redis有以上两种⽅法的好处,没有它们的坏处。
Redis基于内存进⾏读写的,性能⽐数据库要⾼很多,⽀持分布式访问,其他应⽤都能够使⽤。
解决步骤:
1. 记录⽤户状态(api)。使⽤有序列表保存⽤户状态,并且设置⼀个过期时间作为Score。
2. 获取实时在线⽤户数(api)。直接通过有序列表获取长度,例如StackExchange.Redis⾥的SortedSetLength。
3. 定时清理过期的在线⽤户(后台服务)。例如StackExchange.Redis⾥的SortedSetRemoveRangeByScore。using System;
using System.Diagnostics;
using System.Threading;
using StackExchange.Redis;
namespace RealtimeOnlineUser
{
class Program
{
static void Main(string[] args)
{
var redis = new RedisHelper("localhost:6379", "", 15);
new Program(redis.GetDatabase()).TestOnlineUser();
}
private IDatabase _db;
private string _key = "online";
public Program(IDatabase db)
{
this._db = db;
}
public void TestOnlineUser()
{
Console.WriteLine("------ TestOnlineUser ------");
Console.WriteLine("Add user per 10s.");
var tokens = new string[] { "1", "2", "3", "4", "5" };
foreach (var token in tokens)
{
Thread.Sleep(10 * 1000); // 每10s添加⼀⽤户
Console.WriteLine($"{token} Logined.");
SetToken(token);
}
Console.WriteLine("Waiting for 35s.");
Thread.Sleep(35 * 1000);
Console.WriteLine("Clean overdue user.");
Clean();
var count = _db.SortedSetLength(_key);writeline教程
Console.WriteLine($"Online user count: {count}.");
Debug.Assert(count == 3);
}
private void SetToken(string token)
{
long timestamp = GetCurrentMilliseconds() + 60 * 1000; // 缓存60s
_db.SortedSetAdd(_key, token, timestamp);
}
private void Clean()
{
// 清空过期的⽤户
long timestamp = GetCurrentMilliseconds();
_db.SortedSetRemoveRangeByScore(_key, 0, timestamp);
}
private long GetCurrentMilliseconds()
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
long timestamp = (long) (DateTime.Now - startTime).TotalMilliseconds; // 相差秒数
return timestamp;
}
}
}
总结
上⾯通过Redis来实现实时在线⽤户数功能。其他类似的数据也可以通过Redis来实现,⽐如最多访问URL top10、⽤户区域分布等等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论