首页 > 数据库 >如何用java将本地redis 中所有类型数据同步到阿里云redis中

如何用java将本地redis 中所有类型数据同步到阿里云redis中

时间:2023-08-18 20:55:05浏览次数:51  
标签:targetJedis java String redis Redis 阿里 key localJedis

在分布式系统中,数据同步是一个重要的任务,特别是在将数据从一个 Redis 实例同步到另一个 Redis 实例的情况下。本篇博客将介绍如何使用 Java 编程语言以及 Jedis(Java Redis 客户端)库来实现将本地 Redis 中的所有类型数据同步到阿里云 Redis 实例中。

核心代码

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.exceptions.JedisException;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class RedisDataSyncAll {

    public static void main(String[] args) {
    
        // 本地 Redis 连接信息
        String localHost = "localhost";
        int localPort = 6379;
        JedisPool localJedisPool = new JedisPool(localHost, localPort);

        // 阿里云 Redis 连接信息
        String aliyunHost = "your_aliyun_redis_host";
        int aliyunPort = 6379;
        String aliyunPassword = "your_aliyun_redis_password";
        JedisPool aliyunJedisPool = new JedisPool(aliyunHost, aliyunPort);
        

        try (Jedis localJedis = localJedisPool.getResource(); Jedis targetJedis = targetJedisPool.getResource()) {
            targetJedis.auth(aliyunPassword);

            Set<String> keys = localJedis.keys("*");
            if (keys.isEmpty()) {
                System.out.println("本地Redis数据需要同步.");
                return;
            }
            int syncedCount = 0;
            for (String key : keys) {
                try {
                    String type = localJedis.type(key);

                    if ("string".equals(type)) {
                        String value = localJedis.get(key);
                        targetJedis.set(key, value);
                    } else if ("hash".equals(type)) {
                        Map<String, String> hashData = localJedis.hgetAll(key);
                        targetJedis.hmset(key, hashData);
                    } else if ("list".equals(type)) {
                        List<String> listData = localJedis.lrange(key, 0, -1);
                        targetJedis.del(key);  // 清空目标 Redis 中的旧数据
                        targetJedis.lpush(key, listData.toArray(new String[0]));
                    } else if ("set".equals(type)) {
                        Set<String> setData = localJedis.smembers(key);
                        targetJedis.del(key);  // 清空目标 Redis 中的旧数据
                        targetJedis.sadd(key, setData.toArray(new String[0]));
                    } else if ("zset".equals(type)) {
                        Set<redis.clients.jedis.Tuple> zsetData = localJedis.zrangeWithScores(key, 0, -1);
                        targetJedis.del(key);  // 清空目标 Redis 中的旧数据
                        for (redis.clients.jedis.Tuple tuple : zsetData) {
                            targetJedis.zadd(key, tuple.getScore(), tuple.getElement());
                        }
                    }

                    // 处理过期时间
                    long ttl = localJedis.ttl(key);
                    if (ttl > 0) {
                        targetJedis.expire(key, (int) ttl);
                    }
                    syncedCount++;
                } catch (JedisConnectionException e) {
                    // 处理连接异常,例如记录日志、重新尝试等
                    handleConnectionException(e);

                } catch (JedisDataException e) {
                    // 处理数据类型异常等
                    e.printStackTrace();
                } catch (JedisException e) {
                    // 处理其他 Redis 异常
                    e.printStackTrace();
                }
            }
            if (syncedCount > 0) {
                System.out.println("Data sync completed. Synced " + syncedCount + " keys.");
            } else {
                System.out.println("No data to sync.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void handleConnectionException(JedisConnectionException e) {
        // 处理连接异常,例如记录日志、重新尝试等
        System.out.println("Connection to Redis failed: " + e.getMessage());
        // 可以添加其他处理逻辑,比如重新尝试连接等
    }
}

 

标签:targetJedis,java,String,redis,Redis,阿里,key,localJedis
From: https://www.cnblogs.com/zyt-bg/p/17641588.html

相关文章

  • JavaScript中常见的数据结构和算法及其应用场景简介
    在JavaScript编程中,数据结构和算法是必不可少的组成部分。本文将介绍JavaScript中常见的数据结构和算法以及它们的应用场景。数据结构数组数组是JavaScript中最常见的数据结构之一。它是一种有序的集合,可以存储任意类型的数据。由于数组支持快速随机访问,因此它非常适合用于存......
  • 阿里云不同主体账号合并ECS主机资源迁移记录
    迁移记录需求A账号和B账号是不同的阿里云认证主体,要求A账号下的资源要迁移到B账号下,方便统一管理。A账号资源vpc:10.0.0.0/8B账号资源vpc:172.16.0.0/12A账号和B账号已做了vpc对等连接。操作步骤1.A账号:修改A账号的认证主体为B账号的认证主体,否则不能进行迁移......
  • Redis的使用
    Redis是基于内存的数据库,读取和存储非常快,很适合作为缓存服务器。Redis的优点是支持多种类型,可以将数据持久化道硬盘,支持事务,支持集群。Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供......
  • Springboot使用Redisson作为分布式锁
    官方地址:https://github.com/redisson/redisson/wiki/Table-of-Content一些官网说明    Redisson采用了基于NIO的Netty框架,不仅能作为Redis底层驱动客户端,具备提供对Redis各种组态形式的连接功能,对Redis命令能以同步发送、异步形式发送、异步流形式发送或管道形式发送的功能......
  • json与java对象转换
    导入包fasjsonjava对象转json//1.查询所有这张表所有的数据,调用Service层的selectAll()List<Brand>bs=brandService.selectAll();System.out.println(bs); //2.将java集合转成JSON数据StringjsonString=JSON.toJSONString(bs);  json转java对象 //1.获取......
  • 微服务集成redis并通过redis实现排行榜的功能
    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目,之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html由于redis的安装网上教程很多,再次不再赘述,现在默认你已经安装好了redis 1.在需要redis的微服务下面添加下面依赖<dependency><groupId>org.spri......
  • 阿里云OSS图片上传和显示注意点
    1.java.lang.IllegalArgumentException:Theobjectkey"/image-业务名称/20230818/20230818-订单号参数-accident.jpg"isinvalid.Anobjectnameshouldbebetween1-1023byteslongwhenencodedasUTF-8andcannotcontainLForCRorunsupportedcharsinX......
  • 基于Redis实现关注、取关、共同关注及消息推送(含源码)
    微信公众号访问地址:基于Redis实现关注、取关、共同关注及消息推送(含源码)一、简介       实现用户之间的关注和取消关注、查询是否关注、共同关注及关注后消息采用feed方式推送及滚动分页查看效果等相关功能。利用redis里面的Set集合实现关注,取关,共同关注,消息推送等,结合Jav......
  • java实现大文件上传控件
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1. 通过form表单向后端发送请求         <formid="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="pos......
  • PostgreSQL与Java类型的对照
    PostgreSQL™                JavaSE8date                    LocalDatetime                   LocalTimetimestamp withouttimezone      LocalDateTimetimestampwithtimezon......