今天又是摸鱼的一天,突然想到后续一个任务中需要使用生产redis数据,得想点办法把生产的redis搞下来。。。。
虽然网上的redis数据同步方案有很多,但是都太高端了,总想满足使用需求就行了,于是。。。
思路如下:
扫描生产redis的key,PS:一般的jedis的连接工具都支持
get生产环境数据
set到开发环境
不出所料,要踩坑,直接用get,set会触发WRONGTYPE,因为数据类型的原因
查看源码,发现有dump,与restore方法(序列化与反序列化)
尝试
![](https://i-blog.csdnimg.cn/blog_migrate/f6088eb49b57b60afcce540b6b15d89d.png)
宾果,成功了!!
源码如下:
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.util.Set;
@Component("redisSyncTask")
public class RedisSyncTask {
/**
* raw_data_prd表数据同步
* 生产表名称:raw_data_prd
* 本地表名称:raw_data_prd
*/
public void sync(Integer prdDbIndex,Integer devDbIndex) {
RedisConnection prdConn= this.getPrdRedis(prdDbIndex);
RedisConnection devConn=this.getDevRedis(devDbIndex);
Set<byte[]> keys= prdConn.keys("*".getBytes(StandardCharsets.UTF_8));
keys.forEach(key->{
byte[] value=prdConn.dump(key);
System.out.println("key="+new String(key));
devConn.restore(key,0l,value);
});
}
public RedisConnection getPrdRedis(int prdDbIndex){
//单机模式
RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();
rsc.setPort(6379);
rsc.setPassword("XXX");
rsc.setHostName("XXX");
rsc.setDatabase(prdDbIndex);
JedisConnectionFactory fac = new JedisConnectionFactory(rsc);
fac.afterPropertiesSet();
RedisConnection redisConnection=fac.getConnection();
return redisConnection;
}
public RedisConnection getDevRedis(int devDbIndex){
//单机模式
RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();
rsc.setPort(6379);
rsc.setPassword("XXX");
rsc.setHostName("XXX");
rsc.setDatabase(devDbIndex);
JedisConnectionFactory fac = new JedisConnectionFactory(rsc);
fac.afterPropertiesSet();
RedisConnection redisConnection=fac.getConnection();
return redisConnection;
}
public static void main(String[] args) {
RedisSyncTask redisSyncTask=new RedisSyncTask();
redisSyncTask.sync(11,8);
}
}