Redis网站热搜关键词加载实践,建议收藏

news/2024/5/9 7:54:24/文章来源:https://blog.csdn.net/u012811805/article/details/117341581

侠梦的开发笔记回复【面试题】获取2021年最新java面试题合集~

来源:Catcher8

www.cnblogs.com/catcher1994/p/5877262.html

对于一个网站来说,无论是商城网站还是门户网站,搜索框都是有一个比较重要的地位,它的存在可以说是为了让用户更快、更方便的去找到自己想要的东西。对于经常逛这个网站的用户,当然也会想知道在这里比较“火”的东西是什么,这个时候我们搜索框上的热词就起作用了。其实我觉得这一块的完善会对这个网站带来许多益处。

可能现在比较普遍的做法是把这些相应的信息存到我们的关系型数据库中,如sql server 和 oracle。方便起见的话,可能每搜索一次就往表里插一次数据,用的时候要先统计数据,统计完后再排序,最后才展示。这种情况下,如果搜索量很大的话,表的膨胀速度就会非常快,如果sql没写好,查询的时候估计会。。相比Redis,同等条件下,Redis的速率肯定是会较优,毕竟是从内存中拿出来的。

 

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

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

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

开始正题之前,我们要确定用Redis中的那种数据结构,五种之中比较合适的应该是SortedSet,我们可以用成员来作为搜索词,成员分数来作为搜索词的搜索次数,这样就可以很方便的来操作相关的数据了。

下面开始正题:

我们在开始的时候需要初始化一下数据。这里就直接在第一次运行的时候初始化。用上流水线的技术,速度还是很可观的。初始化了70个搜索关键词(NBA球星),然后用随机数作为关键字的下标,去随机给这个关键字加1分。这个分数就是这个关键字被搜索的次数。下面来看看初始化的相关代码:

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

这里是在加载这个页面的时候就把这些热搜词存进Redis中,这样我们才能有数据来演示啊。这里还用到了一个非事务型的流水线。就是把要操作的指令存放到一个队列中,最后把这个队列扔到服务端去执行,这样就有效的减少了不必要的网络传输,同时也提高了执行速度。

好了,初始数据有了,下面要做的就是用户在搜索的时候,根据用户的输入去匹配搜索次数多的关键字,展示最Hot的10个,当然这个展示的个数是随我们定的,最后可以考虑把这个放到我们的配置文件中去,甚至是放到数据库中,

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

public IActionResult GetHotKey(string key=""){if (string.IsNullOrEmpty(key)){//defaultvar res = _redis.ZRevRange(_searchKey, 0, 9);var list = (from i in res select i.ToString());return Json(list);}else{//by user inputvar res = _redis.ZRevRange(_searchKey, 0, -1);var list = (from i in res select i.ToString()).Where(x => x.Contains(key)).Take(10).ToList();return Json(list);}}

对于查询的处理是非常的简单的,用户不小心输入空格的时候就展示最热的10个关键词,如果用户有输入的话,就把关键词中包含用户输入的展示出来。那么我们在页面上要做些什么呢?下面就是我们演示用的搜索框。

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

相应的js是写到 scripts 这个p中的,js的话是比较简单的就是用ajax去请求我们要展示的数据。更多的应该是jquery-ui的api问题,大家也可以换用自己比较熟悉的组件,举一反三即可。下面是autocomplete的api  ,如果有需要可以去看一下。

@p scripts{<script type="text/javascript">$(function () {//show hot keyword$("#key").autocomplete({                source: function (request, response) {$.ajax({url: "@Url.Action("GetHotKey", "Auto")",dataType: "json",data: {key: request.term},success: function (data) {response(data);}});},});            </script>
}

到这里,用户搜索前的操作,我们是做好了,下面先来看一下效果。

那么用户点击了搜索之后我们要做些什么处理呢?无论是新的关键字还是已有的关键字,我们都是要做处理的,当然redis中zincrby命令来处理这个是十分合适的,存在的就把分数加1,不存在就创建一个分数为1的成员。下面是搜索时的后台逻辑处理:

[HttpPost]public IActionResult SetHotKey(string key){if (!string.IsNullOrWhiteSpace(key)){_redis.ZIncrby(_searchKey,key);//other //...return Json(new { code = "000", msg = "OK" });}else{return Json(new { code = "999", msg = "keyword can not be empty!" });}}

限制了用户不能搜索空关键字,在把这个关键字存储或者分数加一之后,就是展示我们的搜索的结果。这个搜索的结果一般是从solr等全文检索的地方查出来的,不是我们讲的重点,所以就忽略了。然后我们还要加一段js去处理我们搜索的时候应该做的操作。当然,都是些比较简单的操作。

//search$("#searchSubmit").click(function () {$.ajax({url: "@Url.Action("SetHotKey", "Auto")",dataType: "json",type: "POST",data: { key: $("#key").val() },success: function (data) {if (data.code == "000") {$("<p>search successful!</p>").appendTo("#result");} else {$("<p>"+data.msg+"</p>").appendTo("#result");}}});});

下面是效果图:

在演示的时候,我们搜索了“我爱你”和“我不信”,在Redis的客户端我们找出搜索次数最少的6个,然后就可以看到我们那两个关键字最的分数都是1。确定是刚插入的数据。

到这里,我们做的这个热搜词可以说是大功告成了。当然这可以说是最最最简单的一个雏形。我们还可以适当的添加一些东西让这个功能变得更加完善。比如我可以在搜索展示的时候显示一下搜索的次数等。

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

using AutoCompleteDemo.Common;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;namespace AutoCompleteDemo.Controllers
{public class AutoController : Controller{private readonly IRedis _redis;private readonly string _searchKey = "search";        public AutoController(IRedis redis){_redis = redis;}public IActionResult Index(){//keysIList<string> keys = new List<string>(){"kobe","johnson","jabbar","west","o'neal","baylor","mccann","worthy","gasol","chamberlain","fisher","odom","bynum","horry","rambis","riley","clarkson","Williams","young","Russell","ingram","randle","nance","brown","deng","yi","ariza","artest","walton","vujacic","james","paul","curry","park","yao","kevin","wade","rose","popovich","leonard","aldridge","ginobili","duncan","lavine","rubio","garnett","wiggins","westbrook","durant","ibaka","nowitzki","pierce","crawford","love","smith","iguodala","barnes","green","thompson","harden","lillard","mccollum","lin","jackson","nash","stoudemire","whiteside","dragic","Howard","batum"};//initRandom random = new Random();var tran = _redis.GetTransaction();for (int i = 0; i < 2000000; i++){tran.SortedSetIncrementAsync(_searchKey, keys[random.Next(0, 70)], 1);}tran.ExecuteAsync();return View();}public IActionResult GetHotKey(string key=""){if (string.IsNullOrEmpty(key)){//defaultvar res = _redis.ZRevRange(_searchKey, 0, 9);var list = (from i in res select i.ToString());return Json(list);}else{//by user inputvar res = _redis.ZRevRange(_searchKey, 0, -1);var list = (from i in res select i.ToString()).Where(x => x.Contains(key)).Take(10).ToList();return Json(list);}}[HttpPost]public IActionResult SetHotKey(string key){if (!string.IsNullOrWhiteSpace(key)){_redis.ZIncrby(_searchKey,key);//other //...return Json(new { code = "000", msg = "OK" });}else{return Json(new { code = "999", msg = "keyword can not be empty!" });}}}
}AutoController
@{ViewData["Title"] = "Auto Complete";
}
<div class="row"><div class="col-md-6 col-md-offset-4" style="padding-top:50px;"><input id="key" name="key" placeholder="search" class="form-control col-md-4"><button class="btn btn-primary" type="button" id="searchSubmit">Search</button><div id="result"></div></div>
</div>
@p scripts{<script type="text/javascript">$(function () {//show hot keyword$("#key").autocomplete({                source: function (request, response) {                    $.ajax({url: "@Url.Action("GetHotKey", "Auto")",dataType: "json",data: {key: request.term},success: function (data) {response(data);}});},});//search$("#searchSubmit").click(function () {$.ajax({url: "@Url.Action("SetHotKey", "Auto")",dataType: "json",type: "POST",data: { key: $("#key").val() },success: function (data) {if (data.code == "000") {$("<p>search successful!</p>").appendTo("#result");} else {$("<p>"+data.msg+"</p>").appendTo("#result");}}});});});</script>
}Index.cshtml

--完--

回复干货】获取精选干货视频教程

回复加群】加入疑难问题攻坚交流群

回复mat】获取内存溢出问题分析详细文档教程

回复赚钱】获取用java写一个能赚钱的微信机器人

回复副业】获取程序员副业攻略一份

戳这儿

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

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

相关文章

一例千万级pv高性能高并发网站架构

2019独角兽企业重金招聘Python工程师标准>>> 受CU管理员的邀请参考“千万级pv高性能高并发网站架构与设计交流探讨帖”主题的交流&#xff0c;发表了一案例与大家分享。 一个支撑千万级PV的网站是非常考验一个架构是否成熟、健壮(本文不涉及软件架构的层面&am…

黑科技Python轻松爬取网站信息,看完我是佩服得五体投地!

1. 引言 本文主要介绍如何使用Scrapy结合PhantomJS采集天猫商品内容&#xff0c;文中自定义了一个DOWNLOADER_MIDDLEWARES&#xff0c;用来采集需要加载js的动态网页内容。看了很多介绍DOWNLOADER_MIDDLEWARES资料&#xff0c;总结来说就是使用简单&#xff0c;但会阻塞框架&a…

牛掰!10年python爬虫经验开发的案例让你搞定全球80%以上的网站

项目要求&#xff1a; 用户入口 1、商品信息存在文件里 2、已购商品&#xff0c;余额记录。 商家入口 可以添加商品&#xff0c;修改商品价格 商家入口&#xff1a; # Author:P J Jimport osps 1 >>>>>> 修改商品 2 >>>>>> 添加商…

快就完事了!10分钟用python爬取网站视频和图片

话不多说&#xff0c;直接开讲&#xff01;教你如何用Python爬虫爬取各大网站视频和图片。 网站分析&#xff1a; 我们点视频按钮 可以看到url是&#xff1a; http://www.budejie.com/video/ 接着我们点开网页源码&#xff0c;看下面之处 接着我们把那个下面画红线的链接点开…

Python监控术,看看你的男女朋友究竟在逛些什么网站!

需求&#xff1a; (1) 获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间&#xff0c;并存在一个txt文件中 (2)将这个txt文件发送给指定的邮箱地址(你的邮箱) (3)建立例行任务&#xff0c;每天定时自动完成这些操作&#xff0c;你就可以通过邮件查看你对象每天看…

转帖一下《深入理解Nginx》在线支持网站的勘误,访问太慢了

2019独角兽企业重金招聘Python工程师标准>>> 《深入理解Nginx》在线支持网站 勘误公布 示例源码 答疑解惑 作者博客 微博互动 在线支持网站更改为&#xff1a;http://nginx.taohui.org.cn请大家访问新的站点&#xff0c;谢谢。 勘误公布 由于编写匆忙&#x…

一般网站有哪些常见漏洞?

Web应用是指采用B/S架构、通过HTTP/HTTPS协议提供服务的统称。随着互联网的广泛使用&#xff0c;Web应用已经融入到日常生活中的各个方面&#xff1a;网上购物、网络银行应用、证券股票交易、政府行政审批等等。在这些Web访问中&#xff0c;大多数应用不是静态的网页浏览&#…

每次Nginx 配置都浪费在了查资料上!来看看这个(在线配置网站)

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 服务&#xff0c;其因丰富的功能集、稳定性、示例配置文件和低系统资源的消耗受到了开发者的欢迎。本文&#xff0c;我们总结了一些常用的 Nginx 配置代码&#xff0c;希望对大家有所…

tableau指标预警_如何使用Tableau分析敏捷,开发和网站指标

tableau指标预警开发人员在设计&#xff0c;开发&#xff0c;测试&#xff0c;部署和管理应用程序时使用了许多生产力&#xff0c;编码&#xff0c;测试和云管理工具。 尽管大多数工具都提供报告和分析功能&#xff0c;但技术团队可能有充分的理由开发自己的报告功能&#xff0…

有什么网站下载 消防编程软件_8个无套路下载软件的网站推荐给你

我曾经在一个朋友的电脑上看到过市面上的所有浏览器&#xff0c;我问他是做网页开发吗&#xff1f;他说他也不知道自己电脑怎么就莫名其妙安装了这么多浏览器。 效率君想了想&#xff0c;应该是这个原因。 先讲个我自己的经历吧。 前两天效率君想把Ps升级到2020&#xff0c;在百…

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

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

网站爬取工具

有时候需要将网站资源爬取到本地&#xff0c;文件少的情况下可以使用Chrome一个个保存。如果文件太多&#xff0c;则需要使用下面的辅助工具。 1.Teleport Ultra(不是Teleport Pro) 优点&#xff1a;爬取文件以及结构比较完整&#xff1b; 缺点&#xff1a;会修改原文件。会在j…

达内网站的标签翻页功能,模仿代码

参考网址&#xff1a;http://xm.tedu.cn/baidu/dnpp/?xmjavaqzs20170524fzct023&utm_term达内培训&ca_kid65421413813&ca_cv17282834319 【代码】 HTML&#xff1a; <div class"banner-wrap"><div class"container"><div clas…

几个不错的解密(MD5,SHA256等)网站

cmd5这个解密网站我相信大多数人都知道吧&#xff0c;数据库还是非常庞大的&#xff0c;一般的解密需求足够了&#xff0c;如果比较复杂就要付费了。网址&#xff1a;http://www.cmd5.com/PMD5解密&#xff0c;效果也不错&#xff0c;不收费&#xff0c;所以解密能力也有限。网…

谷歌新上线了一个安卓游戏开发者网站

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 谷歌为 Android 游戏开发者上线了一个网站。新网站自称 Android 游戏开发“中心”&#xff0c;目的在于帮助开发者为 Android 系统开发更有趣的手游。该网站可以帮助开发者寻找资源和工具&#…

组织官方网站建设记录贴-程序选型

服务器环境&#xff1a;IIS7.5 php mysql需求&#xff1a;开发一个组织的官方网站&#xff0c;包含组织基本信息介绍、新闻、单位会员、个人会员基本信息展示、留言板、背景音乐等基础功能。根据需求&#xff0c;使用思维导图软件画出网站大概结构。根据网站大概结构对互联网…

babylon.js 2d_Babylon.js:超越2D网站

babylon.js 2d自从我们开始向Flash告别以来&#xff0c;网络已经取得了长足的发展。 现在&#xff0c;由于HTML 5及其JavaScript图形API名册&#xff0c;我们在动画插件中可以做的大部分工作都是浏览器固有的。 最重要的之一是WebGL&#xff0c;它使浏览器可以访问GPU并提供交互…

ASP.NET Core 网站在Docker中运行

Docker作为新一代的虚拟化方式&#xff0c;未来肯定会得到广泛的应用&#xff0c;传统虚拟机的部署方式要保证开发环境、测试环境、UAT环境、生产环境的依赖一致性&#xff0c;需要大量的运维人力&#xff0c;使用Docker我们可以实现一次部署&#xff0c;到处运行。本文介绍如何…

分享一个使用 vue.js 开发的网站

为什么80%的码农都做不了架构师&#xff1f;>>> 这个网站叫 「惠淘党」&#xff0c;照着文档和google&#xff0c;前后开发用了一个多星期。由于之前使用过 angular.js&#xff0c;所以上手还是挺快的&#xff0c;主要看了一下 vue.js 的组件和路由&#xff0c;因为…

curl网站开发指南

curl网站开发指南 作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月 4日 我一向以为&#xff0c;curl只是一个编程用的函数库。 最近才发现&#xff0c;这个命令本身&#xff0c;就是一个无比有用的网站开发工具&#xff0c;请看我整理的它的用法。 curl网站开发指南 阮一…