​Redis:在集合中复制键

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 问题描述: 由于某种原因,我必须需要将某个集合的键(Key)复制一份副本。并移动到目标库

问题描述: 由于某种原因,我必须需要将某个集合的键(Key)复制一份副本。并移动到目标库


拿到这个问题,脑海里一共有两种方式


  • 将所有的此集合中的所有的值从redis里面读取出来,然后存进去。


  • 使用集合的思想进行取差集或并集。如果二者有一个且仅有一个为空那么他们返回的结果为有值的集合


方案一


将所有的此集合中的所有的值从redis里面读取出来,然后再存到目标库中。


思路清晰,不过多赘述。


640 (1).jpg


如果数据较少可以使用SMEMBERS


类型为set,其中有26781027个


由于直接使用redis命令不是那么方便,故Python代码


from loguru import logger
import redis
def conn_redis(db):
    """
    link redis
    :param db:
    :return: Redis Link object
    """
    REDIS_URL = f'redis://:{RedisPASSWD}@{RedisHOST}:{RedisPORT}/{db}'
    redis_client = redis.from_url(REDIS_URL)
    # 验证是否连接
    # print(redis_client.info())
    return redis_client
def get_val(key: str, step):
    """
    get values
    :param step:
    :param key:str
    :return:
    """
    try:
        redis_client = conn_redis(0)
        #  获取键的大小
        key_size = redis_client.scard(key)
        key_type = redis_client.type(key)
        logger.info(f'Key Name: {key}, key Type: {key_type} Key Size: {key_size}')
        page = int(key_size // step) + 1
        for i in range(0, page + 1):
            result = redis_client.sscan(key, i, '*', step)[1]
            yield result
    except Exception as e:
        logger.error(e)
def set_newVal(db):
    redis_client = conn_redis(db)
    redis_client.sadd("NewKey",result)


方案一优化


sadd("NewKey",result)还是比较慢。使用pipeline


方案二


由于是集合,可以使用集合的操作。


任何集合的本身的补、并、差都是本身


1.集合的交集& ,set.intersection()


2.集合的并集 | ,set. union()


3.集合的差集 set.difference(s2) 将集合s1里去掉和s2交集的部分


4.集合的交叉补集 set.symmetric_difference() 并集里去掉交集的部分


640 (2).jpg


创建集合 1,2,3


640 (3).jpg


取给定集合的并集存储在目标集合中


640 (4).jpg


取给差集合的并集存储在目标集合中


640 (5).jpg


这样就可以实现类似于copy的效果


所使用到的Redis命令


# help SMEMBERS
SMEMBERS key
summary: Get all the members in a set
since: 1.0.0
group: set
# help SSCAN
SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elements 增量迭代集合元素
since: 2.8.0
group: set
# help SUNIONSTORE
SUNIONSTORE destination key [key ...]
summary: Add multiple sets and store the resulting set in a key 添加多个集合并将生成的集合存储在一个键中
since: 1.0.0
group: set
# help SDIFFSTORE
SDIFFSTORE destination key [key ...]
summary: Subtract multiple sets and store the resulting set in a key 减去多个集合并将得到的集合存储在一个键中
since: 1.0.0
group: set


总结


采用先取后存以及使用集合的特性对于集合实现复制操作。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 NoSQL API
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
|
2月前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
40 5
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
28 3
|
2月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
27 2
|
3月前
|
存储 NoSQL Redis
6)深度解密 Redis 的集合(Set)
6)深度解密 Redis 的集合(Set)
56 1
|
4月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
6月前
|
缓存 NoSQL 安全
玩转Redis!非常强大的Redisson分布式集合,少写60%代码
Redisson是Java的Redis客户端,提供实时数据平台服务,简化了分布式环境下的数据管理。它包含RList、RSet、RMap等分布式集合,支持ConcurrentMap和Set接口,确保线程安全和数据一致性。例如,RMap实现了本地缓存和监听器功能,允许数据监听和本地加速读取。此外,还提供了RSet的排序和去重功能,以及RQueue和RBlockingQueue等队列实现,支持阻塞操作。通过Redisson,开发者能轻松处理分布式系统的数据同步和操作。
|
5月前
|
存储 NoSQL Java
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
|
6月前
|
存储 NoSQL Redis
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
|
6月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——集合操作与有序集合操作
【Redis】 Java操作客户端命令——集合操作与有序集合操作