thinkphp5 操作redis 实现文章的热度排行和点赞排行的示例

使用redis hash散列 和zset有序集合实现文章的热度排行和点赞排行 1.首先为文章建立散列,存入基本信息。 mysql简单设计

获取所有文章,并存入redis

//所有新闻页
public function news()
{
    $redis = new Redis();
    $list  = News::select();
    foreach ($list as &$row){
        //将所有数据存到hash散列里,用于显示简介信息
        $redis->handler()->hmset('newsId-'.$row->id,array('id'=>$row->id,'title'=>$row->title,'name'=>$row->name,'create_time'=>$row->create_time));
    }

    return json($list);//返回给前端所有数据;
}

2.初始化所有文章的浏览数和点赞数

 //初始化文章热度和点赞数
public function startNews()
{
    $redis= new Redis();
    $list = News::select();
    foreach ($list as &$row){
        //为每个文章添加热度
        $redis->zAdd('hot','0','newsId-'.$row->id);
        //为每个文章添加点赞数
        $redis->zAdd('good','0','newsId-'.$row->id);
    }
    dump($redis->zRange('hot','0','-1',true));
    dump($redis->zRange('good','0','-1',true));
}

结果

array(5) {
  ["newsId1"] => float(0)
  ["newsId2"] => float(0)
  ["newsId3"] => float(0)
  ["newsId4"] => float(0)
  ["newsId5"] => float(0)
}
array(5) {
  ["newsId1"] => float(0)
  ["newsId2"] => float(0)
  ["newsId3"] => float(0)
  ["newsId4"] => float(0)
  ["newsId5"] => float(0)
}

3.访问新闻 访问新闻时,mysql正常读取信息返回给前端,(此处不做代码实现)。然后热度排行自动增长1.

 	$redis   = new Redis();
    $param   = $this->request->param();
    $news_id = $param['news_id'];
    $list    = News::where('id',$news_id)->find();//数据库查到的信息,返回给前端
    $redis->zIncRby('hot','1','newsId-'.$news_id);//redis数据增长1
    return json($list);

4.点赞新闻

public function newsGoods()
{
    $redis   = new Redis();
    $param   = $this->request->param();
    $news_id = $param['news_id'];
    $redis->zIncRby('good','1','newsId-'.$news_id);//redis数据增长1
}

这时候基本业务代码已经完事。然后开始查看排行。首先测试查看一下热度排行和点赞排行的文章。

 dump($redis->zRange('hot','0','-1',true));//查看热度排行
 dump($redis->zRange('good','0','-1',true));//查看点赞排行

结果

热度
array(5) {
  ["newsId-3"] => float(2)
  ["newsId-4"] => float(4)
  ["newsId-1"] => float(6)
  ["newsId-2"] => float(9)
  ["newsId-5"] => float(16)
}
点赞
array(5) {
  ["newsId-1"] => float(3)
  ["newsId-2"] => float(8)
  ["newsId-3"] => float(10)
  ["newsId-4"] => float(14)
  ["newsId-5"] => float(48)
}

5.查看热度排行榜(包括新闻简介)注:可能有一种情况发生,文章id存在于排行榜中,但是对应文章的简介不在内存中,那就需要去数据库重新查此id文章的内容(我已经删除了newsId-2的简介)

//访问热度排行
public function newsHot()
{
    $redis   = new Redis();
    $rank    = $redis->handler()->zrevrange('hot','0','2');
    foreach ( $rank as &$row ){
        $id  = $row;
        $row = $redis->hGetAll($row);//去hash散列里取得之前存好的文章简介
        if(!$row){
            //缓存里没有该信息,去数据库查找
            $id = trim($id,'newsId-');//切割字符串。获得文章id
            $row = Db::name('news')->where('id',$id)->find();
        }
    }
    dump($rank);
}

结果

array(3) {
  [0] => array(4) {
    ["title"] => string(15) "第五个文章"
    ["name"] => string(7) "作者5"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["id"] => string(1) "5"
  }
  [1] => array(7) {
    ["id"] => int(2)
    ["title"] => string(15) "第二个文章"
    ["name"] => string(7) "作者2"
    ["detail"] => string(8) "详情22"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["hot"] => int(0)
    ["good"] => int(0)
  }
  [2] => &array(4) {
    ["title"] => string(7) "文章1"
    ["name"] => string(6) "作者"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["id"] => string(1) "1"
  }
}

其中第二个文章在redis内存中不存在,重新再数据库中查到的数据

6.查看点赞排行榜(包括新闻简介)

//点赞热度排行
public function newsGood()
{
    $redis   = new Redis();
    $rank = $redis->handler()->zrevrange('good','0','2');
    foreach ($rank as &$row){
        $id  = $row;
        $row = $redis->hGetAll($row);//去hash散列里取得之前存好的文章简介
        if(!$row){
            //缓存里没有该信息,去数据库查找
            $id = trim($id,'newsId-');//切割字符串。获得文章id
            $row = Db::name('news')->where('id',$id)->find();
        }
    }
    dump($rank);
}

结果:

array(3) {
  [0] => array(4) {
    ["title"] => string(15) "第五个文章"
    ["name"] => string(7) "作者5"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["id"] => string(1) "5"
  }
  [1] => array(4) {
    ["title"] => string(15) "第四个文章"
    ["name"] => string(7) "作者4"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["id"] => string(1) "4"
  }
  [2] => &array(4) {
    ["title"] => string(15) "第三个文章"
    ["name"] => string(7) "作者3"
    ["create_time"] => string(19) "2019-11-28 14:33:43"
    ["id"] => string(1) "3"
  }

}

到此这篇关于thinkphp5 操作redis 实现文章的热度排行和点赞排行的示例的文章就介绍到这了,更多相关thinkphp5 热度排行和点赞排行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • thinkPHP统计排行与分页显示功能示例

    本文实例分析了thinkPHP统计排行与分页显示功能.分享给大家供大家参考,具体如下: 1.分页参数 count 总数 firstRow 起始行 listRows 每一次获取记录数 list 每一页的记录(要与count对应一致就行) 2.分页对象 可以针对真实的数据表 也可以针对统计出来的数据表,或者说是虚拟的表 因为LIMIT是最后执行的,哪怕你进行group操作,哪怕你进行子查询 html <include file="Public:head" title="&q

  • thinkphp5 操作redis 实现文章的热度排行和点赞排行的示例

    使用redis hash散列 和zset有序集合实现文章的热度排行和点赞排行 1.首先为文章建立散列,存入基本信息. mysql简单设计 获取所有文章,并存入redis //所有新闻页 public function news() { $redis = new Redis(); $list = News::select(); foreach ($list as &$row){ //将所有数据存到hash散列里,用于显示简介信息 $redis->handler()->hmset('new

  • 教你怎么用Java操作Redis

    首先让我们创建一个普通的Maven工程,添加相应的依赖 <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.alib

  • Java中操作Redis的详细方法

    目录 1.准备操作 1.1 新建工程 1.2 sca-jedis工程依赖 1.3 sca-tempalte工程依赖 1.4 测试是否可以连接Redis 1.5 修改redis.conf文件 2. 基于Jedis实现对redis中字符串的操作 3. 模式总结 4. 连接池JedisPool应用 5. 单例模式创建连接池 拓展:volatile关键字 6. 项目工程实践 6.1 分布式id 6.2 单点登陆 6.3 投票系统 7. StringRedisTemplate 应用 7.1 修改yml文件

  • Java客户端利用Jedis操作redis缓存示例代码

    前言 Redis是一个开源的Key-Value数据缓存,和Memcached类似.Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). Jedis 是 Redis 官方首选的 Java 客户端开发包.下面就来给大家详细关于Java客户端利用Jedis操作redis缓存的相关内容,话不多说,直接来看示例代码吧. 示例代码: //连接redis ,redis的默认端口是6379 Jedis

  • tp5(thinkPHP5)操作mongoDB数据库的方法

    本文实例讲述了tp5(thinkPHP5)操作mongoDB数据库的方法.分享给大家供大家参考,具体如下: 1.通过composer安装 composer require mongodb/mongodb 2.使用 <?php /** * @author: jim * @date: 2017/11/17 */ namespace app\index\controller; use think\Controller; use MongoDB\Driver\Manager; use MongoDB\C

  • Python操作Redis之设置key的过期时间实例代码

    Expire 命令用于设置 key 的过期时间.key 过期后将不再可用. r.set('2', '4028b2883d3f5a8b013d57228d760a93') #成功就返回True 失败就返回False,下面的20表示是20秒 print r.expire('2',20) #如果时间没事失效我们能得到键为2的值,否者是None print r.get('2') 对于一个已经存在的key,我们可以设置其过期时间,到了那个时间后,当你再去访问时,key就不存在了 有两种方式可以设置过期时间

  • CI框架(CodeIgniter)操作redis的方法详解

    本文实例讲述了CI框架(CodeIgniter)操作redis的方法.分享给大家供大家参考,具体如下: 1. 在autoload.php 中加入 如下配置行 $autoload['libraries'] = array('redis'); 2. 在/application/config 中加入文件 redis.php 文件内容如下: <?php // Default connection group $config['redis_default']['host'] = 'localhost';

  • Jedis操作Redis数据库的方法

    本文实例为大家分享了Jedis操作Redis数据库的具体代码,供大家参考,具体内容如下 关于NoSQL的介绍不写了,直接上代码 第一步导包,不多讲 基本操作: package demo; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class Demo

  • PHP操作Redis常用技巧总结

    本文实例讲述了PHP操作Redis常用技巧.分享给大家供大家参考,具体如下: 一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 30); //密码认证:成功返回true,否则返回false $ret = $redis->auth('123456'); 二.String操作 //设置键值:成功返回true,否则返回false $redis->set(

  • Python操作redis实例小结【String、Hash、List、Set等】

    本文实例总结了Python操作redis方法.分享给大家供大家参考,具体如下: 这里介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建,存在则修改 r.set('name', 'zhangsan') '''参数: set(name, value, ex=None, px=None, nx=False, xx=False) ex,过期时间(秒) px,过期时间(毫秒) nx,如果设

随机推荐