php怎么能做到redis的数据实时更新_redis实现热搜榜的功能

本文介绍了Redis Sorted Set的用法,特别是在构建热搜榜功能中的应用。通过Sorted Set的有序特性和高效的增删改操作,可以实现数据的实时更新和排序。文章提供了用PHP实现的伪代码示例,用于数据的增删改和获取Top N功能。
摘要由CSDN通过智能技术生成

你熟悉redis吗?

你熟悉redis每种类型的使用场景吗?

redis作为一个目前最流行的nosql数据库,在众多大小公司都有广泛的应用。

redis支持五种基本的类型,string,hash,list,set及zset(sorted set)。每种类型都有自己使用的场景。

今天就来看看sorted set的常见用法,

sorted set和set类似,都是一个数据的集合,sorted set是set的升级版本,每个元素都有一个关联的score,整个set就是根据score进行排序的。

如: 用set构建一个用户组

127.0.0.1:6379> smembers user1) "lily"2) "vincent"3) "jim"4) "ted"

用sorted set构建一个用户组,用户的分数作为score

127.0.0.1:6379> zrange score 0 -1 WITHSCORES1) "lily"2) "80"3) "jim"4) "88"5) "vincent"6) "90"7) "ted"8) "95"

利用sorted set这种有序的特性,非常适合排序、排行、榜单这些场景!

86b436009fa02d68abe0874652249ee8.png

multi-top

默认sorted set是按照score的值从小到大排序的,如果需要倒序,可以使用zrevrange命令。

如今很多的资讯网站都有一个热搜榜的功能,如图:

百度热搜榜

245c731cff28d388e5558a36f47811e5.png

baidu

微博热搜榜

ad8470c16858f4489349aa49635020c0.png

像这种统计性的数据,一般不会实时从数据库读取的,基础数据放到MySQL,统计结果基本都是放到cache,然后定时更新。

今天我们就用redis 的 sorted set来实现类似热搜榜的功能。

以下伪代码是我用php写的,实现了数据增加、修改、删除、获取top N的几个常用功能,如果你需要其他功能,可以自己扩展

<?phpclass Top{var $redis;var $key = 'weibo_hot';/** * redis的初始化 * @Author    vincent     yang * @DateTime  2020-11-26 */public function __construct(){$this->redis = new Redis();$this->redis->connect('localhost', 6379);$this->redis->auth('123456');}/** * 获取top榜,从高到低 * @Author    vincent     yang * @DateTime  2020-11-26 * @param     integer $n 个数 * @return    [type]           [description] */public function getTop($n = 10, $withScore = true){$rs = $this->redis->zrevrange($this->key, 0, $n, $withScore);return $rs;}/** * 增加或更新值,对$value不存在的值会新增,存在的值会更新 * @Author    vincent     yang * @DateTime  2020-11-26 * @param     [type]      $value [description] * @param     [type]      $score [description] * @return    [type]             [description] */public function updateData($value, $score){$this->redis->zadd($this->key, $score, $value);}/** * 删除元素 * @Author    vincent     yang * @DateTime  2020-11-26 * @param     [type]      $value [description] * @return    [type]             [description] */public function removeByValue($value){$this->redis->zrem($this->key, $value);}}$obj = new Top();$rs = $obj->getTop(10);print_r($rs);$obj->updateData('Title01', 500);?>~       

效率:

sorted set的增删改效率都很高,时间复杂度为

O(M*log(N)), N 为有序集的基数, M 为被成功操作的成员的数量。

因为是有序的集合,所以访问任意位置的数据速度都很快。

最后:

解决问题的方法有很多,你是怎么实现这种功能呢,欢迎交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值