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

server/2024/9/23 6:35:43/

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/server/15077.html

相关文章

每日一题:托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同&#xff0c;那么这个矩阵是 托普利茨矩阵 。 示例 1&#xff1a; 输入&#xff1a;matrix…

【Java 解析全国详细地址】Java 利用正则表达式完美解析全国省市区地址

这里写自定义目录标题 Java使用正则解析省市区/县 具体地址问题场景上demo运行结果 Java使用正则解析省市区/县 具体地址 问题场景 OCR识别营业执照 获取详细地址并拆分 上demo import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import j…

力扣704/35/34:二分查找

考虑到线性查找法的时间复杂度较高(O(n)), 我们可以选择使用二分查找算法. 二分查找算法只适用于有序数组(线性查找不需要满足该前提), 其时间复杂度为O(logn), 我们可以选择两种方式来完成二分查找算法. 要求 : 给定一个有序整形数组, 在该数组中, 找到目标值target, 如果找…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层&#xff0c;每层的作用&#xff0c;知道数据在七层模型中是怎样传输的&#xff0c;封包和解…

java算法day5

哈希表基础哈希表写题基础字符串类有效的字母异位词ArrayList用法两个数组的交集两数之和 哈希表基础 哈希函数&#xff1a; 哈希表使用哈希函数将键转换为数组的索引。理想情况下&#xff0c;哈希函数应该将键均匀分布在数组中&#xff0c;以减少冲突&#xff08;两个键映射到…

2018年华三杯山东省赛决赛实验

2018年华三杯山东省赛决赛实验 拓扑图 配置需求 请考生根据以下配置需求在 HCL中的设备上进行相关配置。 网络设备虚拟化 数据中心交换机需要实现虚拟化。支持的虚拟化技术 IRF,所配置的参数要求如下: 链形堆叠,IRF Domain 值为 10; IRF1的 member ID 为 1,IRF2的 member …

wordpress建网站主题案例推荐

wordpress企业网站主题案例 https://www.mymoban.com/wordpress/ wordpress公司官网主题案例 https://www.wowsoho.com/jianzhan wordpress外贸主题案例 https://www.wpniu.com/moban

Redis网络模型

目录 1. Redis命令执行部分为什么使用单线程 2. 单线程下&#xff0c;Redis如何实现高性能的&#xff1f; reactor模型 3. 单线程部分 函数initServer 函数aeMain 服务端可读&#xff0c;执行acceptTcpHandler 客户端可读&#xff0c;执行readQueryFromClient 1. 读取…