Add docs for Timeseries (#324)

diff --git a/community/data-structure-on-rocksdb.md b/community/data-structure-on-rocksdb.md
index d7b86f0..2f195a0 100644
--- a/community/data-structure-on-rocksdb.md
+++ b/community/data-structure-on-rocksdb.md
@@ -453,3 +453,88 @@
                                        | (8byte) double |
                                        +----------------+
 ```
+
+## TimeSeries
+
+RedisTimeSeries is a Redis module that enables a full-featured time-series database within Redis. To bring this powerful capability to Kvrocks, we've implemented a compatible TimeSeries data structure, leveraging RocksDB for efficient storage and retrieval.
+
+#### TimeSeries metadata
+
+The metadata stores the overall configuration for a single time series, such as retention, duplicate policy and chunk settings. 
+
+```text
+        +----------+----------+-----------+------------------+----------------+-----------+-----------+----------------+----------------+-----------+
+key =>  |  flags   |  expire  |  version  | size(chunkCount) | retentionTime  | chunkSize | chunkType | duplicatePolicy| sourceKey_size | sourceKey |
+        | (1byte)  |  (Ebyte) |  (8byte)  |      (Sbyte)     |    (8byte)     |  (8byte)  |  (1byte)  |    (1byte)     |    (4byte)     |  (Xbyte)  |
+        +----------+----------+-----------+------------------+----------------+-----------+-----------+----------------+----------------+-----------+
+```
+- `retentionTime`: Maximum age (in milliseconds) for samples compared to the latest timestamp. A value of `0` disables retention.
+- `chunkSize`: The preferred number of samples per data chunk.
+- `chunkType`: The storage format of the chunk (compressed or uncompressed).
+- `duplicatePolicy`: An enum represents the policy to handle samples with duplicate timestamps (e.g., BLOCK, FIRST, LAST).
+- `sourceKey`: If this series is a downstream target for compaction, this field stores the key of the source series.
+
+#### TimeSeries sub keys-values
+
+Internally, TimeSeries data structure uses several types of sub-keys to store its components: **time chunks**, **labels**, and **downstream rule metadata**. A **key type** enum is used as a prefix in the key to differentiate between them.
+
+| key type     | enum value |
+| ------------ | ---------- |
+| `CHUNK`      | 0          |
+| `LABEL`      | 1          |
+| `DOWNSTREAM` | 2          |
+
+##### CHUNK sub keys
+The actual time series data is stored in sequential blocks called **chunks**. Each chunk is identified by a `chunk_id`, which corresponds to the timestamp of the first sample within that chunk.
+
+```text
+                              +--------+------------+----------+------------+----------+   +------------+----------+
+key|version|CHUNK|chunk_id => | count  | timestamp1 |  value1  | timestamp2 |  value2  |...| timestampN |  valueN  |
+                              |(8byte) |  (8byte)   |  (8byte) |  (8byte)   |  (8byte) |...|  (8byte)   |  (8byte) |
+                              +--------+------------+----------+------------+----------+   +------------+----------+
+```
+
+##### LABEL sub keys
+These sub keys store label key-value pairs associated with the time series.
+
+```text
+                                   +----------------+
+key|version|LABEL|label_key1 =>    |  label_value1  |
+                                   |    (Xbyte)     |
+                                   +----------------+
+                                   +----------------+
+key|version|LABEL|label_key2 =>    |  label_value2  |
+                                   |    (Xbyte)     |
+                                   +----------------+
+...
+```
+
+##### DOWNSTREAM sub keys
+Kvrocks supports RedisTimeSeries's compaction rules, which automatically aggregate data from a source series into a destination (or downstream) series. This sub-key stores the configuration for each compaction rule applied to the source series.
+
+```text
+                                          +-------------+----------------+-------------+---------------------+------------+
+key|version|DOWNSTREAM|downstream_key =>  |  aggregator |bucket_duration |  alignment  | latest_bucket_index |  auxinfo   |
+                                          |   (1byte)   |   (8byte)      |   (8byte)   |       (8byte)       |  (XByte)   |
+                                          +-------------+----------------+-------------+---------------------+------------+
+```
+- `aggregator`, `bucket_duration`, `alignment` are the parameters defined by the [compaction rule](https://redis.io/docs/latest/commands/ts.createrule/).
+- `latest_bucket_index`: Tracks the index of the latest bucket to optimize ongoing aggregations.
+- `auxinfo`: Auxiliary data to speed up aggregations without re-scanning the entire bucket. Upon appending samples, it is [updated whenever a new chunk is created](https://github.com/apache/kvrocks/blob/b5b419995c8327bd07a6d63090da367d98f59b72/src/types/redis_timeseries.cc#L322) in the source series.
+
+#### label-based reverse index
+
+To enable fast, label-based queries, a reverse index is maintained. This index is critical for efficiently locating all time series that match a given set of label filters. It is stored in a dedicated `Index` Column Family.
+
+```text
++-------------+-------------+------------+--------------+---------+
+|  namespace  | index type  | label_key  | label_value  |   key   | => null
+|  (1+Xbyte)  |  (1byte)    | (4+Ybyte)  |  (4+Zbyte)   | (Kbyte) |
++-------------+-------------+------------+--------------+---------+
+
+```
+`index type` is an enum that distinguishes between different types of indexes. For TimeSeries, it currently includes the following value:
+
+| index type     | enum value |
+| ------------   | ---------- |
+| `TS_LABEL`     | 0          |