# Sudis简介
Sudis 是一款的高性能(NOSQL)的key-value内存数据库。它使用C++语言编写,高性能缓存数据库PowerDB,是一个功能强大的数据存储系统,具有高性能、丰富的数据结构、持久化、分布式支持等特点。它被广泛应用于缓存、消息队列、会话存储、计数器、排行榜、实时分析等各种场景,并通过其简单的API和丰富的功能满足了开发者对高性能数据存储的需求。 它主要有以下特点和功能:
内存存储:
Sudis主要将数据存储在内存中,因此读写速度非常快。与传统关系型数据库相比,不需要从磁盘读取数据,从而大大提高了访问速度。
数据结构丰富:
Sudis支持多种数据结构,除了常见的String(字符串)、List(列表)、Set(集合)、Hash(哈希表)和Sorted Set(有序集合),还提供了以下几种特殊的数据结构。
- Bitmaps(位图):位图是一种特殊的字符串,它的每一个bit都可以进行操作。在位图中,可以设置、获取和计算位的值,适用于一些需要进行位级别操作的场景,如权限控制、在线状态跟踪等。
- HyperLogLog:HyperLogLog是用于实现基数(cardinality)估计的数据结构。它可以用来估计一个集合中元素的数量,且占用的空间很小。通过HyperLogLog可以快速估算一个集合的基数,但会存在一定的估计误差。
- Geo(地理位置):Sudis提供了一系列的地理位置相关的命令,使得可以在Sudis中存储和查询地理位置信息。可以方便地将经纬度坐标与其他信息关联起来,如存储地理位置坐标和搜索附近的位置。
- Streams(流):Streams是一种轻量级的消息流发布和消费模型。它可以实现多个生产者和消费者之间的异步通信,并支持发布者和订阅者之间的消息传递。Streams可以用于构建消息队列、日志订阅等场景。这些数据结构可以适用于不同的应用场景,Sudis提供丰富的操作方法和数据存储方式。
持久化:
Sudis支持两种持久化方式,分别是RDB和AOF(Append Only File)。RDB是将Sudis的数据在指定时间间隔内保存到硬盘上的快照方式,而AOF是通过追加方式将每条Redis命令写入日志文件。通过持久化,可以在Sudis重启时将数据恢复到内存中,保证数据的可靠性。
高效的读写操作:
除了内存存储的优势外,PowerDB还实现了高效的读写操作。例如,可以直接在String数据结构上进行原子性的递增和递减操作,对List和Set等数据结构可以进行快速的插入、删除和查找操作,实现高效的数据处理。
分布式支持:
提供了Cluster分布式解决方案,可以将数据分布在多个节点上,提供更好的高可用性和负载均衡能力。Cluster使用哈希槽(hash slots)的方式将数据分片,每个节点负责处理一部分数据,实现水平扩展和分布式存储。
发布/订阅:
可以实现消息的发布和订阅机制。可以将消息发布到指定的频道,所有订阅了该频道的客户端都可以接收到该消息,实现了简单的消息队列功能。
事务支持:
通过MULTI、EXEC、WATCH和DISCARD等命令实现事务的原子性操作。可以将多个命令组合成一个事务,保证这些命令在执行过程中不被其他客户端中断。
# 使用场景
Sudis的使用场景有如下一些:
读写效率要求高,需要将数据进行缓存的。此时,可以把一些需要频繁访问的数据,而且在短时间之内不会发生变化的,放入Sudis中进行操作,从而提高用户的请求速度和降低网站的负载,降低数据库的读写次数。
需要实时计算的场景。需要实时变化和展示的功能,就可以把相关数据放在Sudis中进行操作,可以大大提高访问效率
# 产品系列
# 单机版
最简单的架构就是单机部署。将sudis安装在一台物理机或虚拟机上,作为应用程序的缓存层。这种部署适用于小规模应用或开发环境。业务应用客户端把 sudis 当做缓存来使用,从实体数据库中查询数据,然后写入到 sudis 中,之后业务应用再从 sudis 中读取这些数据,由于数据都存储在内存中,所以这个速度飞快。为防止宕机时内存数据丢失, sudis支持数据定时或实时持久化备份,适用于对数据可靠性有要求的场景。备份时为了不影响正常的业务处理,sudis采用多线程处理,把数据写到内存由主线程来做,写内存完成后就给客户端返回结果,然后 Sudis 用另一个线程去写磁盘文件,这样就可以避免主线程写磁盘对性能的影响. 单机版没有主从机制,不提供HA高可用,对服务高可用有要求的,建议使用集群版。

# 集群版
Sudis 集群版是采用分布式架构,支持垂直和水平的扩缩容,拥有高度的灵活性、可用性和高达百万级 QPS 的高性能。Sudis 集群版典型配置是水平方向 3 分片的扩展,每个分片作为主节点挂接两个从节点。垂直方向可实现扩展,扩容、缩容、迁移过程业务几乎无感知,做到最大的系统可用性。
