当前位置: 首页 > article >正文

asp.net core系统记录当前在线人数

实时记录当前在线人数,登录后保持120秒在线状态,在线状态保存在缓存中,采用滑动过期,在120秒内请求了系统,自动续活120秒;超过时间则移除用户在线状态;

  • 需要在登录过滤器标记用户在线状态
  • 需要排除循环请求的url,比如定时请求的待办数量
  • 登录成功后标记用户在线

web记录当前在线人数状态

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;
using System.Text;
using System.Threading.Tasks;

namespace WuZiFenGongSiInfomation.Models
{
    /// <summary>
    /// 当前在线人数
    /// </summary>
    /// 2024-12-26 9:57:09, wanghaoli
    public class OnlineUserAmount
    {
        static System.Collections.Concurrent.ConcurrentDictionary<string, bool> dict = new System.Collections.Concurrent.ConcurrentDictionary<string, bool>();

        /// <summary>
        /// 添加在线人
        /// </summary>
        /// <param name="userId">用户主键id</param>
        /// 2024-12-26 9:57:09, wanghaoli
        public static void AddUserOnline(string userId)
        {
            dict.TryAdd(userId, true);

            System.Runtime.Caching.MemoryCache.Default.AddOrGetExisting("AddUserOnline." + userId, 1, new CacheItemPolicy()
            {
                SlidingExpiration = TimeSpan.FromSeconds(120),
                RemovedCallback = (args) =>
                {
                    string userId2 = args.CacheItem.Key;
                    System.Diagnostics.Debug.WriteLine("移除用户在线状态 ,key=" + userId2);
                    LogHelpter.AddLog("移除用户在线状态,key=" + userId2, null, "UserOnline");

                    string userId3 = userId2.Replace("AddUserOnline.","");
                    bool removeResult = dict.TryRemove(userId3, out bool k);
                    if (removeResult)
                    {
                        System.Diagnostics.Debug.WriteLine("移除用户在线状态成功,key=" + userId2);
                        LogHelpter.AddLog("移除用户在线状态成功,key=" + userId2, null, "UserOnline");
                    }
                }
            });
        }


        /// <summary>
        /// 标记用户在线,续活
        /// </summary>
        /// <param name="userId"></param>
        /// 2024-12-26 10:04:09,   wanghaoli
        public static void VisitUseStatCache(string userId)
        {
            string key = "AddUserOnline." + userId;
            bool exists = System.Runtime.Caching.MemoryCache.Default.Contains(key);
            if (exists)
            {               
            }
            else
            {
                AddUserOnline(userId);
            }
            System.Diagnostics.Debug.WriteLine("激活用户在线状态,key=" + userId);
            LogHelpter.AddLog("激活用户在线状态,key=" + userId,null, "UserOnline");
        }

        /// <summary>
        /// 当前在线人数
        /// </summary>
        /// <returns></returns>
        public static int GetOnlineUserAmount()
        {
            return dict.Count;
        }
    }
}


http://www.kler.cn/a/455640.html

相关文章:

  • 组建基于IPV6的网络
  • 更新本地项目到最新git版本脚本
  • 每天40分玩转Django:Django Email
  • 微服务网关路由
  • node.js高级用法
  • LeetCode -Hot100 - 56. 合并区间
  • 【centos8 镜像修改】centos8 镜像修改阿里云
  • c++编译过程初识
  • 【Java 代码审计入门-03】XSS 漏洞原理与实际案例介绍
  • MFC扩展库BCGControlBar Pro v36.0 - 可视化管理器等全新升级
  • Vision Transformer (ViT) 论文的第二句话
  • 踏踏实实练SQLday2-3连续12345
  • 机器学习2-NumPy
  • 华为 IPD,究竟有什么特点?(二)
  • scala图书借阅系统完整代码
  • 基于Docker的ETCD分布式集群
  • SQL-leetcode-180. 连续出现的数字
  • ctfshow web 笔记
  • 分布式 I/O 配合高冗余 PLC,打造高效控制新典范
  • BUG分析 - 重启有时失败