redis在游戏服务器中的使用初探(四) redis应用
文章系列先介绍环境搭建 介绍redis操作和代码编写运行 这是典型的实战工程过程。
那么我们为何要使用redis而不是常规的数据库比如 mysql呢?
因为KV内存数据库最大的优势所有数据全部存储在内存中,速度快,而且key-value的特点也决定了他良好的扩展性.
以下几点作为游戏服务器中的应用示例,更多的使用方法可以在实践中继续探索优化
1 数据库缓存
比如前一章节的用户数据,在mysql进行读写和redis上进行读写在大量并发访问的场景下,差别是很大的。
Redis提供了较为丰富数据类型,使我们可以更为容易地将数据对象缓存起来(序列化、protobuffer)。
当需要请求某一数据时,先从Redis中查找,如果没有再查数据库,同时交给Redis缓存起来。
当对数据进行修改时,则先将修改后的数据保存到Redis,然后保存至数据库
在保存到数据库这一环节根据不用的数据处理需求 可以有不用的思路
A不实时保存到数据库,而是交由另外的线程(甚至是专门的程序)去保存,以提高逻辑层的响应速度。
B部分数据交给Redis保存(Reids自身有持久化功能),像玩家已经完成过的任务ID集合,利用Redis的Set类型保存更为合适。
C玩家瞬时变化的数据不见得每次修改都需要保存(比如金钱、经验),但如果游戏服务器自己维护在内存中,出现宕机就会导致回档。
Redis是独立于游戏服务器的,交由它来保存,可以防止宕机回档的问题,也可以减少游戏服务器自己维护数据所占用的内存。

2 玩家排行榜
游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。
一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合。
但是有时候我们需要每一个玩家的排名,玩家的数量太多,不能利用数据库(全表排序压力太大),自己维护也会比较麻烦。
使用Redis可以很好的解决这个问题。它提供的有序Set,支持每个键值(比如玩家id)拥有一个分数(score),每次往这个set里添加元素,
Redis会对其进行排序,修改某一元素的score后,也会更新排序,在获取数据时,可以指定排序范围。
更重要的是,这个排序结果会被保存起来,不用在服务器启动时重新计算。
通过它,排行榜的实时刷新、全服排行都不再成为麻烦事。
redis中可以使用sorted set,将排序的值设置成sorted set中的score,每次执行一条zadd即可

3 取最新N个数据的操作
比如你可以把上面说到的 sorted set 的 score 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,
不仅是清除 Redis 中的过期数据,你完全可以把 Redis 里这个过期时间当成是对数据库中数据的索引,
用 Redis 来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
参考
https://www.cnblogs.com/captainl1993/p/4788236.html
https://www.cnblogs.com/agent-k/p/Redis.html
《redis实战》 www.ChinaDBA.net 中国DBA超级论坛电子书
redis在游戏服务器中的使用初探(四) redis应用的更多相关文章
- redis在游戏服务器中的使用初探(一) 环境搭建
这里我们尝试在游戏服务器中的数据处理中使用redis 通过该系列文章能够学习 redis的基本操作 源码编译 客户端开源库的编译和使用 以及在游戏服务器中的缓存使用 作为初次摸索 尽量使得环境简单 ...
- redis在游戏服务器中的使用初探(三) 信息存储
摘要: 搭建了服务器环境 有了客户端 我们来假想下以下应用场景:我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:用户ID,为查找的key,存储的value ...
- redis在游戏服务器中的使用初探(二) 客户端开源库选择
上文提到 搭建完成后 我们选择客户端的开源库进行连接 有以下三种选择 1 acl-redis 原因是支持VC 国产 作者博客 acl 框架库简介 用 acl 库编写高效的 C++ redis ...
- Redis在游戏服务器中的应用
排行榜游戏服务器中涉及到很多排行信息,比如玩家等级排名.金钱排名.战斗力排名等.一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合.但是有时 ...
- 游戏服务器菜鸟之C#初探四游戏服务
经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- 游戏服务器菜鸟之C#初探三游戏服务
在经过上述2番折腾之后,最后决定使用TCP进行通信,所以在一次进行重构 主要重构的要点 1.将过来的HTPP请求,重构为TCP请求: 2.使用组件FluenScheduler进行怪物的定时刷新,和定时 ...
- Centos7搭建redis,同一服务器启动两个端口的redis
1.安装redis [1]下载安装包 #准备安装文件夹 mkdir /usr/local/soft/redis #进入文件夹 cd /usr/local/soft/redis #下载安装包 wget ...
- 游戏服务器菜鸟之C#初探二游戏服务
经过短时间的折腾,为了解决上述问题,我对游戏进行一些简单的重构,以便能解决当前的瓶颈 添加了缓存服务器进行处理一些及时数据和配置数据,来缓解数据库的压力和IO的压力: 只能说解决当前的暂时性问题,但是 ...
随机推荐
- PTA上Java问题自查与提问方法
自查 首先请一定先看这篇文章<PTA中提交Java程序的一些套路>.该文囊括了PTA中提交Java程序的几乎所有常见问题,请仔细阅读可以少踩很多坑 题目测试方法:复制样例输入,然后打开一个 ...
- js鼠标拖动(转载)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C#编程经验-function advanced params
function advanced params:outrefparamsnot useful,to use them is a burden,so i dont use themdefects:ou ...
- C#编程经验-选择结构和循环结构
选择结构:if elseif else ifswitch 循环结构:whiledo whilefor()foreach() 种类太多,不便记忆,人脑要记多种结构,要用的时候一种也把握不住所以,为方便记 ...
- java中int算法的有趣现象
今天无意中发现一个怪事,当时没理解,后来跟网友讨论了才知道原理,是关于int值的加法算法,两段代码如下: 代码1: @Test public void test1() { ; ; try { whil ...
- oracle自定义函数返回结果集
首先要弄两个type,不知道什么鬼: 1. create or replace type obj_table as object ( id ), name ), ) ) 2. create or re ...
- android 开发 View _16 自定义计步器View、自定义柱状图View
/** *@content:实现计步的环形View *@time:2018-7-30 *@build: */ public class CountStepsAnnularView extends Vi ...
- 1.微信小程序里如何设置当地时间?
方法一: 1.效果图 2.wxml code: <!--pages/index/index.wxml--> <text>当前时间:{{time}}</text> & ...
- tensorflow实战系列(四)基于TensorFlow构建AlexNet代码解析
整体流程介绍: 我们从main函数走,在train函数中,首先new了一个network;然后初始化后开始训练,训练时设定设备和迭代的次数,训练完后关闭流程图. 下面看network这个类,这个类有许 ...
- threading.local()源码分析
前段时间写了个多线程的程序,了解到Python中有个与众不同的thread.local()方法,可以创建一个全局对象,各个线程可以用这个全局对象保存各自的局部变量,而在使用时不受其他线程的影响.于是抽 ...