阿里云redis CRDT产品支持说明

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: ## CRDT支持概述 CRDT天然支持redis的几种数据结构,下表给出一个简单映射: | __redis数据结构__ | __CRDT数据结构__ | | --- | --- | | string(int或double类型编码) | counter | | string | register | | set | set | | 基本kv | set + register

CRDT支持概述

CRDT天然支持redis的几种数据结构,下表给出一个简单映射:

redis数据结构 CRDT数据结构
string(int或double类型编码) counter
string register
set set
基本kv set + register
hash set + register
zset set + register
GEO set + register
hyperloglog set

然而对于redis来说,同一数据类型可能既存在CRDT中register的SET操作,又存在CRDT中counter的INCR操作。所以设计上我们考虑根据同一数据类型的不同命令划分命令集,不同命令集CRDT的实现方式不同。

CRDT支持原则

  • 目前仅支持redis 4.0版本
  • 所有CRDT操作均针对写(update)而言,所有的读(query)逻辑均保持不变
  • 对同一key或同一field同时进行同一命令集内的操作才能保证key或field最终一致

    • 对同一个key同时进行不同数据类型的操作不保证最终一致

      > 例如实例A上做SET key value,实例B上做SADD key a b,无法保证最终一致
      
    • 对同一个key同时进行同一数据类型不同命令集内的操作不保证最终一致

      > 例如实例A上做SET key 1,实例B上做INCR key 2,同步之后A的key为2,B的key为1,无法保证最终一致
      
    • 除了string类型, 对其它类型的key做DEL不做最终一致保证

      > 例如实例A上做DEL setkey,实例B上SADD setkey a b,无法保证最终一致
      

CRDT算法选择

  • 若命令集内所有命令间均具备交换律、结合律的,直接回放操作(op-based CRDT)
  • 若命令集对应的数据类型是set,使用基于时间戳做tag的OR-Set策略
  • 其它情况使用LWW(Last write wins)策略

CRDT命令集

string

分为string,计数器(counter),位操作(bit)三类命令进行讨论

string

  • CRDT典型使用场景:基础数据类型, 应用广泛
  • 保证命令集1: SET族 MSET MSETNX PSETEX GETSET DEL

    • 实现方式:LWW

      > 实例A上SET key a,然后在实例B上SET key b,同步之后以最新的操作为准,A和B上key均为b。
      > 实例A上SET key a,然后在实例B上SET key b;DEL key,同步之后以最新的操作为准,A和B上key均不存在。
      
  • 暂不保证: MOVE RENAME

    实例A上SET key a,同时实例B上MOVE key keyext,同步之后A上有keyext,B上有keyext和key。

  • 暂不保证: SETRANGE APPEND

    实例A进行APPEND key hello,同时实例B进行APPEND key world,最终在实例A和B上key的值可能分别为helloworld和worldhello。

counter

  • CRDT典型使用场景:计算全局pv, 转发数, 点赞数等
  • 保证命令集2: INCR DECR INCRBY DECRBY [INCRBYFLOAT]

    • 实现方式: op-based

      > 实例A上INCR k, 同时实例B上INCR k, 同步之后A和B上的k值均为2
      
  • 不保证:DEL SET

    在实例A上执行INCR k, 同时在实例B上执行SET k 2, 最终结果可能是A上k的值为2, B上k的值为3
    在实例A上执行INCR k, 同时在实例B上执行DEL k, 最终结果可能是A上k不存在, B上k的值为1

  • INCRBYFLOAT 会存在浮点数计算本身的精度差异

bit

  • 暂不保证

set

  • CRDT典型使用场景: 购物车,收藏夹
  • 保证命令集3: SADD SREM SPOP

    • 实现方式:OR-Set

      > 实例A上SADD key a, 同时实例B上SADD key b, 同步之后A和B上key均有a, b两个fields
      
  • 暂不保证:SMOVE SINTERSTORE SUNIONSTORE SDIFFSTORE

hash

  • CRDT典型使用场景: 用户,网站或应用的全局session信息
  • 保证命令集4:HSET HMSET HSETNX HDEL

    • 实现方式: OR-Set
  • 保证命令集5:HINCRBY

    • 实现方式:op-based

      > 同理, HSET或HDEL和HINCRBY在不同实例上同时操作不能保证最终一致
      
  • HINCRBYFLOAT 同样会存在浮点数精度差异

list

  • 暂不支持

hyperloglog

  • CRDT典型使用场景:统计全局的近似uv
  • 保证命令集6:PFADD

    • 实现方式:op-based
  • 暂不保证:PFMERGE
  • hll在redis中保存为string类型的对象, 所以原则上string类型的所有操作均可作用于hll之上, 但不建议对hll使用string类型的操作, 不仅保证不了最终一致, 还会破坏hll本身的正确性

zset

  • CRDT典型使用场景:用户带有时间序列信息, 如timeline
  • 保证命令集7:ZADD NX|XX|CH ZREM

    • 实现方式:OR-Set
  • 保证命令集8:ZADD INCR ZINCRBY

    • 实现方式:op-based
  • 暂不保证:ZINTERSTORE ZUNIONSTORE ZREMRANGEBYRANK ZREMRANGEBYSCORE ZREMRANGEBYLEX

geo

  • CRDT典型使用场景:全局地理位置信息
  • 保证命令集9:GEOADD

    • 实现方式:OR-Set
  • geo类型数据底层在redis中使用zset实现,所以原则上zset类型的所有操作均可作用于geo之上,但不建议对geo使用zset类型操作

其它redis特性支持

rdb

  • 在rdb中保存crdt相关元信息,保证下次加载之后满足一致性,同时对开源redis 4.0及阿里云redis 4.0其它产品形态保持兼容

expire

  • 对于expire的时间设置不保证最终一致,原则上以设置的最短过期时间为准,会分发DEL操作。

evict

  • 内存处于高水位的特殊情况,直接根据具体设置策略逐出,目前不做最终一致保证

lua

  • 支持lua脚本中执行的命令

实现代价

  • 性能上无影响
  • 每个key或field将多占用8个字节存储crdt相关元信息,未来可以压缩到4个字节
  • set和hash类型只支持 OBJ_ENCODING_HT 编码,zset类型只支持 OBJ_ENCODING_SKIPLIST 编码,以下几个配置项将不再起作用:
    set_max_intset_entries

hash_max_ziplist_entries hash_max_ziplist_value
zset_max_ziplist_entries zset_max_ziplist_value

  • rdb将额外占用空间存储crdt元信息,但保证兼容性
相关实践学习
基于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
目录
相关文章
|
17天前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
53 2
|
2月前
|
缓存 NoSQL Serverless
函数计算产品使用问题之如何使用Redis作为缓存插件
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
100 8
|
2月前
|
开发框架 运维 NoSQL
函数计算产品使用问题之如何通过内网连接Redis,并开放白名单
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
运维 NoSQL 数据管理
数据管理DMS产品使用合集之无法通过DMS登录Redis并收到"NOAUTH Authentication required"的错误提示,该怎么解决
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
75 1
|
3月前
|
分布式计算 NoSQL 大数据
MaxCompute产品使用问题之数据在redis里可以通过接口调用到大数据计算吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2月前
|
NoSQL Cloud Native Redis
|
3月前
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何确保多并发sink同时更新Redis值时,数据能按事件时间有序地更新并且保持一致性
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
分布式计算 NoSQL 大数据
MaxCompute产品使用合集之自定义udf连接云上vpc网络的redis获取数据的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
3月前
|
NoSQL Java Redis
数据管理DMS产品使用合集之在使用AWS DMS与ElastiCache for Redis进行通信时遇到Java超时错误,该怎么办
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
40 0
|
3月前
|
NoSQL 安全 Redis
阿里云redis安装
阿里云redis安装
75 0