使用Mysql和NoSQL实现热词统计功能

需求

对用户的查询关键词进行次数统计。并在用户搜索的时候,给出热词提示。

解决方案1:维护一张汇总表

其中包括关键词及其查询次数。当访问的用户很多时,数据库修改时会加一个排他锁,导致效率很低。

解决方案2:维护一张明细表

我们搜索一次,就在表中插入一条查询记录。之后进行分组统计。插入要比更新的速度快,不需要加锁解锁。缺点是表的数量会越来越大,分组统计会越来越耗时。

解决方案3:前面的两张表结合起来。

这时我们开启一个定时任务,如每隔一个小时对明细表中的内容进行统计,将结果插入到汇总表中。

明细表主键使用GUID类型,这个比自增类型的主键插入性能高,因为自增类型的主键在插入时要先找到表中主键Id最大值,之后加锁,更新,之后在解锁。而逐渐使用GUID类型则无需上述过程(由于明细表的主键不需要连续,而且用自动增长字段会排队、加锁从而降低效率,因此主键用Guid)。

每查询一次,就向明细表中插入一条记录。同时后台在运行一个定时框架,到达设定的时间就进行一次统计,并将统计的结果放入汇总表中。

在浏览器端使用JQuery UI中的autocompletewidget(组件),向后台输出一个名为term的字符串。在服务器端从汇总表中进行查询,并输出json格式给前台组件。而且考虑要把提示的热词放到缓存中,定时框架来进行更新。

解决方案4:使用NoSql中的MongoDB。

频繁的向一张表中插入数据,特别是高并发的应用场景下效率本身就很慢。为了解决高并发、大量数据的插入、更新问题,引入非关系型数据库NoSql。

使用MongoDB的思路是这样的,由于MongoDB的非关系属性,向其集合中可以插入海量数据,无需考虑并发的读写慢问题。MongoDB也可以进行类似sql的关系查询,那么直接从集合中查询出group by sum(keyword) top 10就可以了。

总结

解决方法3和4可以合并,明细表的功能由MongoDB实现,定时框架统计结果并同步到MySQL中。前端的查询可以选择从MongoDB也可以选择从MySQL。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLNoSQL都是常见的数据库类型,它们各自有不同的优缺点。下面是它们的具体介绍: MySQL优点: 1. 稳定:MySQL是一款经过多年发展的数据库产品,已经非常稳定,被广泛应用于各种应用场景。 2. 支持 SQL:MySQL支持SQL语言,易于学习和使用,适合需要使用关系型数据库的应用场景。 3. 事务支持:MySQL支持事务,能够保证数据的完整性和一致性。 4. 可扩展性:MySQL支持集群部署,可以通过增加节点来扩展性能。 MySQL缺点: 1. 扩展性有限:虽然MySQL支持集群部署,但是节点增加到一定数量后,性能提升的空间会越来越小。 2. 读写性能不够高:相比于NoSQL数据库MySQL的读写性能不够高效。 3. 数据结构固定:MySQL是关系型数据库,数据结构比较固定,不太适合存储非结构化数据。 NoSQL优点: 1. 高可扩展性:NoSQL数据库是分布式的,可以通过增加节点来扩展性能。 2. 高读写性能:NoSQL数据库通常采用分布式的架构,可以支持高并发的读写操作,性能比MySQL更高效。 3. 支持非结构化数据:NoSQL数据库支持非结构化数据的存储,非常适合存储大数据、文本、图片等非结构化数据。 4. 简单易用:NoSQL数据库通常采用键值对的方式存储数据,使用起来比较简单。 NoSQL缺点: 1. 不支持 SQL:NoSQL数据库不支持SQL语言,使用起来不够方便,需要重新学习一些新的查询语句。 2. 不支持事务:部分NoSQL数据库不支持事务,需要开发者自己实现一些事务控制机制。 3. 不稳定:一些新的NoSQL数据库可能比较不稳定,需要开发者自己进行评估和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值