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

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

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

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

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

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

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

一些数据的操做,我的认为,List是个比较好的选择。 redis

  要记录下是那个用户的访问,必需要有一个登录的操做控制。sql

 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掉,而后才把新的记录json

push进去。数据结构

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

处理:当不足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.

相关文章
相关标签/搜索