Redis-Redis如何避免网络延迟问题

Redis-Redis如何避免网络延迟问题

归属感 发布于 2017-05-10 字数 220 浏览 1242 回复 3

我们在脚本中调用Redis时,通常是以发送-应答-再发送-再应答的模式进行的,,而每一次发送与应答,都需要数据从客户端到服务端飞一次。但是当你需要使用Redis处理多个命令时,多次请求就会消耗一部分在网络延迟上,这个如何避免呢

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-11-10 3 楼
偏爱自由 2017-10-09 2 楼

原文链接:Redis优化之网络延迟

我们知道Redis协议是构建在TCP协议之上的。所以当我们在脚本中调用Redis时,通常是以发送-应答-再发送-再应答的模式进行的,而每一次发送与应答,都需要数据从客户端到服务端飞一次。而且,这一切都是默认的。
当你需要使用Redis处理多个命令时,这样时间都消耗到网络延迟上可能就不划算了,下面是几个使用Redis时避免网络延迟问题的方法,其实都是不同程度的组合请求:
1.使用Redis新版本中的可变参数命令
在Redis2.4中,很多命令的参数都开始支持批量了,如SADD, ZADD, LPUSH, RPUSH, HMSET等,如果你要对同一个命令带着不同参数调用多次,最好看一看是否其已经支持指参数了。这样你的命令只需要一次发送一次接收就行了。
2.利用Redis的pipelining机制
Redis本身就支持pipelining模式接受命令,也就是说你可以一次性向Redis发送多个命令,然后再等着他们的返回。返回的结果和你发送的数据顺序也是一致的。比如最简单的如下例:

$ (echo -en "PINGrnPINGrnPINGrn"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG

当然,这得看你使用的语言客户端是否支持了。
3.使用即将发布的Lua 脚本嵌入功能
Lua脚本嵌入功能能够提供更大的灵活性,你不仅可以自定义组合你的命令。还可以完全在服务端处理你的业务逻辑。而不必将数据取回客户端处理后再请求客户端。
4.使用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不会进行相应的排序操作,直接返回结果。此方法可详见:Using Redis SORT and GET to save on roundtrips

偏爱自由 2017-07-06 1 楼

如果你的操作无法进行批处理或用pipeline,直接的办法就是增加redis服务数量,然后客户端做shar处理,可以增加一定的并发

突发奇想
像操作频繁,然每次操作的命令基本一样的话,我们可以在redis服务器上自己架一个serversocket(长连接),用这个serversocket直接与redis服务器通讯,减少网络延迟,如果用shell脚本实现可能更快,还可以采用unix socket,这么处理的目的就是可以实现消息的压缩,将每次通讯的消息进行压缩,怎么压缩我们可以自己定,根据自己实际使用情况实现即可,因为tcp通讯时将一个报文切成了固定大小的N个报文,适当压缩可以将少数据包的数量(貌似是这样 哈哈)
当然如果你的redis服务器和你的应用在局域网中可能用处不大,其实向北京链接内蒙之间也就跨3~5个路由器,北京访问baidu也就经过2~3个路由而已