本文为【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可以有效地节省内存空间,并提供快速的位操作,具有以下优势:
- 节省内存空间:BitMap使用位的方式来表示元素的存在与否,相比于Set存储实际值,可以大大减少内存占用。特别是在点赞量很大的情况下,BitMap可以显著降低内存消耗。
- 快速的位操作:BitMap支持快速的位操作,例如设置某一位、清除某一位、查询某一位是否存在等。这些位操作可以在常量时间内完成,而不受BitMap的大小影响,从而提供了高效的点赞操作。
- 支持高并发: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
公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料