🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
排行榜功能几乎存在于所有项目中,如按照发布时间倒序的新闻列表,按照考试成绩正序的成绩表,按照浏览量从大到小的话题。Redis 中列表和有序集合两种数据结构都非常适合用于排行榜系统中。 本文采用使用有序集合来开发一个投票项目来演示排行榜。 ## 1.创建投票选项 ### 1.1 创建投票方法 使用`Request::instance()->post()`接受数据保存到数据库 ~~~ public function create() { if (Request::instance()->isPost()) { $itemModel = new ItemModel(); if ($itemModel->isUpdate(false)->save(Request::instance()->post())) { return '创建成功'; } return '创建失败'; } return "创建选项"; } ~~~ ### 1.2 模型事件 创建到数据库的数据后续使用 ThinkPHP5 的模型事件将数据保存到 Redis ~~~ <?php namespace app\index\model; use think\Model; class Item extends Model { protected $autoWriteTimestamp = 'datetime'; protected static function init() { self::event('before_insert', function ($event) { // 创建前将票数设置为0 $event->count = 0; }); // 数据创建成功后将数据保存到 Redis self::event('after_insert', function ($event) { $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->zAdd("item", $event->count, $event->id); }); } } ~~~ ## 2\. 获取投票列表 ~~~ $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $count = $redis->zCard("item"); $multi = $redis->zRange('zset', 0, $count - 1, true); var_dump($multi); ~~~ ## 3\. 投票 ~~~ $item_id = Request::instance()->post('item_id'); $redis->zIncrBy('item', 1, $item_id); // 给$item_id加一票 ~~~ ## 4\. 统计排名 ~~~ $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $count = $redis->zCard("item"); // 返回分数从高到低排序的前10名及分数 $revRange = $redis-> zRevRange('item', 0, $count - 1, true); var_dump($revRange); ~~~