Redis压力测试
指令:./redis-benchmark -h 127.0.0.1
Redis实现分表分库
Redis数据压力
如果mysql压力不够,使用mycat
如果tomcat压力不够,使用nginx
如果redis内存不够呢?
这时我们可以使用分表分库。
分库思路
- 不管数据库还是客户的缓存都找代理(网关)
- 对Key进行路由(这里是通过Key的长度取模)
- 把数据存到相应Redis服务器
代码解析
redis默认端口6379,在这里我们增添6380、6381两个端口
package com.zyc.split;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* Redis分库
*/
public class RedisProxy {
private static List<String> servers = new ArrayList<String>();
//初始化
static {
servers.add("127.0.0.1:6379");
servers.add("127.0.0.1:6380");
servers.add("127.0.0.1:6381");
}
// 最简单的代理实现负载均衡
public static void main(String[] args) throws Exception {
// 监听端口
ServerSocket serverSocket = new ServerSocket(19000);
Socket socket;
while ((socket = serverSocket.accept()) != null) {
try {
while(true) {
System.out.println("一个链接....");
InputStream inputStream = socket.getInputStream();
byte[] request = new byte[1024];
inputStream.read(request);
// 解析请求 RESP
String req = new String(request);
System.out.println("收到请求:");
System.out.println(req);
String[] params = req.split("\r\n");
// 获取key的长度
int keyLenth = Integer.parseInt(params[3].split("\\$")[1]);
// 根据key长度取模
int mod = keyLenth % servers.size();
// 根据取模结果获取地址
System.out.println("根据算法选择服务器:" + servers.get(mod));
//127.0.0.1:6380
String[] serverInfo = servers.get(mod).split(":");
// 处理请求
Socket client = new Socket(serverInfo[0], Integer.parseInt(serverInfo[1]));
client.getOutputStream().write(request);
// 返回结果
byte[] response = new byte[1024];
client.getInputStream().read(response);
client.close();
socket.getOutputStream().write(response);
System.out.println("##############打印结束");
System.out.println();
}
}catch (Exception e) {
}
}
}
}