阿里云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元信息,但保证兼容性
相关实践学习
基于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
目录
相关文章
|
2月前
|
存储 运维 数据安全/隐私保护
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
82 0
|
2月前
|
运维 文件存储 对象存储
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
53 0
|
2月前
|
弹性计算 运维 NoSQL
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(二)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(二)
72 0
|
2月前
|
弹性计算 运维 负载均衡
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(一)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)
67 0
|
3月前
|
弹性计算 NoSQL 算法
阿里云Redis与Tair压力测评
无意中发现阿里云开发社区的训练营活动,其中有一个7天玩转Redis、tair训练营计划,里面可以免费领取三个月的试用礼包,因为是参营任务,不领取都不行的那种,领取之后放着也是放着,不如跑跑数据看看Redis和Tair的性能有什么区别,简单的压力测试下,本次测试并不精确,也不具有太多参考意义,真的就是为了测试而测试。
98 0
|
4月前
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
5月前
|
弹性计算 NoSQL Linux
在阿里云服务器上安装Redis教程
在阿里云服务器上安装Redis教程,阿里云持久内存服务器ECS可用于搭建Redis内存型数据库,云服务器吧以阿里云服务器ECS持久内存型、Alibaba Cloud Linux镜像操作系统安装Redis 6.0.5或Redis 3.2.12详细操作流程如下:
542 0
|
5月前
|
弹性计算 NoSQL Linux
阿里云持久内存服务器安装Redis by Alibaba Cloud Linux
阿里云持久内存型云服务器ECS有re7p、r7p、re6p等,云服务器吧以持久内存型re6p实例ecs.re6p-redis.2xlarge为例,操作系统镜像为Alibaba Cloud Linux 2.1903 LTS 64位,安装Redis 6.0.5或Redis 3.2.12教程如下:
86 0
|
5月前
|
弹性计算 NoSQL Linux
阿里云ECS服务器安装Redis教程by Alibaba Cloud Linux系统
阿里云ECS服务器安装Redis教程by Alibaba Cloud Linux系统,Alibaba Cloud Linux 2针对Redis应用进行了专项调优,相比社区版操作系统,Redis应用整体性能提升20%以上。Alibaba Cloud Linux 2内置Redis 6.0.5和Redis 3.2.12的yum源,执行sudo yum install命令即可部署Redis 6.0.5和Redis 3.2.12。
156 0
|
5月前
|
弹性计算 NoSQL Linux
阿里云Alibaba Cloud Linux安装Redis方法流程
阿里云Alibaba Cloud Linux服务器操作系统安装Redis,Alibaba Cloud Linux 2针对Redis应用进行了专项调优,相比社区版操作系统,Redis应用整体性能提升20%以上。Alibaba Cloud Linux 2内置Redis 6.0.5和Redis 3.2.12的yum源,执行sudo yum install命令即可部署Redis 6.0.5和Redis 3.2.12。
151 0
推荐文章
更多