mysql和redis统计网站活跃度,最代码网站用户私信列表采用mysql union查询优化为Redis查询的经验和相关代码片段分享...

news/2024/5/20 11:09:59/文章来源:https://blog.csdn.net/weixin_35748595/article/details/116120171

由于用户和私信的数据量逐渐增加,查询用户和其他用户的私信合并排重排序的sql语法给mysql带来了很大的压力,springdata jpa的hql查询语法如下:select id from (select id,target_id,case when user_id=?1 and type=?2 then 'sender' else 'receiver' end flag from javaniu_post where user_id=?1 and type=?2 union select id,user_id,case when user_id=?1then 'sender' else 'receiver' end flag from javaniu_post where target_id=?1 and type=?2 order by id desc) as ret group by target_id order by id desc

在mysql的slow查询中经常会出现10s以上的记录:

5f44669d9023f819b9cfa4031178418d.png

mysql查询性能的瓶颈在于某个用户和其他用户之间交互越多,发送私信越多,mysql union查询参与运算的集合数据量会越大,性能也会越来越低。

数据变化如下:

1.用户A发给用户B生成私信1

用户A->用户B->私信1

2.用户A发给用户C生成私信2

用户A->用户C->私信2

3.用户A发给用户E生成私信3

用户A->用户E->私信3

4.查询用户A的私信列表

私信3,私信2,私信1

5.用户B发给用户A生成私信4

用户B->用户A->私信4

6.查询用户A的私信列表

私信4,私信3,私信2

私信1因为有最新数据私信4的存在,所以不会返回。

所以迫切需要引入新的技术来解决该查询的性能瓶颈,想到了流行的redis技术,于是修改设计如下:

模拟发私信的数据结构如下127.0.0.1:6379> zadd uid1 1 2

(integer) 1

127.0.0.1:6379> zadd uid1 2 3

(integer) 1

127.0.0.1:6379> zadd uid1 3 5

(integer) 1

127.0.0.1:6379> zrevrange uid1 0 -1

1) "5"

2) "3"

3) "2"

127.0.0.1:6379> zrevrange uid1 0 -1 withscores

1) "5"

2) "3"

3) "3"

4) "2"

5) "2"

6) "1"

127.0.0.1:6379> zadd uid1 4 2

(integer) 0

127.0.0.1:6379> zrevrange uid1 0 -1 withscores

1) "2"

2) "4"

3) "5"

4) "3"

5) "3"

6) "2"

127.0.0.1:6379>

注意:把私信id做为score来做排序

相关代码片段如下:

删除或添加私信时:String uid = t.getUserId() + "";

String type = ModuleConstants.POST_TYPE_MESSAGE + "";

String tgid = t.getTargetId() + "";

long id = t.getId();

long time = t.getCreateTime().getTime();

String po_uid_tp_tgid = String.format(

RedisConstants.POST_USERID_TYPE_TARGETID, uid, type, tgid);

// from uid

String po_uid_tp = String.format(RedisConstants.POST_USERID_TYPE,

uid, type);

// to uid

String po_tgid_tp = String.format(RedisConstants.POST_USERID_TYPE,

tgid, type);

if (t.getStatus() == ModuleConstants.MODULE_STATUS_DELETED) {// 删除私信同时要删除redis

zsetOps.remove(po_uid_tp_tgid, id + "");

zsetOps.remove(po_uid_tp, tgid);

zsetOps.remove(po_tgid_tp, uid);

} else {

zsetOps.add(po_uid_tp_tgid, id + "", time);

zsetOps.add(po_uid_tp, tgid, id);

zsetOps.add(po_tgid_tp, uid, id);

}

查询用户的私信时:String uid = userId + "";

String tp = ModuleConstants.POST_TYPE_MESSAGE + "";

String po_uid_tp = String.format(RedisConstants.POST_USERID_TYPE, uid,

tp);

int total = zsetOps.zCard(po_uid_tp).intValue();

int ps = total / count + (total % count > 0 ? 1 : 0);

if (page > ps) {

page = ps;

}

int start = (page - 1) * count;

int end = page * count - 1;

Set> _ids = zsetOps.reverseRangeWithScores(

po_uid_tp, start, end);

List ids = new ArrayList();

Iterator> iterator = _ids.iterator();

while (iterator.hasNext()) {

TypedTuple _id = iterator.next();

long id = _id.getScore().longValue();

ids.add(id);

}

List ts = (List) findAllByIds(ids);

Pageable pageable = new PageRequest(page - 1, count);

Page _page = new PageImpl(ts, pageable, total);

initBeans(_page.getContent());

redis查询最代码官方,id=1的所有私信列表,和mysql union运算的结果完全一致,但是性能可是天壤之别:

5f44669d9023f819b9cfa4031178418d.png

info的memory截图和keyspace截图

5f44669d9023f819b9cfa4031178418d.png

5f44669d9023f819b9cfa4031178418d.png

相关资料和代码:

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

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

相关文章

地址做域名时不能加端口_当你访问XXX网站时,从访问到内容返回呈现,中间发生了什么?...

想必不少小伙伴面试过程中,会遇到「当键入网址后,到网页显示,其间发生了什么」的面试题。这次,小林我带大家一起探究下,一个数据包在网络中的心路历程。每个阶段都有数据包的「心路历程」,我们一起看看它说…

创立一个网站的前前后后(起因,域名,云平台,备案,CDN等等)(1)

起因 写完《完美软件开发:方法与逻辑》这书后,原本想继续写书的,可出来参加了些社区活动后,我发现我写的书大家评价还行,但其实不太理解。而接下来想写的书更加抽象点,准备叫《管理的解析》,我一…

15款最好的网站音乐播放器

在互联网上有很多的脚本和插件,可以很容易将音乐播放功能集成到网站,以下是15款最好的网站音乐播放器。 Flash MP3 Player Flash MP 3 player is free script which can easily be embedded into the desired section of your web page. Its customizat…

鸿蒙应用开发在线体验官网,华为鸿蒙 HarmonyOS 应用开发在线体验网站上线

原标题:华为鸿蒙 HarmonyOS 应用开发在线体验网站上线IT之家 4 月 22 日消息 华为 HarmonyOS 应用开发在线体验网站现已上线。开发者可以通过在线体验“To-Do List”Demo,了解 HarmonyOS“一次开发、多设备部署”特性,体验 HarmonyOS 跨设备应…

html5 静态网页 线程,HTML5 Web Workers之网站也能多线程的实现

Web Workers 是在HTML5中新增的,用来在web应用程序中实现后台处理的一种技术在HTML4中,js创建的程序都是单线程的,如果花费时间比较长的话web界面就会长时间没有响应,最恶劣的情况还会跳出一个脚本提示框:提示脚本运行…

做服务器_码迷SEO:细数那些做SEO巨坑的服务器们

这是码迷SEO的第51篇原创这两天又有摩天楼的用户来找码迷看网站情况,说是网站坚持做好原创、做好配图、做好体验,是典型的三好学生网站。但是做了好长时间了,又没有蜘蛛、又没有排名、又没有流量,是典型的贫苦户呢。码迷也看了好多…

同一个网站别人能打开我打不开_做网站建设需要注意的五大事项

全国起码有上万计能提供做网站建设的公司和团队乃至个人,而绝大多数建的网站只是外表好看罢了。但是,如果网站是企业网站,光好看又有什么用呢?如果搜索引擎不认可,关键词排名就别指望了,潜在客户也将很难找…

手机号 imsi tmsi_抓取网站访客手机号

网站每天有几十几百上千访客,但咨询了解的不到5%,能够看到你广告并进行访问的网民肯定是有需求的,可选择与哪家合作,因素有很多,与其被动等待不如主动把流失的客户拉回来。火眼访客抓取系统是专为企业量身定制的移动端…

旅游网站的主页代码_一个在优化的网站主页内容应该如何设计?

现在搜索引擎上面的网站只要是互联网行业的网站都是做了优化的只能说是效果好与不好,只要是注重做优化的网站都会非常重视网站主页的设计,那么一个在优化的网站主页内容应该如何设计呢?接下来我们就来了解一下:网站标志应该在每一…

Amh/Nginx更改网站根目录

2019独角兽企业重金招聘Python工程师标准>>> 网站根目录是由Nginx的配置文件指定的。更改Amh虚拟主机的网站根目录,需要手动修改/usr/local/nginx/conf/vhost/下的域名.conf文件: 1.找到 server {...root /home/wwwroot/yourDomain/oldDirect…

c语言mysql源代码,永盈会-官方网站

SLF4J1.7一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip sublime等ide识别和跳转。安卓构架组件——向项目添加组件(Adding Components to your Project)永盈会-官方网站。VS2017中使用ObjectARX 2019 wizard的 ArxWizMFCSupport向…

微型计算机的硬盘电源,自己动手估算电脑的功率 | 微型计算机官方网站 MCPlive.cn...

本来装一台电脑该配多大功率的电源是一个非常简单的问题,但不少人仍不得不求助于专家。是什么原因造就了这一难题?怎样轻松计算自己的电脑功耗?相信这是很多用户迫切想要知道的,本文就是要解决这个问题。最近论坛讨论电源选购的帖…

微信拦截网站怎么办 微信屏蔽网址如何正常打开

最近很多老哥问我,为啥自己的域名在微信或者QQ里面很容易被封? 1、页面里面的内容违规或者诱导被举报而导致的拦截 2、用户和同行举报 3、腾讯等定期会检查 4、,有诱导分享,强制关注等, 为啥有的人的可以,我…

Haproxy+Keepalived实现网站双主高可用-理论篇

一、Haproxy简介HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。(1&am…

使用基本MVC2模式创建新闻网站

使用基本MVC2模式创建新闻网站 MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Mode…

企业网站首页设计常见的6种布局方式

看到太多的网页设计师发布企业站的个人作品,设计中总是摆脱不了大框套小框的设计布局思路,不加思索的跳入单一的网页布局形式中,于是就有了把企业站常用的页面布局方式总结一下的想法,让大家包括我自己全面的了解一下企业站的常见…

使用Apache自带的ab命令测试网站性能(小强性能测试班学员作品)

Apache自带的ab命令虽然很简单,但是对于调试的时候的测试,还是非常有效的,因此,做网站性能测试,还是有必要了解下的,关于ab详细命令,本文不做介绍,本文只介绍使用POST数据的使用方法…

RHEL 5服务篇—使用Apache搭建web服务(四)部署AWStats网站分析系统

在httpd服务器的访问日志文件access_log中,记录了大量的客户机访问信息,通过分析这些信息,可以及时了解web站点的访问情况。但是由于access_log文件记录的信息太多,查看起来很不方便,所以我们使用AWStats分析系统生成图…

如何有效地防止网站和手机APP的数据被采集?

2019独角兽企业重金招聘Python工程师标准>>> 随着Web数据采集技术的普及,大量网站和移动App的海量数据面临着被抓取的威胁。从技术角度讲Web数据采集技术是模拟浏览器或手机客户端与Web服务器进行交互,该过程与合法的浏览器或手机客户端直接访…

推荐几个堪称神器的学习网站

01、大学资源网 大学资源网是一个完全免费并且功能非常强大的学习网站,它免费提供了丰富并且全面的学习视频教程,并且视频课程一直在更新,非常良心。 我比较看重的是它里面的考研视频教程,有数学、英语、政治、专业课等等&…