阿里云redis CRDT产品支持说明

简介: ## 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元信息,但保证兼容性
目录
相关文章
|
3月前
|
存储 NoSQL Redis
阿里云高性能数据库Tair(兼容 Redis)收费价格,稳定可靠成本低
阿里云高性能云数据库Tair兼容Redis,提供Redis开源版和Tair企业版,支持多种存储介质与灵活扩展,适用于高并发场景。Tair具备亚毫秒级稳定延迟,保障业务连续性。价格方面,Redis开源版年费从72元起,Tair企业版年费从1224元起,具体费用根据配置不同有所变化。
NoSQL 数据可视化 关系型数据库
96 0
|
监控 NoSQL Redis
开发者如何使用阿里云Redis
【10月更文挑战第2天】开发者如何使用阿里云Redis
1861 0
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
1335 2
|
缓存 NoSQL Serverless
函数计算产品使用问题之如何使用Redis作为缓存插件
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
252 8
|
开发框架 运维 NoSQL
函数计算产品使用问题之如何通过内网连接Redis,并开放白名单
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
125 0
|
NoSQL Cloud Native Redis
|
运维 NoSQL 数据管理
数据管理DMS产品使用合集之无法通过DMS登录Redis并收到"NOAUTH Authentication required"的错误提示,该怎么解决
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
250 1
|
NoSQL Java Redis
数据管理DMS产品使用合集之在使用AWS DMS与ElastiCache for Redis进行通信时遇到Java超时错误,该怎么办
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
197 0
|
存储 NoSQL Redis
Redis混合存储产品与架构介绍
简介 Redis混合存储实例是阿里云自主研发的完全兼容Redis协议和特性的混合存储产品。通过将部分冷数据存储到磁盘,在保证绝大部分访问性能不下降的基础上,大大降低了用户成本并突破了内存对Redis单实例数据量的限制。
9480 0