redis跨实例迁移key(Python 版)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 测试区Codis集群之前废了,今天重新搭起来之后,测试程序发现很多key的数据都没了。如果整个库迁移过来没有必要。 只需要把特定的几个key迁移过来即可。

测试区Codis集群之前废了,今天重新搭起来之后,测试程序发现很多key的数据都没了。

如果整个库迁移过来没有必要。 只需要把特定的几个key迁移过来即可。

hash、list string 类型key 迁移


以下为Python版本实现

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :redis_key_mig 
@File :redisMigrate.py
@Author :ninesun
@Date :2021/11/29 14:22
@Desc: 
'''
import sys
import redis
# 迁移hash
def moveHash(cursor):
    cursor, data = r.hscan(key, cursor)
    for eachKey in data:
        rNew.hset(key, eachKey, data[eachKey])
    print(key, "---处理了---", len(data), '个')
    if cursor != 0:
        print(cursor, "批处理")
        moveHash(cursor)
    else:
        print(cursor, "处理完成了")
# 迁移list
def moveList():
    length = r.llen(key)
    if length == 0:
        print(key, "---list迁移结束---剩余长度", length)
    else:
        # 每次迁移一千个
        start = length - 1000;
        if start < 0:
            start = 0
        data = r.lrange(key, start, -1)
        pl = r.pipeline();
        for eachI in data:
            setAdd = r.sadd("ordernokey_move", eachI);
            if setAdd == 1:
                pl.rpush("aaaaaaa", eachI)
            else:
                print("迁移的key的值重复了", eachI)
        pl.execute()
        if start == 0:
            # 清空
            r.ltrim(key, 1, 0)
        r.ltrim(key, 0, start - 1)
        moveList()
############################
if __name__ == '__main__':
    # key = sys.argv[1]
    # opeID 迁移
    # key = 'ope_array'
    # key = 'ope_cf'
    # key = 'ope_oc'
    #
    # key = 'prod_array'
    # key = 'prod_cf'
    # key = 'prod_oc'
    key = 'basicOwn'
    print('输入的key是:' + key)
    # ip = '47.254.149.109'
    # password = 'Kikuu2018'
    ip1 = '10.50...'
    ip2 = '10.50...'
    # 连接redis
    r = redis.Redis(host=ip1,  port=19000, db=0,
                    decode_responses=True)
    # 连接redis  带接收的库
    rNew = redis.Redis(host=ip2,  port=19000, db=0,
                       decode_responses=True)
    keyType = r.type(key)
    if keyType == 'string':
        rNew.set(key, r.get(key))
        print("key=" + key + "迁移到新库")
    if keyType == 'hash':
        cursor = r.hlen(key)
        print(" key值长度是 + ", cursor)
        moveHash(0)
    if keyType == 'list':
        moveList()

批量迁移某个soted set 类型的key


由于业务需要,需要迁移集群中的几个key,数量不大,不过key需要自己拼接。

其中一个key的类型是string

另外一个key的类型是zset。

b06697ad9fd84216ab80972722d4d5dc.pngpy代码如下

# 迁移soted set
def moveZset(keyStr):
    key = keyStr.lstrip()
    length = r.zcard(key)
    if length == 0:
        get_logger().info("%s ---list迁移结束---剩余长度: %s", key, length)
        return
        # print(key, "---list迁移结束---剩余长度", length)
    else:
        # 每次迁移一千个
        start = length - 1000;
        if start < 0:
            start = 0
        data = r.zrange(key, 0, -1, withscores='true')
        pl = r.pipeline();
        count = 1
        for eachI in data:
            length = length - 1
            score = str(eachI[1])
            value = eachI[0]
            # ch=true 仅仅是update 了score 才会,原封不动的zadd直接返回0
            zaddRet = rNew.zadd(key, {value: score}, ch='true');
            scoreRet = r.zcard(key)
            scoreRetNew = rNew.zcard(key)
            # rNew.delete(key)
            # if scoreRet != scoreRetNew:
            #     get_logger().error("数据不一致,key: %s,scoreRet: %s, scoreRetNew: %s",key,scoreRet,scoreRetNew)
            if zaddRet == 1:
                pl.zadd(key, {value: score})
                count = count + 1;
            else:
                count = count + 1;
                # get_logger().info("迁移的key的值重复了,第: %s个key: %s,score: %s",count,key,scoreRet)
                # print("迁移的key的值重复了,key: ", key)
        get_logger().info("---剩余长度: %s", length);

normally the return value of ZADD only counts the number of new elements added.  zadd不会返回已存在的元素


更新score也意味着在有序集合中的位置变化。

zadd 中的score范围是多少呢?


between -9007199254740992 and 9007199254740992

踩的坑


错误的姿势

正确的姿势

zadd:db.zadd(REDIS_KEY, {member:score})

竟让是member在前score在后。和redis的操作刚好相反.

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
28天前
|
缓存 监控 NoSQL
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
189812 2
|
1月前
|
NoSQL 关系型数据库 Redis
DMS产品常见问题之dms登录redis实例时报错如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
|
1天前
|
人工智能 安全 数据安全/隐私保护
Python中多种生成随机密码超实用实例
Python中多种生成随机密码超实用实例
8 0
|
7天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
129 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
8天前
|
存储 运维 NoSQL
通过OOS实现定时备份Redis实例转储到OSS
基于阿里云 Redis 备份功能,现结合 OOS 推出自动转储至 OSS 的新方案,解决了数据安全风险、运维繁琐、成本增加和效率低下等问题。新方案亮点包括: 1. 数据安全性提高:备份文件自动上传至OSS,利用OSS的数据冗余存储,保证数据在硬件故障时的持久性和可用性。 2. 完全自动化:设置好定时规则后,备份和转储过程无需人工干预。 3. 多实例多地域集中管理:支持一次选择多个实例和跨区域备份,简化管理。 4. 灵活的备份策略和成本控制:自定义备份频率,并通过OSS生命周期管理策略控制成本。 5. 监控和告警:集成OSS和云监控,实时掌握备份状态,及时处理异常。
132 0
|
9天前
|
存储 机器学习/深度学习 数据可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
57 6
|
9天前
|
机器学习/深度学习 数据可视化 算法
PYTHON用决策树分类预测糖尿病和可视化实例
PYTHON用决策树分类预测糖尿病和可视化实例
17 0
|
10天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
15 0
|
12天前
|
Python
python学习12-类对象和实例对象
python学习12-类对象和实例对象
|
19天前
|
NoSQL Redis 数据库
通过migrate命令实现两个redis实例之间的数据迁移
通过migrate命令实现两个redis实例之间的数据迁移

热门文章

最新文章