<p>我们有时会在网站中看到最后的访问用户、最近的活跃用户等等诸如此类的一些信息。本文就以最后的访问用户为例,</p><p>用Redis来实现这个小功能。在这之前,我们可以先简单了解一下在oracle、sqlserver等关系型数据库中是怎么实现的。</p><p>不可否认至少会有一张表来记录,根据时间desc排序,再取出前几条数据。下面来看看怎么用Redis来实现这个小功能:</p><p> </p><p> 案例用到的一些相关技术和说明:</p><p>技术<span class="Apple-tab-span" > </span>说明</p><p>Redis<span class="Apple-tab-span" > </span>存储数据,用了主从的模式,主写从读</p><p>artTemplate<span class="Apple-tab-span" > </span>主要是用于显示最后登陆的5位用户的名称</p><p> 简单的思考:要用Redis的那种数据结构来存储这些数据呢?我们只要显示最后的5个访问用户(游客不在统计之内),结合</p><p>一些数据的操作,个人认为,List是个比较好的选择。</p><p> 要记录下是那个用户的访问,必须要有一个登陆的操作控制。</p><pre class="brush:bash;toolbar:false">1///<summary>
2///simulatinguserlogin
3///</summary>
4///<paramname="name"></param>
5///<returns></returns>
6[HttpPost("/login")]
7publicIActionResultLogin(stringname)
8{
9if(!string.IsNullOrWhiteSpace(name))
10{
11//Distinct
12vartran=_redis.GetTransaction();
13tran.ListRemoveAsync(_key,name,1);
14tran.ListLeftPushAsync(_key,name);
15tran.Execute();
16
17varjson=new{code="000",msg=string.Format("{0}loginsuccessfully",name)};
18returnJson(json);
19}
20else
21{
22varjson=new{code="001",msg="namecan'tbeempty"};
23returnJson(json);
24}
25}</pre><p> 在处理登陆时,难免会出现这样的情况,在一段时间内只有1个用户登陆,而且这个用户还由于一些原因登陆了多次,所以</p><p>我们需要简单的处理一下,让我们的List只记录下最新的那个记录就好,所以要先把已经存在的先remove掉,然后才把新的记录</p><p>push进去。</p><p> 接下来就是处理要显示的信息了。我们需要先知道我们的key中已经有多少个元素(用户)了,然后根据这个数量来进行不同的</p><p>处理:当不足5个的时候,就不用进行ltrim操作,直接取全部数据就好了,超过5个时,就先用ltrim处理一下,再取List中的数据。</p><pre class="brush:bash;toolbar:false">1///<summary>
2///getthelast5loginuser
3///</summary>
4///<returns></returns>
5[HttpGet("/login/last")]
6publicIActionResultGetLastFiveLoginUser()
7{
8varlen=_redis.LLen(_key);
9if(len>_loginUserAmount)
10{
11//limitthecount
12_redis.LTrim(_key,0,_loginUserAmount-1);
13}
14varlist=(fromiin_redis.LRange(_key,0,-1)selecti.ToString());
15
16varjson=new{code="000",msg="ok",data=list};
17returnJson(json);
18}</pre><p> 到这里,我们的后台逻辑已经实现了,下面就是前台的展示了。</p><p> 要模拟多个用户登陆,所以就用了几个按钮来模拟,触发点击事件就是登陆成功。登陆成功之后自然在更新最近的访问用户信</p><p>息,所以要在登陆成功的回调函数中去刷新一下访问用户的信息。登陆的function如下:</p><pre class="brush:bash;toolbar:false">1 functionlogin(name){
2$.ajax({
3url:"/login",
4data:{"name":name},
5dataType:"json",
6method:"POST",
7success:function(res){
8if(res.code=="000"){
9getLastFiveLoginUser();
10}else{
11console.log(res.msg);
12}
13}
14});
15}</pre><p> 下面就是登陆成功的回调函数,取到数据后便向模板中灌数据,然后把根据模板得到的html放到id为lastLoginUser的div中。</p><p>具体代码如下:</p><pre class="brush:bash;toolbar:false">1functiongetLastFiveLoginUser(){
2$.ajax({
3url:"/login/last",
4data:{},
5dataType:"json",
6success:function(res){
7if(res.code=="000"){
8varhtml=template('lastLoginUserTpl',res);
9$("#lastLoginUser").html(html);
10}
11}
12});
13}</pre><p> 上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址:https://github.com/aui/artTemplate</p><p>下面是模板的具体代码:</p><pre class="brush:bash;toolbar:false">1<scriptid="lastLoginUserTpl"type="text/html">
2<ul>
3{{eachdataasitem}}
4<li>
5{{item}}
6</li>
7{{/each}}
8</ul>
9</script></pre><p></p><p>好了,到这里是前后台都处理好了,下面来看看效果:</p><p> 可以看到,正如我们的预期,只显示最后登陆的5个用户的名称。</p><p> 再来看看redis里面的数据:</p><p> </p><p> 正好应验了前面说的只保留了最后的5个。</p><p> 记录最新的一些日记信息、交易信息等等都是属于一个大类的,其实对于这一类问题,都是可以用List来处理的,可以来看看</p><p>官网的这段话,这段话包含了许多的应用场景。 </p><p> This pair of commands will push a new element on the list, while making sure that the list will not grow larger</p><p>than 100 elements. This is very useful when using Redis to store logs for example. It is important to note that</p><p>when used in this way LTRIM is an O(1) operation because in the average case just one element is removed from</p><p>the tail of the list.</p><p></p>