转载:http://blog.csdn.net/u011250882/article/details/48632379

设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前20名的排行榜,你会怎么做呢?

一般的做法是写一条类似下面这条sql语句的方式来获取:

[sql] view plaincopy
  1. 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
  1. <?php
  2. function setRank($key, $socre, $userInfo){
  3. require_once 'iredis.php';
  4. $redis = new iredis();
  5. var_dump($redis->zadd($key, $socre, $userInfo));
  6. }
  7. function getRank($key, $withscores=true){
  8. require_once 'iredis.php';
  9. $redis = new iredis();
  10. return $redis->ZREVRANGE($key, 0, -1, $withscores);
  11. }

iredis.php

[php] view plaincopy
  1. <?php
  2. class iredis extends Redis
  3. {
  4. public function __construct(){
  5. parent::__construct();
  6. $this->connect('127.0.0.1', '6379');
  7. }
  8. }

index.php

[php] view plaincopy
  1. <?php
  2. require_once "functions.php";
  3. //设置ben的score
  4. setRank('rank', 100,
  5. json_encode(
  6. array(
  7. 'img' => 'http://www.×××.com/××.jpg',
  8. 'username' => 'ben',
  9. 'userId' => 23
  10. )
  11. )
  12. );
  13. //设置dongxie的score
  14. setRank('rank', 250,
  15. json_encode(
  16. array(
  17. 'img' => 'http://www.×××.com/××.jpg',
  18. 'username' => 'dongxie',
  19. 'userId' => 33
  20. )
  21. )
  22. );
  23. //设置xidu的score
  24. setRank('rank', 50,
  25. json_encode(
  26. array(
  27. 'img' => 'http://www.×××.com/××.jpg',
  28. 'username' => 'xidu',
  29. 'userId' => 45
  30. )
  31. )
  32. );
  33. //更新xidu的score
  34. setRank('rank', 6000,
  35. json_encode(
  36. array(
  37. 'img' => 'http://www.×××.com/××.jpg',
  38. 'username' => 'xidu',
  39. 'userId' => 45
  40. )
  41. )
  42. );
  43. var_dump(getRank('rank'));

执行结果:

redis实战之使用redis实现排行榜相关推荐

  1. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现"stringRedisTemplate.opsForList()"的强大,抓紧时间恶补下. 通过spring-d ...

  2. 【Redis实战】认识Redis中的全局哈希表

    文章目录 Redis是如何支持基于Key的快速访问的 全局哈希表 哈希表结构 哈希冲突 一张图 相关源码 Redis是如何支持基于Key的快速访问的 一谈到Redis,马上能想到的就是:"快 ...

  3. redis实战(12):Redis性能监控指标汇总

    1. 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>sprin ...

  4. Redis —— Redis In Action —— Redis 实战—— 基础篇 —— Redis 的常见命令解析 以及 Redis 结合客户端的快速上手使用—— SpringData Redis

  5. 2021-03-23 - 高性能 Redis 实战

    1.应用场景 主要用于学习Redis 底层实现,编程思想,以及可参考借鉴的技术, 同时在日常开发中如何高效实践高性能 Redis服务. 2.学习/操作 1.文档阅读 高性能 Redis 实战 | La ...

  6. Redis 实战篇:GEO 助我邂逅附近女神

    码老湿,阅读了你的巧用数据类型实现亿级数据统计之后,我学会了如何游刃有余的使用不同的数据类型(String.Hash.List.Set.Sorted Set.HyperLogLog.Bitmap)去解 ...

  7. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  8. redis实战教程_Redis详解新手教程_Redis入门到精通

    redis实战教程由一线互联网公司技术大牛亲自打造,结合真实项目实战演练,小白也能轻松入门,胜任企业岗位需求,薪资8K起!redis学习和使用,11年架构师指导学习,让你少走弯路,轻松学会! redi ...

  9. Redis 实战笔记

    Redis yum源安装 yum install -y epel-release redis systemctl enable redis systemctl start redis systemct ...

最新文章

  1. python中adb连接手机_Python脚本利用adb进行手机控制的方法
  2. Centos 6 克隆导致网卡eth0变成eth1、及修改网卡名的方法
  3. 石川es6课程---1-2、ES6简介
  4. 使用tracee编写规则追踪系统安全事件
  5. mysql将时间戳转成常用可读时间格式
  6. CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)
  7. linux 丢包排查思路简述(tcp+rdma)
  8. hdu4699-Editor【对顶栈】
  9. mysql centos 安装目录在哪_centos中如何查看mysql安装目录在哪
  10. iframe 页面富文本框数据怎么保存_文字太多PPT怎么做都丑?估计是没注意这些细节!...
  11. html5渲染,HTML的渲染过程
  12. 游戏服务器停机维护,网络游戏是如何做到服务器不停机维护的?
  13. C++ STL map集合的使用
  14. 将任何变量的值进行二进制输出的方法
  15. JLU数据结构第六次上机实验解题报告
  16. Android 控件的各种方法介绍
  17. 学习ArrayList 和 LinkedList小记【2】
  18. awl多线程SYN***
  19. mezzanine用户扩展/PUBLIC USER ACCOUNTS(一)
  20. python模拟登录教务系统_用Python实现模拟登录正方教务系统抢课

热门文章

  1. spark任务jvm内存溢出
  2. 吴恩达机器学习 -- 正则化
  3. jQuery的DOM操作之取值/赋值(1)
  4. jQuery的概念、用法、常见面试题详解
  5. 搭建MySQL+MHA服务易错位置
  6. Exchange Server 2013 一步步安装图解
  7. java 与C++ 数据类型大小
  8. php点击按钮变文字,点击按钮文字变成input框,点击保存变成文字的实现
  9. 幼儿园 php,input.php
  10. python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...