本文转载自微信公众号《漫漫科技之路》,作者刘力。转载本文请联系漫漫技术路公众号。接口请求量正在增加。为了缩短服务响应时间,减轻数据库的压力,我们通常会在数据库前架设Redis。但是单个Redis的内存是有限的,所以我们需要部署多个Redis节点。在业务中,我们可以将读写请求根据key转发到不同的Redis节点,或者直接将业务接入一个Proxy,请求路由规则由Proxy处理。对于客户端来说,Proxy相当于一个Redis。客户端连接Redis和Proxy本质上没有区别。目前业界有很多RedisProxy,比如大名鼎鼎的Codis。使用别人的产品会让你感到不舒服。作为一个热爱创造的程序员,当然要自己写一个RedisProxy。本文介绍一款自研的RedisProxy——Nedis。架构图特点1.无状态,Nedis节点可水平扩展2.数据分片,读写分离3.支持多路由4.基于Netty开发,性能好,轻量级实现原理从架构图中我们可以看出,Nedis是主要由两个组件组成,netty-client和netty-server。netty-client作为Redis客户端,如Jedis和redis-cli可以直接连接Nedis。准确的说,Redis客户端连接的是Nedis的netty-client组件。netty-client组件处理Redis客户端发送的请求,然后对请求进行简单的解码。解析出key后,根据key的hash值对请求进行转换。转发到对应的netty-server。netty-server的作用如下:netty-server起到连接作用。上半部分是netty-client,接收Redis客户端的请求,下半部分连接Redis读写分离集群,将Redis客户端的请求发送给Redis,Redis的响应给netty-server,netty-server通过channel将数据返回给Redis客户端。Nedis启动后,会启动多个netty-server,每个netty-server连接一个Redis读写分离集群。Nedis的端口和Redis读写分离集群的信息都在配置文件中配置。让我向您展示以下内容。信息IP端口角色redis1127.0.0.16379redis-serverredis2127.0.0.16381redis-serverNedis127.0.0.16380proxy启动两个Redis,端口分别为6379和6381,然后启动Nedis连接这两个Redis,Nedis端口为6380,通过redis-cli分别连接redis和Nedis,然后在连接Nedis的客户端输入命令。在监控中可以看到数据是按照key的hash值进行分片的。一些小细节遇到keys命令怎么办?对于数据库代理、数据库分表中间件MyCat、Shardingsphere等,我们可以很方便的通过分表字段,比如userId,primarykey,找到我们想要的数据。但是通过非分表字段,比如user_name,create_time,查询需要扫描所有的数据。RedisProxy也是如此,比如keys命令,info命令等,需要检查所有的Redis节点,汇总后返回数据给客户端。在Nedis中,诸如键之类的命令是被禁止的。如果Nedis收到keys等命令,Nedis会随机选择一个Redis,将单个Redis的数据返回给客户端。单个Nedis扛不住怎么办?Jedis等客户端连接到Nedis节点。如果一个Nedis节点性能不足,可以分布式部署多个Nedis,水平扩展可以提高Nedis集群的性能和可用性。未来规划总的来说,Nedis还有很多功能需要完善。1、支持读写分离2、配置热更新3、支持指定key路由到指定Redis4、支持一致性哈希等多种路由规则,减少Redis扩容或缩容带来的缓存穿透问题
