Redis数据库:如何避免网络延迟问题?

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

我们知道Redis协议是构建在TCP协议之上的。所以当我们在脚本中调用Redis时,通常是以发送-应答-再发送-再应答的模式进行的,而每一次发送与应答,都需要数据从客户端到服务端飞一次。而且,这一切都是默认的。

  当你需要使用Redis处理多个命令时,这样时间都消耗到网络延迟上可能就不划算了,下面是几个使用Redis时避免网络延迟问题的方法,其实都是不同程度的组合请求:

  使用Redis新版本中的可变参数命令

  在Redis2.4中,很多命令的参数都开始支持批量了,如SADD, ZADD, LPUSH, RPUSH, HMSET等,如果你要对同一个命令带着不同参数调用多次,最好看一看是否其已经支持指参数了。这样你的命令只需要一次发送一次接收就行了。

  利用Redis的pipelining机制

  Redis本身就支持pipelining模式接受命令,也就是说你可以一次性向Redis发送多个命令,然后再等着他们的返回。返回的结果和你发送的数据顺序也是一致的。比如最简单的如下例:

$ (echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG
   当然,这得看你使用的语言客户端是否支持了。

  使用即将发布的Lua 脚本嵌入功能

  Lua脚本嵌入功能能够提供更大的灵活性,你不仅可以自定义组合你的命令。还可以完全在服务端处理你的业务逻辑。而不必将数据取回客户端处理后再请求客户端。

  使用SORT命令来取出多个key

  这个有点geek了,如果你使用了双层索引的形式在Redis中组织你的数据,比如第一层索引是一个list,里面放置了所有数据key对应id,第二层是通过这些id查找到具体的value。

  比如典型的,如果我们存储用户数据,可能存储上是用uid作为key用户信息作为value的,而我们有一个list,存储了某种特点用户的uid列表,比如今天的活跃用户,那么当我们需要取出所有活跃用户信息的时候,我们不必先获取到这个list,再用get或者multiget去取用户信息。我们完全可以通过一个如下的SORT命令来完成数据获取。

redis> SORT HotUser:list BY nonexistentkey GET FooBar|id|*
   其中nonexistent表示按自然顺序排序,这样Redis不会进行相应的排序操作,直接返回结果。
 










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/749523,如需转载请自行联系原作者
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
网络延迟导致终端卡顿
网络延迟导致终端卡顿
|
4月前
|
NoSQL Redis
Redis原理之网络通信协议笔记
1. RESP协议 ​2. 自定义Socket连接Redis
|
4月前
|
NoSQL Linux Redis
Redis原理之网络模型笔记
Redis采用单线程模型,这意味着一个Redis服务器在任何时刻都只会处理一个请求。Redis的网络模型涉及到阻塞I/O(Blocking I/O)、非阻塞I/O(Non-blocking I/O)、I/O多路复用(I/O Multiplexing)、信号驱动I/O(Signal-driven I/O)以及异步I/O(Asynchronous I/O)。
|
4月前
|
缓存 NoSQL 应用服务中间件
2.2.2 redis,memcached,nginx网络组件
2.2.2 redis,memcached,nginx网络组件
|
4天前
|
缓存 负载均衡 监控
中间件网络延迟
中间件网络延迟
16 2
|
8天前
|
存储 NoSQL Linux
Redis入门到通关之Redis5种网络模型详解
Redis入门到通关之Redis5种网络模型详解
24 1
|
9天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
2月前
|
存储 网络协议 网络性能优化
网络传输延迟
网络传输延迟
23 1
|
3月前
|
存储 并行计算 网络协议
|
3月前
|
存储 网络协议 数据中心