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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 原文:Redis简单案例(二) 网站最近的访问用户  我们有时会在网站中看到最后的访问用户、最近的活跃用户等等诸如此类的一些信息。本文就以最后的访问用户为例, 用Redis来实现这个小功能。在这之前,我们可以先简单了解一下在oracle、sqlserver等关系型数据库中是怎么实现的。
原文: 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实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
21天前
|
NoSQL 安全 网络安全
Redis连接:加速数据访问与保障安全传输的关键
Redis连接:加速数据访问与保障安全传输的关键
|
1月前
|
NoSQL Java 数据库
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
|
2月前
|
缓存 NoSQL Java
一次访问Redis延时高问题排查与总结
作者抽丝剥茧的记录了一次访问Redis延时高问题的排查和总结。
414 1
|
3月前
|
存储 NoSQL 关系型数据库
Redis系列-8.Redis案例实战之Bitmap、Hyperloglog、GEO(下)
Redis系列-8.Redis案例实战之Bitmap、Hyperloglog、GEO
30 0
|
3月前
|
存储 NoSQL 算法
Redis系列-8.Redis案例实战之Bitmap、Hyperloglog、GEO(上)
Redis系列-8.Redis案例实战之Bitmap、Hyperloglog、GEO
50 0
|
9月前
|
存储 缓存 NoSQL
案例01-修改数据redis没有同步更新
修改数据redis没有同步更新
|
5月前
|
消息中间件 缓存 NoSQL
阿里云国际站代理商:Redis实现分布式配置管理的方法与应用案例
@luotuoemo飞机@TG阿里云国际站代理商:Redis实现分布式配置管理的方法与应用案例,为了实现高可用和负载均衡,可以将Redis部署成哨兵集群或集群模式。哨兵负责监控主从节点的状态,发现故障时自动进行故障转移。集群模式可以提高系统的可扩展性,通过添加更多的从节点来分摊负载压力。
|
7月前
|
缓存 NoSQL 关系型数据库
课时3:通过缓存来加速数据库访问(MySQL+Redis)
课时3:通过缓存来加速数据库访问(MySQL+Redis)
153 0
|
8月前
|
NoSQL Redis Docker
访问redis集群提示连接超时的问题
访问redis集群提示连接超时的问题
174 0
|
8月前
|
NoSQL Redis 开发工具
redis搭建群集案例
redis搭建群集案例,共六个redis数据库