redis集群,root总是没有权限。MySQL集群,MQ集群也是
它们都使用独立于操作系统的用户
MySQLClusterImprovedDemo.java
import redis.clients.jedis.Jedis;
import java.sql.*;
public class MySQLClusterImprovedDemo {
//创建操作Redis和数据库的对象
private Jedis masterJedis; //指向主Redis服务器
private Jedis slaveJedis; //指向从Redis服务器
private Connection masterConn; //连接主库的对象
private Connection slaveConn; //连接从库的对象
PreparedStatement masterPs=null; //对主库进行操作的对象
PreparedStatement slavePs=null; //对从库进行操作的对象
private void init(){
//MYSQL的连接参数
String mySQLDriver="com.mysql.cj.jdbc.Driver";
String masterUrl="jdbc:mysql://192.168.159.33:3306/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
String slaveUrl="jdbc:mysql://192.168.159.33:3316/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
String user="root";
String pwd="123456";
try{
Class.forName(mySQLDriver);
masterConn= DriverManager.getConnection(masterUrl,user,pwd);
slaveConn= DriverManager.getConnection(slaveUrl,user,pwd);
masterJedis=new Jedis("192.168.159.33",6379);
slaveJedis=new Jedis("192.168.159.33",6380);
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
private void insertData(){
//是向主MySQL服务器插入数据
try{
masterPs=masterConn.prepareStatement("insert into student(id,name,age,score) values(10,'Frank',18,100)");
masterPs.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
private String getNameByID(String id){
String key="Stu"+id;
String name="";
//如果存在于Redis,就先从Redis里获取
if(slaveJedis.exists(key)){ //到从Redis服务器去找
System.out.println("ID: "+key+" exists in Redis.");
name=slaveJedis.get(key);//找到后到从Redis里读
System.out.println("Name is: "+slaveJedis.get(key));
return name;
}else{ //没在Redis,就到从MySQL去读
try{
slavePs=slaveConn.prepareStatement("select name from student where id=10");
ResultSet rs=slavePs.executeQuery();
if(rs.next())
{
System.out.println("ID: "+key+" exists in Slave MySQL");
name=rs.getString("name");
System.out.println("Name is: "+name);
//放入主Redis缓存
masterJedis.set(key,name);
}
return name;
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
return name;
}
public static void main(String[] args) {
MySQLClusterImprovedDemo tool=new MySQLClusterImprovedDemo();
tool.init();
tool.insertData();
//场景1 在主Redis中没有读到,则到从MySQL服务器中读
System.out.println(tool.getNameByID("10"));
//场景2 当前ID=10已经存在于Redis,所以直接读缓存
System.out.println(tool.getNameByID("10"));
}
}
为了突出重点,这里我并没有设置“缓存失效时间”和“防止缓存穿透”等方面的实施代码,但是这些要点同样重要。