Redis简单案例(二) 网站最近的访问用户
我们有时会在网站中看到最后的访问用户、最近的活跃用户等等诸如此类的一些信息。本文就以最后的访问用户为例,
用Redis来实现这个小功能。在这之前,我们可以先简单了解一下在oracle、sqlserver等关系型数据库中是怎么实现的。
不可否认至少会有一张表来记录,根据时间desc排序,再取出前几条数据。下面来看看怎么用Redis来实现这个小功能:
技术 | 说明 |
Redis | 存储数据,用了主从的模式,主写从读 |
artTemplate | 主要是用于显示最后登陆的5位用户的名称 |
简单的思考:要用Redis的那种数据结构来存储这些数据呢?我们只要显示最后的5个访问用户(游客不在统计之内),结合
一些数据的操作,个人认为,List是个比较好的选择。
要记录下是那个用户的访问,必须要有一个登陆的操作控制。
/// <summary>
/// simulating user login
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpPost("/login")]
public IActionResult Login(string name)
{
if (!string.IsNullOrWhiteSpace(name))
{
//Distinct
var tran = _redis.GetTransaction();
tran.ListRemoveAsync(_key, name, );
tran.ListLeftPushAsync(_key, name);
tran.Execute(); var json = new { code="",msg= string.Format("{0} login successfully",name) };
return Json(json);
}
else
{
var json = new { code = "", msg = "name can't be empty" };
return Json(json);
}
}
在处理登陆时,难免会出现这样的情况,在一段时间内只有1个用户登陆,而且这个用户还由于一些原因登陆了多次,所以
我们需要简单的处理一下,让我们的List只记录下最新的那个记录就好,所以要先把已经存在的先remove掉,然后才把新的记录
push进去。
接下来就是处理要显示的信息了。我们需要先知道我们的key中已经有多少个元素(用户)了,然后根据这个数量来进行不同的
处理:当不足5个的时候,就不用进行ltrim操作,直接取全部数据就好了,超过5个时,就先用ltrim处理一下,再取List中的数据。
/// <summary>
/// get the last 5 login user
/// </summary>
/// <returns></returns>
[HttpGet("/login/last")]
public IActionResult GetLastFiveLoginUser()
{
var len = _redis.LLen(_key);
if (len > _loginUserAmount)
{
//limit the count
_redis.LTrim(_key, , _loginUserAmount-);
}
var list = (from i in _redis.LRange(_key, , -) select i.ToString()); var json = new { code="",msg="ok",data = list };
return Json(json);
}
要模拟多个用户登陆,所以就用了几个按钮来模拟,触发点击事件就是登陆成功。登陆成功之后自然在更新最近的访问用户信
息,所以要在登陆成功的回调函数中去刷新一下访问用户的信息。登陆的function如下:
function login(name) {
$.ajax({
url: "/login",
data: { "name": name },
dataType: "json",
method: "POST",
success: function (res) {
if (res.code == "000") {
getLastFiveLoginUser();
} else {
console.log(res.msg);
}
}
});
}
下面就是登陆成功的回调函数,取到数据后便向模板中灌数据,然后把根据模板得到的html放到id为lastLoginUser的div中。
具体代码如下:
function getLastFiveLoginUser() {
$.ajax({
url: "/login/last",
data: {},
dataType: "json",
success: function (res) {
if (res.code == "000") {
var html = template('lastLoginUserTpl', res);
$("#lastLoginUser").html(html);
}
}
});
}
上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址:https://github.com/aui/artTemplate
<script id="lastLoginUserTpl" type="text/html">
<ul>
{{each data as item}}
<li>
{{item}}
</li>
{{/each}}
</ul>
</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简单案例(一) 网站搜索的热搜词
对于一个网站来说,无论是商城网站还是门户网站,搜索框都是有一个比较重要的地位,它的存在可以说是 为了让用户更快.更方便的去找到自己想要的东西.对于经常逛这个网站的用户,当然也会想知道在这里比较“火” ...
- SpringDataRedis操作Redis简单案例
Jedis Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用.可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis.SRP等等,推荐使 ...
- Redis简单案例(四) Session的管理
负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是会跟着增长,这个时候, 一般都会对其进行负载均衡等相应的调整.现如今最常见的应该就是使用Nginx来进 ...
- Redis简单案例(三) 连续登陆活动的简单实现
连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送游戏币之类的东西,商城就送一些礼券.正值国庆,应该也有不 ...
- Redis 实战 —— 11. 实现简单的社交网站
简介 前面介绍了广告定向的实现,它是一个查询密集型 (query-intensive) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...
- Redis入门很简单之二【常见操作命令】
Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存 Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...
- Java中Redis简单入门
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...
- WPF+MVVM学习总结 DataGrid简单案例
一.WPF概要 WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的 ...
- Spring Kafka和Spring Boot整合实现消息发送与消费简单案例
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...
随机推荐
- Http状态码之:301、302重定向
概念 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编辑功能的客户端应当自动把请求的地 ...
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- android 使用Tabhost 发生could not create tab content because could not find view with id 错误
使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...
- 让kindeditor显示高亮代码
kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: ...
- .NET面试题集锦①(Part一)
一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...
- 反应器(Reactor)和主动器(Proactor)
网络方面用的比较多的库是libevent和boost.asio,两者都是跨平台的.其中libevent是基于Reactor实现的,而boost.asio是基于Proactor实现的.Reactor和P ...
- 【干货分享】流程DEMO-补打卡
流程名: 补打卡申请 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片 ...
- Apache Cordova开发Android应用程序——番外篇
很多天之前就安装了visual studio community 2015,今天闲着么事想试一下Apache Cordova,用它来开发跨平台App.在这之前需要配置N多东西,这里找到了一篇MS官方文 ...
- MySQL+Amoeba实现数据库主从复制和读写分离
MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...
- OpenGL ES 3.0: 图元重启(Primitive restart)
[TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...