<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///&lt;summary&gt; 2///simulatinguserlogin 3///&lt;/summary&gt; 4///&lt;paramname=&quot;name&quot;&gt;&lt;/param&gt; 5///&lt;returns&gt;&lt;/returns&gt; 6[HttpPost(&quot;/login&quot;)] 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=&quot;000&quot;,msg=string.Format(&quot;{0}loginsuccessfully&quot;,name)}; 18returnJson(json); 19} 20else 21{ 22varjson=new{code=&quot;001&quot;,msg=&quot;namecan&#39;tbeempty&quot;}; 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///&lt;summary&gt; 2///getthelast5loginuser 3///&lt;/summary&gt; 4///&lt;returns&gt;&lt;/returns&gt; 5[HttpGet(&quot;/login/last&quot;)] 6publicIActionResultGetLastFiveLoginUser() 7{ 8varlen=_redis.LLen(_key); 9if(len&gt;_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=&quot;000&quot;,msg=&quot;ok&quot;,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:&quot;/login&quot;, 4data:{&quot;name&quot;:name}, 5dataType:&quot;json&quot;, 6method:&quot;POST&quot;, 7success:function(res){ 8if(res.code==&quot;000&quot;){ 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:&quot;/login/last&quot;, 4data:{}, 5dataType:&quot;json&quot;, 6success:function(res){ 7if(res.code==&quot;000&quot;){ 8varhtml=template(&#39;lastLoginUserTpl&#39;,res); 9$(&quot;#lastLoginUser&quot;).html(html); 10} 11} 12}); 13}</pre><p>  上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址:https://github.com/aui/artTemplate</p><p>下面是模板的具体代码:</p><pre class="brush:bash;toolbar:false">1&lt;scriptid=&quot;lastLoginUserTpl&quot;type=&quot;text/html&quot;&gt; 2&lt;ul&gt; 3{{eachdataasitem}} 4&lt;li&gt; 5{{item}} 6&lt;/li&gt; 7{{/each}} 8&lt;/ul&gt; 9&lt;/script&gt;</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>
T:0.006541s,M:252.02 KB
返回顶部 留言