不言不语

您现在的位置是: 首页 >  数据库  >  Redis

Redis

redis实例:排行榜

2022-05-28Redis
排行榜功能几乎存在于所有项目中,如按照发布时间倒序的新闻列表,按照考试成绩正序的成绩表,按照浏览量从大到小的话题。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);


文章评论