redis实战之使用redis实现排行榜
转载:http://blog.csdn.net/u011250882/article/details/48632379
设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前20名的排行榜,你会怎么做呢?
一般的做法是写一条类似下面这条sql语句的方式来获取:
- 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
- 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
- class iredis extends Redis
- {
- public function __construct(){
- parent::__construct();
- $this->connect('127.0.0.1', '6379');
- }
- }
index.php
- <?php
- require_once "functions.php";
- //设置ben的score
- setRank('rank', 100,
- json_encode(
- array(
- 'img' => 'http://www.×××.com/××.jpg',
- 'username' => 'ben',
- 'userId' => 23
- )
- )
- );
- //设置dongxie的score
- setRank('rank', 250,
- json_encode(
- array(
- 'img' => 'http://www.×××.com/××.jpg',
- 'username' => 'dongxie',
- 'userId' => 33
- )
- )
- );
- //设置xidu的score
- setRank('rank', 50,
- json_encode(
- array(
- 'img' => 'http://www.×××.com/××.jpg',
- 'username' => 'xidu',
- 'userId' => 45
- )
- )
- );
- //更新xidu的score
- setRank('rank', 6000,
- json_encode(
- array(
- 'img' => 'http://www.×××.com/××.jpg',
- 'username' => 'xidu',
- 'userId' => 45
- )
- )
- );
- var_dump(getRank('rank'));
执行结果:
redis实战之使用redis实现排行榜相关推荐
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现"stringRedisTemplate.opsForList()"的强大,抓紧时间恶补下. 通过spring-d ...
- 【Redis实战】认识Redis中的全局哈希表
文章目录 Redis是如何支持基于Key的快速访问的 全局哈希表 哈希表结构 哈希冲突 一张图 相关源码 Redis是如何支持基于Key的快速访问的 一谈到Redis,马上能想到的就是:"快 ...
- redis实战(12):Redis性能监控指标汇总
1. 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>sprin ...
- Redis —— Redis In Action —— Redis 实战—— 基础篇 —— Redis 的常见命令解析 以及 Redis 结合客户端的快速上手使用—— SpringData Redis
- 2021-03-23 - 高性能 Redis 实战
1.应用场景 主要用于学习Redis 底层实现,编程思想,以及可参考借鉴的技术, 同时在日常开发中如何高效实践高性能 Redis服务. 2.学习/操作 1.文档阅读 高性能 Redis 实战 | La ...
- Redis 实战篇:GEO 助我邂逅附近女神
码老湿,阅读了你的巧用数据类型实现亿级数据统计之后,我学会了如何游刃有余的使用不同的数据类型(String.Hash.List.Set.Sorted Set.HyperLogLog.Bitmap)去解 ...
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
- redis实战教程_Redis详解新手教程_Redis入门到精通
redis实战教程由一线互联网公司技术大牛亲自打造,结合真实项目实战演练,小白也能轻松入门,胜任企业岗位需求,薪资8K起!redis学习和使用,11年架构师指导学习,让你少走弯路,轻松学会! redi ...
- Redis 实战笔记
Redis yum源安装 yum install -y epel-release redis systemctl enable redis systemctl start redis systemct ...
最新文章
- python中adb连接手机_Python脚本利用adb进行手机控制的方法
- Centos 6 克隆导致网卡eth0变成eth1、及修改网卡名的方法
- 石川es6课程---1-2、ES6简介
- 使用tracee编写规则追踪系统安全事件
- mysql将时间戳转成常用可读时间格式
- CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)
- linux 丢包排查思路简述(tcp+rdma)
- hdu4699-Editor【对顶栈】
- mysql centos 安装目录在哪_centos中如何查看mysql安装目录在哪
- iframe 页面富文本框数据怎么保存_文字太多PPT怎么做都丑?估计是没注意这些细节!...
- html5渲染,HTML的渲染过程
- 游戏服务器停机维护,网络游戏是如何做到服务器不停机维护的?
- C++ STL map集合的使用
- 将任何变量的值进行二进制输出的方法
- JLU数据结构第六次上机实验解题报告
- Android 控件的各种方法介绍
- 学习ArrayList 和 LinkedList小记【2】
- awl多线程SYN***
- mezzanine用户扩展/PUBLIC USER ACCOUNTS(一)
- python模拟登录教务系统_用Python实现模拟登录正方教务系统抢课
热门文章
- spark任务jvm内存溢出
- 吴恩达机器学习 -- 正则化
- jQuery的DOM操作之取值/赋值(1)
- jQuery的概念、用法、常见面试题详解
- 搭建MySQL+MHA服务易错位置
- Exchange Server 2013 一步步安装图解
- java 与C++ 数据类型大小
- php点击按钮变文字,点击按钮文字变成input框,点击保存变成文字的实现
- 幼儿园 php,input.php
- python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...