namespace app\redis\controller; use Predis\Client; use think\Controller; class Tools extends Controller { public $oneWeekInSecond = 604800; public $voteScore = 432; public $redis = ''; public function __construct() { $redisConfig = config('redis'); $this->redis = new Client($redisConfig); } public function index() { //发布文章 // $this->postArticle(1, 'test1', 'test1'); // $this->postArticle(1, 'test2', 'test2'); // $this->postArticle(1, 'test3', 'test3'); //对文章投票 // $article['id'] = 1; // $article['name'] = 'article:1'; // $this->articleVote(2,$article); // $this->articleVote(3,$article,0); //获取文章 // $article = $this->getArticles(1); // halt($article); } //发布文章 public function postArticle($user,$title,$link) { //生成文章id $articleId = $this->redis->incr('article:'); //将发布者添加到已投票的用户组去 $voted = 'voted:'.$articleId; $this->redis->sadd($voted,$user); $this->redis->expire($voted,$this->oneWeekInSecond); $article = 'article:'.$articleId; $this->redis->hmset($article,[ 'title' => $title, 'link' => $link, 'poster' => $user, 'time' => time(), 'votes' => 1, 'opvotes' => 0 ]); $this->redis->zadd('score:',[$article => $this->voteScore]); $this->redis->zadd('time:',[$article =>time()]); return $articleId; } //用户投票功能 public function articleVote($user_id,$article,$type = 1) { $publishTime = $this->redis->zscore('time:',$article['name']); //获取文章发布时间(超过一周不再允许投票) if ($publishTime + $this->oneWeekInSecond < time()) { return; } //投赞成票 if ($type == 1){ $result = $this->redis->sadd('voted:'.$article['id'],$user_id); if ($result) { $this->redis->zincrby('score:',$this->voteScore,$article['name']); $this->redis->hincrby($article['name'],'votes',1); } }else{ //实现反对票 //1。检查用户是否投过赞成票 $hasVoted = $this->redis->sismember('voted:'.$article['id'],$user_id); if ($hasVoted) { return; } $result = $this->redis->sadd('OpVoted:',$user_id); if ($result) { $this->redis->zincrby('score:',-$this->voteScore,$article['name']); $this->redis->hincrby($article['name'],'opvotes',1); } } } //获取文章 public $articlePerPage = 25; public function getArticles($page,$order = 'score:') { $start = ($page - 1) * $this->articlePerPage; $end = $start + $this->articlePerPage - 1; $ids = $this->redis->zrevrange($order,$start,$end); $articles = []; foreach ($ids as $id){ $articleData = $this->redis->hgetall($id); $articleData['id'] = $id; $articles[] = $articleData; } return $articles; } //添加或者删除文章分组 public function addOrRemoveGroups($articleId,array $toAdd,array $toRemove) { $article = 'article:'.$articleId; foreach ($toAdd as $group){ $this->redis->sadd('group:'.$group,$article); } foreach ($toRemove as $group){ $this->redis->srem('group:'.$group,$article); } } //获取组内的文章 public function getGroupArticles($group,$page,$order = 'score:'){ $key = $order.$group; if ($this->redis->exists($key)) { $this->redis->zinterstore($key,['group:'.$group,$order],['aggregate' => 'max']); $this->redis->expire($key,60); } return $this->getArticles($page,$key); }