直播间源码,通过Redis实现数据缓存

需求说明

在直播间源码中,用户查看直播列表,这个列表数据具有时时性,并且是强热点数据,也就是说每时每刻都可能会有新的直播。这些数据如果每次都去数据库读取肯定是不可取的,所以这可以考虑使用redis来实现。

使用redis有序集合来保存直播列表

思路简介 

由于每时每刻都有可能会有新的数据进入到sortedset中,所以使用redis的有序集合进行存储。直播间源码之所以使用有序集合是考虑到翻页的时候不要有重复数据,如果需求允许重复数据的出现,则可以使用先进先出队列queue。

直播间源码重复数据出现原因:假如用户当前再看第一页的数据,此时又有两条新数据插入到sortedSet中,那么如果用zrevrange(key, pageSize*pageNum, pageSize*(pageNum+1)进行取值,就会出现2条重复数据了

每生成一条数据,将其添加到redis有序集合中,根据ID(如果id是数值型的)或者时间戳(这个要进行处理,后面会讲)进行排序。取的时候通过以下方法进行取值。

Set<String> zrevrangeByScore(final String key, final double max, final double min, final int offset, final int count)
1
假如每页5条数据:
第一页:jedisCluster.zrevrangeByScore(key , Double.MAX_VALUE , 0, 0 , 5)
记录第一页中后一条数据的score是M
第二页:jedisCluster.zrevrangeByScore(key , M , 0 ,1, 5)
以此类推。

我这里使用的jedisCluster客户端

如何保证sortedSet集合数量

假如只缓存100条数据,每页10条显示。直播间源码可以采取缓冲区策略,就像redis中保存字符串时使用的SDS动态字符串。我们可以每次在保存的时候检测set的大小zcard,如果zcard超过了120(允许多缓存20个,这样可以减少截取set的操作次数,提高效率),则可以使用以下命令进行截取至100:

jedisCluster.zremrangeByRank(key, 0, jedisCluster.zcard(key)-100)
1

并发安全

上面的策略存在直播间源码并发安全问题,它包含两步:
1. 插入数据到set中。
2. 查询sortedSet大小,判断是否大于120
3. 如果大于120,则进行zremrangeByRank操作。

如果在直播间源码高并发的环境中很容易多次执行zremrangeByRank。

解决办法:
使用lua脚本,将上面操作写到lua脚本中。在lua脚本中执行的操作是原子性的,是线程安全的。不过要注意redis在执行lua脚本时是不可以处理其他请求的

翻页超过了缓存大小

这种情况的话就可以考虑到直播间源码数据库中查询,或者走搜索引擎,毕竟用户看的最多的还是前几页的数据。具体要缓存多少数据要根据实际业务进行计算.
————————————————
声明:本文由云豹科技转发自快乐崇拜234博客,如有侵权请联系作者删除​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Redis 热点数据缓存,可以使用 Redis缓存功能来提高系统性能和响应速度。热点数据指的是频繁被访问的数据,通过将这些数据缓存在内存中,可以避免频繁地从数据库中读取,从而减少数据库的压力。 在 Redis 中,可以使用以下两种常见的方式来实现热点数据缓存: 1. 缓存数据存储在 Redis 的字符串类型中:将需要缓存数据序列化为字符串,并使用一个唯一的键来存储在 Redis 中。当需要访问该数据时,先从 Redis 中尝试获取,如果获取不到,则从数据库中读取,并将读取到的数据存储到 Redis 中以供下次使用。这样就可以实现数据的快速读取和缓存更新。 2. 缓存数据存储在 Redis 的哈希类型中:将需要缓存数据组织为一个哈希表,其中每个字段对应一个属性或字段,并使用一个唯一的键来存储在 Redis 中。当需要访问该数据时,同样先从 Redis 中尝试获取,如果获取不到,则从数据库中读取,并将读取到的数据以哈希表的形式存储到 Redis 中。这种方式可以更灵活地处理复杂的数据结构。 需要注意的是,为了保证缓存的一致性和有效性,需要在适当的时机进行缓存的更新和失效操作。例如,在数据更新之后,需要及时更新 Redis 中的缓存数据,以保证缓存数据库的一致性。另外,还可以设置合适的缓存过期时间,避免缓存数据过期但仍然被使用的情况发生。 总的来说,通过 Redis 的热点数据缓存可以提高系统的性能和响应速度,减少数据库的压力,但需要注意缓存的一致性和有效性的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值