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

news/2024/5/9 11:52:07/文章来源:https://blog.csdn.net/weixin_34303897/article/details/93934607

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

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

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

  可能现在比较普遍的做法是把这些相应的信息存到我们的关系型数据库中,如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 这个section中的,js的话是比较简单的就是用ajax去请求我们要展示的数据。更多的应该是

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

以去看一下。

@section 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>
@section 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

转载于:https://www.cnblogs.com/wuxl360/p/5881686.html

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

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

相关文章

《网站设计 开发 维护 推广 从入门到精通》—— 1.3 网页版面布局设计

本节书摘来异步社区《网站设计 开发 维护 推广 从入门到精通》一书中的第1章&#xff0c;第1.3节&#xff0c;作者&#xff1a;何新起 ,娄彦杰&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.3 网页版面布局设计 网页设计要讲究编排和布局&#xff0c;虽…

大型网站架构

大型网站架构 大型网站架构&#xff1a;分布式&#xff08;分压&#xff09;和高并发&#xff08;数据完整性和高可用&#xff09;还有服务器集群&#xff08;负载均衡&#xff09;分布式&#xff08;消息队列通讯&#xff1a;阿里MQ&#xff09;高并发&#xff08;队列或者文…

为什么大型网站前端使用 PHP 后台逻辑用 Java?

为什么大型网站前端使用 PHP 后台逻辑用 Java&#xff1f; https://www.zhihu.com/question/20314377 很好。 go语言 很能处理后端&#xff1f;&#xff1f;&#xff1f;cpp(C)做后端 很猛&#xff1f;&#xff1f;分享&#xff1a; 喜欢 0 赠金笔 阅读┊ 评论 ┊ 收藏┊…

前端开发SEO以及注意事项

2019独角兽企业重金招聘Python工程师标准>>> 1、网站布局要做到样式与页面分离&#xff0c;删除页面中不必要的标签和元素。 2、页面生成要尽量小&#xff0c;要压缩页面的大小&#xff0c;页面尽量使用静态或伪静态。 3、所有的CSS、JS都要使用外部调用。 4、外…

Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Mozilla 正致力于 优化 Firefox Monitor 功能&#xff0c;该功能推出于 2018 年&#xff0c;目的是让用户确认他们的账户信息是否泄漏。目前&#xff0c;Mozilla 已经为 Firefox 用户做好了下一…

基于django的视频点播网站开发-step11-后台用户管理功能

用户管理功能&#xff0c;包含用户添加、列表展示、编辑、删除四大功能。下面我们一一揭晓。 用户添加 我们先实现用户添加功能&#xff0c;我们现在urls.py下添加相关的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

seo网站图片如何优化

各大搜索引擎对于图片的识别技术越来越成熟&#xff0c;但还是没有达到能100%识别图片内容的地步。网站中的图片优化急需一个完整的解决办法&#xff0c;下面我以太原雅辉装修公司网站中的近1000张图片优化经历来分享网站图片优化的实用技巧。 一、站内图片该有的属性一个都不能…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

PHP解决网站大数据大流量与高并发

为什么80%的码农都做不了架构师&#xff1f;>>> 1&#xff1a;硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP&#xff0c;如果访问量超过10W那么需要专用的服务器才能解决&#xff0c;如果硬件不给力 软件怎么优化都是于事无补的。主要影响服务器的…

自定义SharePoint新网站创建过程(1)

为什么要自定义一个SharePoint新网站的创建过程呢&#xff1f;作用很多。其中之一就是&#xff0c;我们创建了一个新的SharePoint应用组件&#xff0c;然后希望SharePoint管理员在创建一个SharePoint新网站的时候&#xff0c;就可以在那个新网站中使用我们开发的新应用组件。 …

Nginx代理访问网站及实现缓存

1.Nginx介绍首先介绍下NNginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布&#xff0c;因它…

电子商务网站SQL注入项目实战一例

故事A段&#xff1a;发现整站SQL对外输出&#xff1a; 有个朋友的网站&#xff0c;由于是外包项目&#xff0c;深圳某公司开发的&#xff0c;某天我帮他检测了一下网站相关情况。 我查看了页面源代码&#xff0c;发现了个惊人的事情&#xff0c;竟然整站打印SQL到Html里&#x…

爬取视频网站的视频

网站视频 解析视频连接 以某一个视频为例&#xff1a; 因为是视频的原因&#xff0c;视频后台服务器为了优化做了对视频这一类大文件的分片处理&#xff0c;所以下面会看到一集视频会包含很多请求链接&#xff0c;本人测试了一下&#xff0c;平均一个请求会对应一个1M的视频文…

【JSP学习笔记】4:使用Model1模式构建购物网站demo

J2EE课的上机题&#xff0c;实现一个Model1模式的购物网站的功能。 编码问题 编码问题终于找到解决方法了&#xff0c;首先保证每个页面能编码的都编成UTF-8&#xff0c;然后所有用到内置对象的地方上来先.setCharacterEncoding("UTF-8");&#xff0c;然后重要的是…

搭建网站必不可少的知识15

网站迁移 备份网站和数据库 在服务器上将网站文件拷贝到另一个文件夹 数据库部分打开phpmyadmin 进入phpboke数据库&#xff0c;点击“导出”进行“执行” 选择数据库要保存的位置&#xff0c;进行保存 网站恢复当我们更换服务商或者系统时进行了网站和数据库的备份&#xff0c…

HTTrack(网站镜像工具)

1、首先打开kali 中的这个工具 Web信息收集工具HTTrack ,会直接出现出现使用语法。 对于传统的像存在Robots.txt的网站&#xff0c;如果程序运行的时候不做限制&#xff0c;在默认的环境下程序不会把网站镜像&#xff0c;简单来说HTTPrack跟随基本的JavaScript或者APPLet、flas…

我的网站搭建: (第十天) Ueditor后台编辑器

之前说过&#xff0c;我的网站编辑器一开始是tinymce&#xff0c;然后才用的ckeditor。可是最近我发现&#xff0c;ckeditor的小图标不是很美观&#xff0c;看久了有点low的样子。我是不是应该换一个编辑器呢&#xff0c;一想到这里&#xff0c;马上打开谷歌搜索有没有更加美观…

Java Web性能测试 - 动态网站测试脚本录制

Java Web性能测试 - 动态网站测试脚本录制 本章讲解使用Badboy对网站的请求进行录制&#xff0c;录制完成的脚本文件可以直接用JMeter使用&#xff0c;免去在JMater中进行配置的时间。 使用Badboy录制基本的目的就是减少我们在使用JMeter测试WEB项目时&#xff0c;一个一个Url…

Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量

Java Web项目性能测试 - JMeter测试网站吞吐量、反应时间百分比、流量 为了衡量、调整、完成Java Web项目的性能指标&#xff0c;满足客户、用户对性能的要求&#xff0c;保证项目上线后能正常运行&#xff0c;以及了解项目的性能指标&#xff0c;为项目性能监控做参考&#x…

Java图片水印生成器代码 - 批量给自己的网站图片加水印

Java图片水印生成器代码 - 批量给自己的网站图片加水印 最近在做一款APP&#xff0c;App中的图片是自己一个个的画出来的&#xff0c;为了保证图片不被盗用和处理&#xff0c;所以就需要加上水印防盗。这跟CSDN一样。 注意事项&#xff1a;1. 我是在window7 eclipse 下完成的…