面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文(1)】

news2024/11/28 20:44:57

本文为【Redis使用Set集合实现点赞相关八股文】初版,后续还会进行优化更新,欢迎大家评论交流~

大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~

Redis使用Set集合实现点赞
(1)具体实现

可参考文章:

java使用Redis实现点赞功能_java点赞功能怎么实现,实现点赞排名-CSDN博客

Redis学习三之Jedis的简单使用和SpringBoot整合Redis_springboot 3.0版本通过 jedis方式获取redis-CSDN博客

(2)Set的底层结构

Set 类型的底层数据结构是由哈希表或整数集合实现的:

  • 如果集合中的元素都是整数且元素个数小于 512 (默认值,set-maxintset-entries配置)个,Redis 会使用整数集合作为 Set 类型的底层数据结构;
  • 如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。

(3)点赞功能使用Redis的key和value是怎么设计的?/ 具体命令怎么写?

使用Redis的Set集合,
前面的key是点赞帖子id,后面的value是点赞人的id

redisUtil.sAdd("like:user_"+id,openid);   // 点赞
redisUtil.srem     // 取消赞
redisUtil.sMembers // 判断是否点赞
redisUtil.sCard    // 点赞列表
(4)点赞数据存在Redis里,Redis宕机了,点赞数据会不会丢失?/ Redis 宕机了,数据没有存进去怎么办?

如果只存在redis,没做持久化就会丢失;
如果有持久化,就会进行加载

或者 还可以做主从复制(这样主的Redis宕机,从的可以升级为主的)
或者 集群或者哨兵模式

(具体请看下一点)

(5)Redis点赞数量怎么保证不会丢?

① 定时持久化到数据库
② 持久化(AOF,RDF)
③ 主从复制
Redis 支持主从复制,可以将主节点的数据复制到从节点中,从而实现数据备份和容灾。如果主节点出现故障,可以通过从节点来提供服务。
④ 集群模式
Redis 支持集群模式,可以将数据分散存储到多个节点中,从而提高数据的可靠性和可用性。如果某个节点出现故障,可以通过其他节点来提供服务。

(6)理论上redis点赞并发数能达到多少?

一般情况下,单个Redis实例可以实现1000 – 10 000的QPS(每秒钟请求数),而Redis集群则可以实现20 000-30 000的QPS。

(7)点赞放在Redis中,会随着帖子增加redis中占的内存变大?

对的,因为Redis基于内存的

(8)假设一个帖子点赞量很大,一个Redis set太大了,该怎么解决?(内存限制)

① 分片:将一个大的Redis Set拆分成多个小的Set,每个Set只存储一部分点赞数据。可以根据帖子ID或其他规则,将点赞数据分散到多个Set中。例如,可以按照帖子ID的哈希值进行分片,将点赞数据均匀地分散到多个Set中。

② 分布式集群:Redis Cluster能够自动将数据分布在多个节点上,并提供高可用性和横向扩展性。通过将数据分散在多个节点上,可以减少单个节点的负载和内存消耗。

③ 数据持久化和缓存淘汰策略
④ 使用BitMap来代替

使用BitMap可以有效地节省内存空间,并提供快速的位操作,具有以下优势:

  1. 节省内存空间:BitMap使用位的方式来表示元素的存在与否,相比于Set存储实际值,可以大大减少内存占用。特别是在点赞量很大的情况下,BitMap可以显著降低内存消耗。
  2. 快速的位操作:BitMap支持快速的位操作,例如设置某一位、清除某一位、查询某一位是否存在等。这些位操作可以在常量时间内完成,而不受BitMap的大小影响,从而提供了高效的点赞操作。
  3. 支持高并发:BitMap的位操作是原子性的,可以在多线程或分布式环境下进行并发操作,而不需要额外的并发控制机制。这使得BitMap非常适合高并发点赞场景,可以提供良好的性能和可伸缩性。

BitMap

(1)BitMap是一连串的二进制数字(0,1),每一位所在的位置为偏移(offset),在BitMap上可以执行AND,OR,XOR以及其他操作。
(2)位图计数
位图计数的意思是统计BitMap中值为1的位的个数,位图计数的效率是很高的。
(3)Redis BitMap
Redis中允许使用二进制的Key和二进制的Value,BitMap就是二进制的Value。

BitMap实现点赞

(1)点赞/取消点赞
假设用户的数字Id为123456L,对textId为text1的微博点赞。首先根据textId生成赞数据存储的Redis key,比如生成策略为praise_{textId},userId为123456L的用户点赞,只需要将praise_text1的第123456位置为1即可(取消赞则置为0)。
(2)是否点赞
就是根据key和偏移量的值来查询对应的值是1还是0.查询userId为123456L的用户是否给praise_text1点赞,就只需查询praise_text1的第123456位置是否为1即可。
(3)统计有多少点赞
就是利用位图计数的原理来实现。

⑤ 使用Hash和ZSet代替Set结构

在Redis中,Hash和ZSet相对于Set可以更有效地存储大量数据。

在Set中,每个元素占用一个键的空间,而Hash和Sorted Set可以存储多个字段或关联的分值,从而减少了存储空间的开销。

(9)Redis同时存100个人的点赞是怎么解决的 / 很多人同时点赞,如何保证高可用?

(1)使用消息队列,保证有序点赞
(2)分布式锁(Lua脚本)

(10)Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?

方案一:

(削峰,限流,扩容)
水平扩展,就是Redis做成集群;
异步处理,削峰;
批量处理,减少网络请求次数(比如:Redis事务)。

方案二:

不能用数据库抗实时读写流量(用MQ异步消费)
用高可用Redis集群来做固化存储
可以用MySQL来做固化存储,Redis做缓存,读写操作都落缓存,异步线程定期刷DB

---------------------------------------------------------------------------------------------------------------

 更多精彩内容以及一手消息请关注公众号:绝命Coding

公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场记 | 有些人的成功真的不是偶然

今天跟大家聊一聊雷总的成长记,希望给职场中的朋友们一点启发: 强烈的创业精神与持续的创新意识 雷军自大学时期起就展现出了强烈的创业热情。他不仅在求学期间积极参与创业活动,更在毕业后迅速踏上创业道路,创立了多家知名企业…

G7 - Semi-Supervised GAN 理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 理论知识模型实现引用、配置参数初始化权重定义算法模型模型配置模型训练训练模型 模型效果总结与心得体会 理论知识 在条件GAN中,判别器只用…

没有超头、最低价的视频号618战况如何?有何趋势变化?| 视频号618观察

转眼618大促已接近尾声,今年的你有剁手哪些好物吗?对618的整体感觉又是如何呢? 这是12年来,第一个电商平台没有预售付定金的618,当然或许此后的双11、每一次大促也将逐渐回归传统,回归本质。 而对于视频号来…

【八股系列】为什么组件中的 data 必须是一个函数,然后 return 一个对象,而 new Vue 实例里,data 可以直接是一个对象?

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【点击一个按钮,浏览器会做些什么事情【呈现效果时流程】?(js)】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点…

深度学习前10节

1.机器学习的流程 (1)数据获取 (2)特征工程 (3)建立模型 (4)评估与应用 2.特征工程的作用 (1)数据特征决定了模型的上限 (2)预处理和特征提取是最核心的 &…

【盘点】8大电商选品思路,实操策略大公开!

1、以人选品 顾名思义,先确定想做的目标人群,再挖掘人群的需求。比如,小个子,这种细分市场,这里的人代表的是一个群体,可以是职业,可以是年龄段可以是一种称呼。如果未能明确目标市场和消费者需…

Linux CentoS安装RabbitMQ:一键安装指南

有两种安装方法,官方推荐使用 docker安装RabbitMQ 一、Docker安装RabbitMQ 1、安装docker 参考我之前的文章:Centos7.5搭建docker并且部署Lnmp环境(小白入门docoker)_centos7.5安装docker和docker-compose-CSDN博客 2、安装Ra…

【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置

四、基本概念 这部分和C语言重复的部分就简写速过,因为我之前写过一个C语言的系列,非常详细。C和C这些都是一样的,所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…

容器之对齐构件

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

Latex的参考文献中显示三个问号???——解决办法

1、问题描述 在使用spring模板&#xff0c;并引用book时&#xff0c;末尾的引文地方出现三个???由于使用的bibtex是直接从谷歌学术中导出来的&#xff0c;其中仅包含作者&#xff0c;书名&#xff0c;出版社&#xff0c;年份等&#xff0c;缺少了重要的信息。结果导致在出版…

容器之布局容器的演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>void change_image(GtkFileChooserButton *filebutton, // GdkEvent *event,GtkImage *image) {gtk_image_set_from_file(im…

如何一键下载整个城市路网?

我们在《200城市的CAD建筑与路网下载》一文中&#xff0c;为你分享了下载CAD建筑与路网的方法。 现在&#xff0c;再为你分享一键下载整个城市路网地图的方法&#xff0c;并为你分享已经下载好的北京、上海、广州和深圳等几个城市的路网地图图片&#xff0c;请在文末查看获取该…

Linux开发讲课7---Linux sysfs文件系统

一、sysfs文件系统介绍 Sysfs&#xff08;System Filesystem&#xff09;是Linux内核提供的一种虚拟文件系统&#xff0c;用于向用户空间公开有关设备和驱动程序的信息。它类似于/proc文件系统&#xff0c;但是专注于设备和驱动程序信息&#xff0c;而非进程信息。 Sysfs通过文…

phar反序列化及绕过

目录 一、什么是phar phar://伪协议格式&#xff1a; 二、phar结构 1.stub phar&#xff1a;文件标识。 格式为 xxx; *2、manifest&#xff1a;压缩文件属性等信息&#xff0c;以序列化存 3、contents&#xff1a;压缩文件的内容。 4、signature&#xff1a;签名&#…

Android开发系列(五)Jetpack Compose之Icon Image

Icon是用于在界面上显示矢量图标的组件。它提供了很多内置的矢量图标&#xff0c;也支持自定义图标。要使用Icon组件&#xff0c;可以通过指定图标资源的名称或引用来创建一个Icon对象。例如&#xff0c;使用Icons.Default.Home来创建一个默认风格的首页图标。可以通过设置图标…

免费体验软件开发生产线 CodeArts

软件开发生产线 CodeArts 一站式、全流程、安全可信的软件开发生产线&#xff0c;开箱即用&#xff0c;内置华为多年研发最佳实践&#xff0c;助力效能倍增和数字化转型 免费试用体验版套餐&#xff0c;50人内免费试用 功能特性 Scrum和看板需求模型 代码托管 代码检查&am…

DN-DETR

可以看到&#xff0c;与 DAB-DETR 相比&#xff0c;最大的差别仍然在 decoder 处&#xff0c;主要是 query 的输入。DN-DETR 认为可以把对 offsets 的学习&#xff0c;看作一种对噪声学习的过程&#xff0c;因此&#xff0c;可以直接在 GT 周围生成一些 noised boxes&#xff0…

手写方法实现整型例如:123与字符串例如:“123“相互转化(下篇)

目录 一、前言 二、整型转化为字符串 1. 初始化变量 2.数字1转字符1 3.取出value中的每一项数字 4.将字符放入字符数组中 5.最终代码 三、最后 一、前言 本篇文章紧跟上篇文章&#xff0c;本片内容为整型转化为字符串类型。至于我为什么要分两篇文章&#xff0c;主要…

ATA-4051C高压功率放大器在压电电机中的作用是什么

压电电机是一种特殊的电机&#xff0c;其工作原理基于压电效应&#xff0c;这是一种将电能转化为机械振动的现象。压电电机通常用于精密定位、振动控制和声波生成等应用。为了驱动和控制压电电机&#xff0c;需要高压功率放大器。下面将介绍高压功率放大器在压电电机中的作用&a…