原文:Redis简单案例(二) 网站最近的访问用户

  我们有时会在网站中看到最后的访问用户、最近的活跃用户等等诸如此类的一些信息。本文就以最后的访问用户为例,

用Redis来实现这个小功能。在这之前,我们可以先简单了解一下在oracle、sqlserver等关系型数据库中是怎么实现的。

不可否认至少会有一张表来记录,根据时间desc排序,再取出前几条数据。下面来看看怎么用Redis来实现这个小功能:

案例用到的一些相关技术和说明:
技术 说明
Redis 存储数据,用了主从的模式,主写从读
artTemplate 主要是用于显示最后登陆的5位用户的名称

  简单的思考:要用Redis的那种数据结构来存储这些数据呢?我们只要显示最后的5个访问用户(游客不在统计之内),结合

一些数据的操作,个人认为,List是个比较好的选择。

  要记录下是那个用户的访问,必须要有一个登陆的操作控制。

 1         /// <summary>
 2         /// simulating user login
 3         /// </summary>
 4         /// <param name="name"></param>
 5         /// <returns></returns>
 6         [HttpPost("/login")]
 7         public IActionResult Login(string name)
 8         {
 9             if (!string.IsNullOrWhiteSpace(name))
10             {
11                 //Distinct
12                 var tran = _redis.GetTransaction();
13                 tran.ListRemoveAsync(_key, name, 1);
14                 tran.ListLeftPushAsync(_key, name);
15                 tran.Execute();
16
17                 var json = new { code="000",msg= string.Format("{0} login successfully",name) };
18                 return Json(json);
19             }
20             else
21             {
22                 var json = new { code = "001", msg = "name can't be empty" };
23                 return Json(json);
24             }
25         }

  在处理登陆时,难免会出现这样的情况,在一段时间内只有1个用户登陆,而且这个用户还由于一些原因登陆了多次,所以

我们需要简单的处理一下,让我们的List只记录下最新的那个记录就好,所以要先把已经存在的先remove掉,然后才把新的记录

push进去。

  接下来就是处理要显示的信息了。我们需要先知道我们的key中已经有多少个元素(用户)了,然后根据这个数量来进行不同的

处理:当不足5个的时候,就不用进行ltrim操作,直接取全部数据就好了,超过5个时,就先用ltrim处理一下,再取List中的数据。

 1         /// <summary>
 2         /// get the last 5 login user
 3         /// </summary>
 4         /// <returns></returns>
 5         [HttpGet("/login/last")]
 6         public IActionResult GetLastFiveLoginUser()
 7         {
 8             var len = _redis.LLen(_key);
 9             if (len > _loginUserAmount)
10             {
11                 //limit the count
12                 _redis.LTrim(_key, 0, _loginUserAmount-1);
13             }
14             var list = (from i in _redis.LRange(_key, 0, -1) select i.ToString());
15
16             var json = new { code="000",msg="ok",data = list };
17             return Json(json);
18         }

到这里,我们的后台逻辑已经实现了,下面就是前台的展示了。

  要模拟多个用户登陆,所以就用了几个按钮来模拟,触发点击事件就是登陆成功。登陆成功之后自然在更新最近的访问用户信

息,所以要在登陆成功的回调函数中去刷新一下访问用户的信息。登陆的function如下:

 1      function login(name) {
 2             $.ajax({
 3                 url: "/login",
 4                 data: { "name": name },
 5                 dataType: "json",
 6                 method: "POST",
 7                 success: function (res) {
 8                     if (res.code == "000") {
 9                         getLastFiveLoginUser();
10                     } else {
11                         console.log(res.msg);
12                     }
13                 }
14             });
15         }

  下面就是登陆成功的回调函数,取到数据后便向模板中灌数据,然后把根据模板得到的html放到id为lastLoginUser的div中。

具体代码如下:

 1       function getLastFiveLoginUser() {
 2             $.ajax({
 3                 url: "/login/last",
 4                 data: {},
 5                 dataType: "json",
 6                 success: function (res) {
 7                     if (res.code == "000") {
 8                         var html = template('lastLoginUserTpl', res);
 9                         $("#lastLoginUser").html(html);
10                     }
11                 }
12             });
13         }

  上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址:https://github.com/aui/artTemplate

下面是模板的具体代码:
1 <script id="lastLoginUserTpl" type="text/html">
2         <ul>
3             {{each data as item}}
4             <li>
5                 {{item}}
6             </li>
7             {{/each}}
8         </ul>
9 </script>

好了,到这里是前后台都处理好了,下面来看看效果:

  可以看到,正如我们的预期,只显示最后登陆的5个用户的名称。

  再来看看redis里面的数据:

  

  正好应验了前面说的只保留了最后的5个。

  记录最新的一些日记信息、交易信息等等都是属于一个大类的,其实对于这一类问题,都是可以用List来处理的,可以来看看

官网的这段话,这段话包含了许多的应用场景。 

  This pair of commands will push a new element on the list, while making sure that the list will not grow larger

than 100 elements. This is very useful when using Redis to store logs for example. It is important to note that

when used in this way LTRIM is an O(1) operation because in the average case just one element is removed from

the tail of the list.

Redis简单案例(二) 网站最近的访问用户相关推荐

  1. Redis简单案例(四) Session的管理

    Redis简单案例(四) Session的管理 原文:Redis简单案例(四) Session的管理 负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是 ...

  2. Redis简单案例(三) 连续登陆活动的简单实现

    原文:Redis简单案例(三) 连续登陆活动的简单实现 连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送 ...

  3. redis简单了解 二 (集群)

    集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增 ...

  4. 基于redis简单实现网站访问量计数

    环境准备: 如果不熟悉redis和springboot简单整合的小伙伴可以先移步我之前的文章喔,里面有详细教学~ https://blog.csdn.net/weixin_47025166/artic ...

  5. 主动访问用户数据 ——被站长忽视的内容

    什么是主动访问用户 主动访问用户也可以称为忠诚用户.自有用户,搜索引擎可以通过多种渠道和手段定位网站的主动访问用户.主动访问用户包括但不限: 1.需要答案.需要解决问题时,自然而然想到某网站的用户 2 ...

  6. php记录网站访问,PHP简单实现记录网站访问量的功能

    这篇文章主要介绍了PHP简单实现记录网站访问量功能,涉及php针对文件加锁读写及日期时间转换等相关操作技巧,需要的朋友可以参考下 本文实例讲述了PHP简单实现记录网站访问量功能.分享给大家供大家参考, ...

  7. neo4j︱Cypher 查询语言简单案例(二)

    图数据库常规的有:neo4j(支持超多语言).JanusGraph/Titan(分布式).Orientdb,google也开源了图数据库Cayley(Go语言构成).PostgreSQL存储RDF格式 ...

  8. 用php建设一个简单的网站,PHP_PHP新手上路(六),建设一个简单交互的网站(二) 5 - phpStudy...

    PHP新手上路(六) 建设一个简单交互的网站(二) 5.5 计数器 让我们在首页上加上一个计数器.这个例子已经被讲过多次了,但是还是有利于演示怎样读写文件以及创建自己的函数.counter.inc包含 ...

  9. led HAL简单案例分析

    mr_raptor的专栏 专注Android系统,移动平台研究,ARM BSP开发,著有<深入浅出嵌入式底层软件开发>北航出版社 目录视图 摘要视图 订阅 CSDN Android客户端 ...

最新文章

  1. css中调整高度充满_CSS(十三).高度如何铺满全屏
  2. POJ3272 Cow Traffic
  3. App.js – 用于移动 Web App 开发的 JS 界面库
  4. 16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat
  5. java 编译开关_java – 字符串是关于开关的数字类型,并始终编译为lookupswitch?
  6. TWebBrowser的基本应用
  7. 20172332 2017-2018-2 《程序设计与数据结构》实验三报告
  8. matlab控制算法C语言,PID算法Matlab仿真程序和C程序
  9. 我的宽带是100兆,为什么到户只有30-50兆,我应该换成什么型号的路由器?
  10. python的猴子补丁monkey patch
  11. 中小学数字化标准音乐教室建设及设备配套方案
  12. vue刘海屏兼容组件
  13. Redis持久化之RDB(详解)
  14. 理解时间:时间时区那些事
  15. 通过OpenCV库实现基于FMM的图像修复概述
  16. arcgis中hgt格式的dem数据tiff转换
  17. 2023最新盲盒H5商城系统小程序源码+支持抽奖功能/VUE内核开发
  18. 如何把flv格式无损转换成mp4
  19. 最最基础的前端技能(上)
  20. 进程地址空间 - 地址空间布局

热门文章

  1. numpy实现神经网络代码(mnist手写体识别)
  2. 不同虚拟局域网Vlan配置DHCP服务器
  3. dnf单机无线连接服务器,dnf单机云服务器
  4. 最邻近方法nn_【庖丁解牛】从零实现RetinaNet(七):使用分布式方法训练RetinaNet...
  5. python 条形图_Python数据可视化:基于matplotlib绘制「堆积条形图」
  6. C++新增头文件.h,静态库.lib
  7. 【知识星球】Attention网络结构上新,聚焦才能赢
  8. [caffe解读] caffe从数学公式到代码实现2-基础函数类
  9. 泛亚凭借一粒薏米-农业大健康·田亚:对话农民丰收节交易会
  10. 软件设计师笔记---流水线