【黑马点评Redis——004达人探店】

news/2024/10/22 7:50:39/

1.发布探店笔记

在这里插入图片描述
在这里插入图片描述

2.点赞

利用Redis中的Set集合来判断是否点赞过。
在这里插入图片描述

3.点赞排行榜

可以通过SortedSet来按点赞时间进行排序。

在这里插入图片描述

4.好友关注

4.1.关注和取关

在这里插入图片描述
在这里插入图片描述

4.2.共同关注

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 可以通过set实现交集的功能

4.3.关注推送

在这里插入图片描述
在这里插入图片描述

4.3.1 拉模式

  • 拉模式(Pull),也叫读扩散:
    • 在拉模式中,消费者负责主动从消息队列或者消息服务器中拉取消息。
    • 消费者会定期轮询消息队列或者订阅主题,检查是否有新的消息可供处理。
    • 消费者决定何时拉取消息,以及每次拉取多少消息。
    • 这种方式相对消耗资源较少,因为消费者可以控制消息的获取速度,但可能导致消费者轮询频繁或者消息获取不及时的问题。
      在这里插入图片描述

4.3.2 推模式

  • 推模式(Push),也叫写扩散:
    • 在推模式中,消息生产者直接将消息推送给消费者,而无需消费者主动请求。
    • 生产者在消息就绪后即时地将消息发送给订阅者或者消息队列。
    • 消费者无需关心何时有新消息,只需要等待消息到达并及时处理。
    • 这种方式可以实时地将消息推送给消费者,但可能导致消费者处理不及时或者消息堆积的问题。
      在这里插入图片描述

4.3.3 推拉模式

  • 推拉模式结合了拉模式和推模式的优点。
    • 消费者可以通过订阅主题或者注册监听器等方式订阅消息,同时可以根据需要主动拉取消息。
    • 当有新消息到达时,消息服务器会主动推送消息给消费者;当消费者需要获取消息时,也可以主动拉取消息。
    • 这种方式结合了实时性和资源控制的优势,消费者可以根据自己的需求选择何时主动获取消息,何时等待消息推送。
    • 根据不同的用户提供不同的方案

在这里插入图片描述

4.3.4 方案比较

在这里插入图片描述

5.基于推模式实现关注推送功能

在这里插入图片描述

  • 需求一
    • 在保存blog到数据库的同时,推送到粉丝的收件箱(即利用SortedSet创建一个对应的redis字段,key为粉丝的id,结合中的内容为博客id和创建时间)

5.1 Feed流的分页问题

Feed流中的数据会不断更新,所以数据的角标也在变化,因此不能采用传统的分页模式。
在这里插入图片描述

解决办法
使用滚动分页
在这里插入图片描述

5.2 实现关注页面的分页查询

在这里插入图片描述

  • 利用每次查询都记住上一次查询的最小值
  • 第一页利用ZREVRANGEBYSCORE z1 maxValue 0 WITHSCORES LIMIT 0 sizeOfPage
  • 下一次可以通过利用上一次的最小值继续查询ZREVRANGEBYSCORE z1 lastMinValue 0 WITHSCORES LIMIT sizeOfLastValue sizeOfPage
  • 但有可能会出现score分数相同的情况,所以上面的偏移1可能会出问题
  • 所以这个偏移量应该是和上次最小值相同的个数

在这里插入图片描述

java">@Overridepublic Result queryBlogOfFollow(Long max, Integer offset) {// 1.获取当前用户Long userId = UserHolder.getUser().getId();// 2.查询收件箱String key = FEED_KEY + userId;Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);// 3.非空判断if (typedTuples == null || typedTuples.isEmpty()){return  Result.ok();}// 4.解析收件箱:blogId、score(时间戳)、offset根我上次查询出的值ArrayList<Long> ids = new ArrayList<>(typedTuples.size());long minTime = 0;int os = 1;for (ZSetOperations.TypedTuple<String> tuple : typedTuples) {// 4.1.获取idids.add(Long.valueOf(tuple.getValue()));// 4.2.获取分数(时间戳)long time = tuple.getScore().longValue();if(time == minTime){os++;}else{minTime = time;os = 1;}}// 5.根据id查询blogString idStr = StrUtil.join(",", ids);List<Blog> blogs = query().in("id",ids).last("ORDER BY FIELD(id,"+idStr+")").list();for (Blog blog : blogs) {queryBlogUser(blog);isBlockLiked(blog);}// 6.封装并返回ScrollResult r = new ScrollResult();r.setList(blogs);r.setOffset(os);r.setMinTime(minTime);return Result.ok(r);}

http://www.ppmy.cn/news/1442556.html

相关文章

mac 桌面不能右键 文件也不见了 但在finder的桌面上有

mac 桌面不能右键 文件也不见了 但在finder的桌面上有 出现该现象&#xff0c;可能是因为安装了带有隐藏桌面文件功能的软件&#xff0c;无意中操作引起的。可以利用终端轻松解决&#xff1a; 1、在Launchpad中找到终端并打开&#xff1a; 2、粘贴如下代码&#xff0c;回车即…

PHP利用phpmailer实现邮件发送功能

要在PHP中实现发送邮件验证码的功能,你需要使用一些特定的库来帮助你处理邮件发送的任务。PHPMailer是一个常用的库,它可以帮助你轻松地发送电子邮件。 以下是一个简单的例子,展示了如何使用PHPMailer库来发送包含验证码的电子邮件: 首先,你需要安装PHPMailer库。你可以通…

Qt相关开源项目总结

Qt官方github&#xff1a; https://github.com/orgs/qt/repositories 参考 https://blog.csdn.net/pzs0221/article/details/131337353

Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载 1.1、Docker 安装 # 1.安装gcc环境 yum -y install gcc gcc-c && \# 2. 卸载docker旧版本&#xff08;可能之前有安装&#xff09; yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包…

Mac如何更换终端默认的python版本

一、Mac中如何更换终端默认的python版本 1、打开终端输入下列代码&#xff0c;打开配置文件 open ~/.bash_profile 2.在打开的配置文件中输入&#xff08;以下代码3.12替换为所下载的版本即可&#xff09; #下面是修改python版本的命令就是环境变量 export PYTHON_HOME/Lib…

【MAC】删除自带的输入法

问题描述 平常使用mac办公&#xff0c;经常会非预期切换到自带的ABC输入法&#xff0c;令人很困惑。 解决方案&#xff1a; 1、下载PlistEdit Pro 链接&#xff1a;https://www.fatcatsoftware.com/plisteditpro/ 2、执行命令 sudo open ~/Library/Preferences/com.apple.…

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

洛谷 B2123 字符串 p 型编码

字符串 p 型编码 题目描述 给定一个完全由数字字符&#xff08;‘0’,‘1’,‘2’,…,‘9’&#xff09;构成的字符串 str &#xff0c;请写出 str 的 p 型编码串。例如&#xff1a;字符串 122344111 可被描述为 1个1、2个2、1个3、2个4、3个1 &#xff0c;因此我们说1223441…