Redis简单案例(一) 网站搜索的热搜词

news/2024/5/16 22:01:26/文章来源:https://blog.csdn.net/weixin_34370347/article/details/89585906
原文:Redis简单案例(一) 网站搜索的热搜词

  对于一个网站来说,无论是商城网站还是门户网站,搜索框都是有一个比较重要的地位,它的存在可以说是

为了让用户更快、更方便的去找到自己想要的东西。对于经常逛这个网站的用户,当然也会想知道在这里比较“火”

的东西是什么,这个时候我们搜索框上的热词就起作用了。其实我觉得这一块的完善会对这个网站带来许多益处。

  可能现在比较普遍的做法是把这些相应的信息存到我们的关系型数据库中,如sql server 和 oracle。方便起见

的话,可能每搜索一次就往表里插一次数据,用的时候要先统计数据,统计完后再排序,最后才展示。这种情况下,

如果搜索量很大的话,表的膨胀速度就会非常快,如果sql没写好,查询的时候估计会。。相比Redis,同等条件下,

Redis的速率肯定是会较优,毕竟是从内存中拿出来的。

 

下面我们就用.NET Core和StackExchange.Redis来做一下这个简单的案例。

  案例用到的一些相关技术和说明:

技术说明 
.NET Core网站嘛,你懂的。有事没事用Core写写Demo,免得跟不上发展的脚步。
Redis存储搜索词,用了主从的模式,主写从读
Jquery-ui主要是用了里面的autocomplete

  开始正题之前,我们要确定用Redis中的那种数据结构,五种之中比较合适的应该是SortedSet,我们可以用成员来

作为搜索词,成员分数来作为搜索词的搜索次数,这样就可以很方便的来操作相关的数据了。

  下面开始正题:

  我们在开始的时候需要初始化一下数据。这里就直接在第一次运行的时候初始化。用上流水线的技术,速度还是

很可观的。初始化了70个搜索关键词(NBA球星),然后用随机数作为关键字的下标,去随机给这个关键字加1分。这

个分数就是这个关键字被搜索的次数。下面来看看初始化的相关代码:

 1         public IActionResult Index()
 2         {
 3             //keys
 4             IList<string> keys = new List<string>()
 5             {
 6                 "kobe","johnson","jabbar","west","o'neal","baylor","mccann","worthy","gasol","chamberlain",
 7                 "fisher","odom","bynum","horry","rambis","riley","clarkson","Williams","young","Russell",
 8                 "ingram","randle","nance","brown","deng","yi","ariza","artest","walton","vujacic",
 9                 "james","paul","curry","park","yao","kevin","wade","rose","popovich","leonard",
10                 "aldridge","ginobili","duncan","lavine","rubio","garnett","wiggins","westbrook","durant","ibaka",
11                 "nowitzki","pierce","crawford","love","smith","iguodala","barnes","green","thompson","harden",
12                 "lillard","mccollum","lin","jackson","nash","stoudemire","whiteside","dragic","Howard","batum"
13             };
14 
15             //init
16             Random random = new Random();
17             var tran = _redis.GetTransaction();
18             for (int i = 0; i < 1000000; i++)
19             {
20                 tran.SortedSetIncrementAsync(_searchKey, keys[random.Next(0, 70)], 1);
21             }
22             tran.ExecuteAsync();
23 
24             return View();
25         }

  这里是在加载这个页面的时候就把这些热搜词存进Redis中,这样我们才能有数据来演示啊。这里还用到了一个

非事务型的流水线。就是把要操作的指令存放到一个队列中,最后把这个队列扔到服务端去执行,这样就有效的减少

了不必要的网络传输,同时也提高了执行速度。

  好了,初始数据有了,下面要做的就是用户在搜索的时候,根据用户的输入去匹配搜索次数多的关键字,展示最

Hot的10个,当然这个展示的个数是随我们定的,最后可以考虑把这个放到我们的配置文件中去,甚至是放到数据库中,

为的是灵活和方便维护。下面是我们在后台的处理逻辑:

 1         public IActionResult GetHotKey(string key="")
 2         {
 3             if (string.IsNullOrEmpty(key))
 4             {//default
 5                 var res = _redis.ZRevRange(_searchKey, 0, 9);
 6                 var list = (from i in res select i.ToString());
 7                 return Json(list);
 8             }
 9             else
10             {//by user input
11                 var res = _redis.ZRevRange(_searchKey, 0, -1);
12                 var list = (from i in res select i.ToString()).Where(x => x.Contains(key)).Take(10).ToList();
13                 return Json(list);
14             }
15         }

  对于查询的处理是非常的简单的,用户不小心输入空格的时候就展示最热的10个关键词,如果用户有输入的话,就把

关键词中包含用户输入的展示出来。那么我们在页面上要做些什么呢?下面就是我们演示用的搜索框。

1 <div class="row">
2     <div class="col-md-6 col-md-offset-4" style="padding-top:50px;">
3         <input id="key" name="key" placeholder="search" class="form-control col-md-4">
4         <button class="btn btn-primary" type="button" id="searchSubmit">Search</button>
5         <div id="result"></div>
6     </div>
7 </div>

  相应的js是写到 scripts 这个section中的,js的话是比较简单的就是用ajax去请求我们要展示的数据。更多的应该是

jquery-ui的api问题,大家也可以换用自己比较熟悉的组件,举一反三即可。下面是autocomplete的api  ,如果有需要可

以去看一下。

 1 @section scripts{
 2     <script type="text/javascript">
 3         $(function () {
 4             //show hot keyword
 5             $("#key").autocomplete({                
 6                 source: function (request, response) {
 7                     $.ajax({
 8                         url: "@Url.Action("GetHotKey", "Auto")",
 9                         dataType: "json",
10                         data: {
11                             key: request.term
12                         },
13                         success: function (data) {
14                             response(data);
15                         }
16                     });
17                 },
18             });            
19     </script>
20 }
到这里,用户搜索前的操作,我们是做好了,下面先来看一下效果。

  那么用户点击了搜索之后我们要做些什么处理呢?无论是新的关键字还是已有的关键字,我们都是要做处理的,当然redis

中zincrby命令来处理这个是十分合适的,存在的就把分数加1,不存在就创建一个分数为1的成员。下面是搜索时的后台逻辑处理:

 1         [HttpPost]
 2         public IActionResult SetHotKey(string key)
 3         {
 4             if (!string.IsNullOrWhiteSpace(key))
 5             {
 6                 _redis.ZIncrby(_searchKey,key);
 7                 //other 
 8                 //...
 9                 return Json(new { code = "000", msg = "OK" });
10             }
11             else
12             {
13                 return Json(new { code = "999", msg = "keyword can not be empty!" });
14             }
15         }

  限制了用户不能搜索空关键字,在把这个关键字存储或者分数加一之后,就是展示我们的搜索的结果。这个搜索的结果一般

是从solr等全文检索的地方查出来的,不是我们讲的重点,所以就忽略了。然后我们还要加一段js去处理我们搜索的时候应该做的

操作。当然,都是些比较简单的操作。

 1              //search
 2             $("#searchSubmit").click(function () {
 3                 $.ajax({
 4                     url: "@Url.Action("SetHotKey", "Auto")",
 5                     dataType: "json",
 6                     type: "POST",
 7                     data: { key: $("#key").val() },
 8                     success: function (data) {
 9                         if (data.code == "000") {
10                             $("<p>search successful!</p>").appendTo("#result");
11                         } else {
12                             $("<p>"+data.msg+"</p>").appendTo("#result");
13                         }
14                     }
15                 });
16             });
下面是效果图: 

  在演示的时候,我们搜索了“我爱你”和“我不信”,在Redis的客户端我们找出搜索次数最少的6个,然后就可以看到我们那两

个关键字最的分数都是1。确定是刚插入的数据。

   到这里,我们做的这个热搜词可以说是大功告成了。当然这可以说是最最最简单的一个雏形。我们还可以适当的添加一些

东西让这个功能变得更加完善。比如我可以在搜索展示的时候显示一下搜索的次数等。

 最后是完整的控制器和页面代码:

 1 using AutoCompleteDemo.Common;
 2 using Microsoft.AspNetCore.Mvc;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 
 7 namespace AutoCompleteDemo.Controllers
 8 {
 9     public class AutoController : Controller
10     {
11         private readonly IRedis _redis;
12         private readonly string _searchKey = "search";        
13         public AutoController(IRedis redis)
14         {
15             _redis = redis;
16         }
17         
18         public IActionResult Index()
19         {
20             //keys
21             IList<string> keys = new List<string>()
22             {
23                 "kobe","johnson","jabbar","west","o'neal","baylor","mccann","worthy","gasol","chamberlain",
24                 "fisher","odom","bynum","horry","rambis","riley","clarkson","Williams","young","Russell",
25                 "ingram","randle","nance","brown","deng","yi","ariza","artest","walton","vujacic",
26                 "james","paul","curry","park","yao","kevin","wade","rose","popovich","leonard",
27                 "aldridge","ginobili","duncan","lavine","rubio","garnett","wiggins","westbrook","durant","ibaka",
28                 "nowitzki","pierce","crawford","love","smith","iguodala","barnes","green","thompson","harden",
29                 "lillard","mccollum","lin","jackson","nash","stoudemire","whiteside","dragic","Howard","batum"
30             };
31 
32             //init
33             Random random = new Random();
34             var tran = _redis.GetTransaction();
35             for (int i = 0; i < 2000000; i++)
36             {
37                 tran.SortedSetIncrementAsync(_searchKey, keys[random.Next(0, 70)], 1);
38             }
39             tran.ExecuteAsync();
40 
41             return View();
42         }
43 
44         public IActionResult GetHotKey(string key="")
45         {
46             if (string.IsNullOrEmpty(key))
47             {//default
48                 var res = _redis.ZRevRange(_searchKey, 0, 9);
49                 var list = (from i in res select i.ToString());
50                 return Json(list);
51             }
52             else
53             {//by user input
54                 var res = _redis.ZRevRange(_searchKey, 0, -1);
55                 var list = (from i in res select i.ToString()).Where(x => x.Contains(key)).Take(10).ToList();
56                 return Json(list);
57             }
58         }
59 
60         [HttpPost]
61         public IActionResult SetHotKey(string key)
62         {
63             if (!string.IsNullOrWhiteSpace(key))
64             {
65                 _redis.ZIncrby(_searchKey,key);
66                 //other 
67                 //...
68                 return Json(new { code = "000", msg = "OK" });
69             }
70             else
71             {
72                 return Json(new { code = "999", msg = "keyword can not be empty!" });
73             }
74         }
75     }
76 }
AutoController

 

 1 @{
 2     ViewData["Title"] = "Auto Complete";
 3 }
 4 <div class="row">
 5     <div class="col-md-6 col-md-offset-4" style="padding-top:50px;">
 6         <input id="key" name="key" placeholder="search" class="form-control col-md-4">
 7         <button class="btn btn-primary" type="button" id="searchSubmit">Search</button>
 8         <div id="result"></div>
 9     </div>
10 </div>
11 @section scripts{
12     <script type="text/javascript">
13         $(function () {
14             //show hot keyword
15             $("#key").autocomplete({                
16                 source: function (request, response) {                    
17                     $.ajax({
18                         url: "@Url.Action("GetHotKey", "Auto")",
19                         dataType: "json",
20                         data: {
21                             key: request.term
22                         },
23                         success: function (data) {
24                             response(data);
25                         }
26                     });
27                 },
28             });
29 
30             //search
31             $("#searchSubmit").click(function () {
32                 $.ajax({
33                     url: "@Url.Action("SetHotKey", "Auto")",
34                     dataType: "json",
35                     type: "POST",
36                     data: { key: $("#key").val() },
37                     success: function (data) {
38                         if (data.code == "000") {
39                             $("<p>search successful!</p>").appendTo("#result");
40                         } else {
41                             $("<p>"+data.msg+"</p>").appendTo("#result");
42                         }
43                     }
44                 });
45             });
46         });
47     </script>
48 }
Index.cshtml

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_746362.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正在从“vetur”获取代码操作_自己网站抓取手机号码代码

很多人疑惑网站和app中的手机电话号码数据是怎么抓取的&#xff0c;是如何实现的&#xff0c;我在这里说下。一、数据的来源现在数据的来源有很多种&#xff0c;我给大家说下常见的几种数据来源方式和抓取方式。1、运营商数据&#xff0c;这种来源方式的话是运营商会有一个http…

程序布置到服务器上速度慢_网站打开速度慢是什么原因?怎么解决呢?

“顾客是上帝”&#xff0c;不单单是商家赋予消费者的权利&#xff0c;也是消费者自身持有的观念。所以&#xff0c;很多用户在消费时&#xff0c;总是会站在自己的角度去思考问题&#xff0c;如访问某个网站时&#xff0c;希望网站能在3秒内缓冲自己想要的资讯&#xff0c;要不…

合法练习黑客技术?这15个网站也许可以帮到你

俗话说得好&#xff0c;最好的防守就是进攻&#xff0c;而这句话同样适用于信息安全领域。接下来&#xff0c;我们将给大家介绍15个最新的网络安全网站。无论你是开发人员、安全专家、审计人员、或者是渗透测试人员&#xff0c;你都可以利用这些网站来提升你的黑客技术。熟能生…

阶段巨献 - centos+php-fpm+mariaDB+svn+nodejs+redis(开机启动及配置远程连接),配置linux的php和nodejs网站运行环境。

前言 对于一个小项目和小公司而言&#xff0c;用php作为开发语言是很理智和聪明的选择&#xff0c;但是只要开发团队超过一个人&#xff0c;并且项目需要长时间持续开发下去&#xff0c;那么&#xff0c;一个相对稳定的运行环境及协同工作环境是必须的。 最近刚好转型做这些&…

【java开发部署】利用svn及ocaml及unison进行javaweb网站部署

前言 由于某个项目需要用到一些相对复杂的逻辑处理所以需要部署一个java网站作为支撑。于是就有了这篇文章。。 这篇文章立意是利用现有流程进行网站部署。 这个流程结合了&#xff1a; 阶段巨献 - centosphp-fpmmariaDBsvnnodejs&#xff0c;配置linux的php和nodejs网站运…

刚建的网站!

网址是:济南百度http://www.poster8.cnhttp://www.567wish.cn转载于:https://www.cnblogs.com/freeyzh/archive/2008/09/23/1297334.html

ASP.NET发布网站解决方案

ASP.NET发布网站解决方案 发布网站的时候有三个选项&#xff0c;很多人都不知道到底是怎么用的&#xff0c;简单说说&#xff1a; 对于想了解发布网站那些选项的人来说这个文章是不错的&#xff0c;当然这个文章不是我写的。 第一个选项指定发布后是不是可以修改aspx文件&…

WordPress4.9 最新版本网站安全漏洞详情与修复

2019独角兽企业重金招聘Python工程师标准>>> wordpress 目前互联网的市场占有率较高&#xff0c;许多站长以及建站公司都在使用这套开源的博客建站系统来设计网站&#xff0c;wordpress的优化以及html静态化&#xff0c;深受google以及搜索引擎的喜欢&#xff0c;全…

ASP.NET MVC3细嚼慢咽---(1)网站创建与发布

这一节我们演示下怎样使用VS2010创建与发布MVC3建立的网站。使用VS2010创建MVC3.0网站&#xff0c;需要下载MVC3.0的安装包&#xff0c;这个大家可以去网络上下载。 1.项目创建打开VS2010&#xff0c;选择 文件--新建项目---ASP.NET MVC3 web应用程序&#xff0c;如下图接着选择…

中等规模网站系统架构示意图

前言 略 经过思考及修正&#xff0c;目前可以将系统架构修改成为&#xff1a; 下一阶段&#xff0c;添加了rocketmq这个消息系统进行解耦&#xff0c;于是&#xff0c;架构变了一下&#xff1a; 近日&#xff0c;又对集群架构作了一番思考&#xff0c;于是又有了一点调整&…

ab测试网站吞吐率介绍

2019独角兽企业重金招聘Python工程师标准>>> 吞吐率介绍 何为吞吐率&#xff0c;解释下&#xff0c;就是在单位时间内服务器处理的请求数&#xff0c;这也许是我们衡量一个WEB站点很重要的一个指标&#xff0c;当10个用户同时发起100请求和1 个用户 同时向服务器发…

全面进入HTTPS网站加速新时代,CDN上线免费证书

摘要&#xff1a; 9月份发布的Chrome 70&#xff0c;将不再信任Symantec原品牌CA签发的数字证书。据悉&#xff0c;DigCert已经完全接管了Symantec证书业务&#xff0c;从接管之日起签发的证书已经是DigiCert的根证书&#xff0c;阿里云签发的免费证书都是DigiCert的根&#xf…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;亿万用户网站MySpace的成功秘密、Flickr架构、YouTube网站架构、PlentyOfFish 网站架构学习、WikiPedia技术架构学习笔记。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之…

spring boot 对多模块多网站项目利用webjars共用网站js/css等静态资源文件

前言 对于开发多个网站而言&#xff0c;每次都要手动将js/css/images复制过去是很烦的事情&#xff0c;尤其是js等修改以后要人工逐个更新那就更麻烦了。 下面就是解决这个问题的方案&#xff0c;请先参考&#xff1a; 打包WebJar实现对静态资源文件的统一依赖管理 下面是摘抄…

如何将网站升级为HTTPS协议(整理)

如何将网站升级为HTTPS协议&#xff08;整理&#xff09; 一、总结 一句话总结&#xff1a; 获取证书&#xff08;有免费有付费&#xff09;&#xff1a;证书是一个二进制文件&#xff0c;里面包含经过认证的网站公钥和一些元数据&#xff0c;要从经销商购买。 安装证书&#x…

大型网站系统架构分析

大型网站系统架构分析 千万级的注册用户&#xff0c;千万级的帖子&#xff0c;nTB级的附件&#xff0c;还有巨大的日访问量&#xff0c;大型网站采用什么系统架构保证性能和稳定性&#xff1f; 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理&#xff1a;负载…

【网站开发】搭建一个属入自己的网站

概述 搭建一个属入自己的网站 1.购买域名 主机屋http://www.zhujiwu.com/ 购买的域名&#xff1a;TechShare.xyz 2.购买虚拟主机&#xff08;空间&#xff09; http://www.zhujiwu.com/vhost/ 4.控制面板&#xff0c;配置虚拟主机 设置FTP密码 5.文件管理 管理方法&#xff1a;…

说说大型高并发高负载网站的系统架构(转)

转载请保留出处&#xff1a;俊麟 Michael’s blog (http://www.toplee.com/blog/?p71) Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p71 鄙人先后在CERNET做过拨号接入&#xff0c;在Yahoo&3721搞过搜索前端&#xff0c;在猫扑处理过mop.com的架构升级…

网站上线之前,基于SEO,该做哪些测试?

对于任何一个网站而言&#xff0c;在新站上线之初&#xff0c;每个SEO人员&#xff0c;都需要进行缜密的测试&#xff0c;用于辅助网站正式上线后&#xff0c;可以在搜索引擎中&#xff0c;有一个不错的排名。那么&#xff0c;新网站测试&#xff0c;都需要注意什么&#xff1f…

Java爬虫实战(一):抓取一个网站上的全部链接

Java爬虫实战&#xff08;一&#xff09;&#xff1a;抓取一个网站上的全部链接前言&#xff1a;写这篇文章之前&#xff0c;主要是我看了几篇类似的爬虫写法&#xff0c;有的是用的队列来写&#xff0c;感觉不是很直观&#xff0c;还有的只有一个请求然后进行页面解析&#xf…