问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis怎么处理用户关系

发布网友 发布时间:2022-04-11 04:07

我来回答

1个回答

热心网友 时间:2022-04-11 05:36

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

用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                 //Distinct12                 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             else21             {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 count12                 _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         }

上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址

下面是模板的具体代码:

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.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 梦见死去的妈妈在水塘边上捡东西吃是什么意思? 梦见捡钱,去世的母亲,和追坏人 怎么关闭手机微博的新闻推送?设置已经关了热点推送但还是有,好恶心。。 手机内屏受损漏液过些日子为什么面积越来越小? 手机屏幕破裂问题? iphone6为什么屏幕碎了还会出现漏液这种情况? 听音乐会是一种怎的体验? 有谁知道在音乐会现场听的声音与在电视上CCTV音乐听的声音是一样的吗?还是有微弱的差别?有谁帮我解决一下? 我们该怎么听音乐会 演唱会到底是去看表演的还是去听歌的? 音乐有那么重要吗?有人花成千上万去听音乐会,怎么理解啊! 谁可以给我介绍一下音乐会是怎样的?一般在哪能听到?里面的场所,还有整场是多少时间的?一般票价是多少 初次听音乐会感受是怎样的? 1996和1997和1998的最大公因数是多少 42和98的最大公因数是? 现场音乐会 和听cd区别 98和75有公因数吗最大的 98和65的最大公因数是多少? 率土之滨进不去 84,98的最大公因数,最小公倍数 梦见跟妈妈在湖里捡金子和贝壳,本身都不会游泳,可是在湖里游的挺好的,水不深!求解!! 糯米蒸鸡的制作方法 梦到已故母亲站在水里玩 梦见和死去的母亲在水里游勇 糯米蒸鸡的菜谱? 梦见故去的母亲手里拿着零钱 糯米蒸鸡翅的做法是什么? 糯米塞鸡肚做法大全 分选机厂家国内排名? 水果多级分选机器有哪些品牌? 请问:重量分选机,可以分选水果吗? 谁家的重量分选机比较好 想采购涡电流分选机,哪家的好? 分选机哪个牌子好 长沙萨哈德矿石分选机械设备有限公司怎么样? mini led分选机全球供应商有哪些? 分选机哪家质量比较好,谢谢 海参快要收获了,想买海参分选机,哪家设备可靠? 中国光大银行小额贷款利率多少呀 MINI LED分选机国内谁家能生产?