生活随笔
收集整理的這篇文章主要介紹了
redis实战之使用redis实现排行榜
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載:http://blog.csdn.net/u011250882/article/details/48632379
設想在一個游戲中,有上百萬的玩家數據,如果現在需要你根據玩家的經驗值整理一個前20名的排行榜,你會怎么做呢?
一般的做法是寫一條類似下面這條sql語句的方式來獲取:
[sql]?view plaincopy
select?*?from?game_socre?order?by?score?desc?limit?0,20??
這種方式在數據量較小的情況下可行,但是在數據量大的情況下查詢速度將變慢,特別是還需要聯表查詢時,速度下降的就更明顯了。
這時你可以考慮使用redis來實現這個功能。
實現這個功能主要用到的redis數據類型是redis的有序集合zset。zset 是set 類型的一個擴展,比原有的類型多了一個順序屬性.此屬性在每次插入數據時會自動調整順序值,保證value值按照一定順序連續排列。
主要的實現思路是:
1、在一個新的玩家參與到游戲中時,在redis中的zset中新增一條記錄(記錄內容看具體的需求)score為0
2、當玩家的經驗值發生變化時,修改該玩家的score值
3、使用redis的ZREVRANGE方法獲取排行榜
實現代碼:
functions.PHP
[php]?view plaincopy
<?php?? function?setRank($key,?$socre,?$userInfo){?? ????require_once?'iredis.php';???? ????$redis?=?new?iredis();?? ????var_dump($redis->zadd($key,?$socre,?$userInfo));?? ?? }?? ?? function?getRank($key,?$withscores=true){?? ????require_once?'iredis.php';???? ????$redis?=?new?iredis();?? ????return?$redis->ZREVRANGE($key,?0,?-1,?$withscores);?? }??
iredis.php
[php]?view plaincopy
<?php?? class?iredis?extends?Redis?? {?? ????public?function?__construct(){?? ????????parent::__construct();?? ????????$this->connect('127.0.0.1',?'6379');?? ????}?? }??
index.php
[php]?view plaincopy
<?php?? require_once?"functions.php";?? ?? ?? setRank('rank',?100,??? ????json_encode(?? ????????array(?? ????????????'img'?=>?'http://www.×××.com/××.jpg',?? ????????????'username'?=>?'ben',?? ????????????'userId'?=>?23?? ????????)?? ????)?? );?? ?? ?? setRank('rank',?250,??? ????json_encode(?? ????????array(?? ????????????'img'?=>?'http://www.×××.com/××.jpg',?? ????????????'username'?=>?'dongxie',?? ????????????'userId'?=>?33?? ????????)?? ????)?? );?? ?? ?? setRank('rank',?50,??? ????json_encode(?? ????????array(?? ????????????'img'?=>?'http://www.×××.com/××.jpg',?? ????????????'username'?=>?'xidu',?? ????????????'userId'?=>?45?? ????????)?? ????)?? );?? ?? ?? setRank('rank',?6000,??? ????json_encode(?? ????????array(?? ????????????'img'?=>?'http://www.×××.com/××.jpg',?? ????????????'username'?=>?'xidu',?? ????????????'userId'?=>?45?? ????????)?? ????)?? );?? ?? var_dump(getRank('rank'));??
執行結果:
總結
以上是生活随笔為你收集整理的redis实战之使用redis实现排行榜的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。