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

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

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

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

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

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值