# javaredis
**Repository Path**: good_me/javaredis
## Basic Information
- **Project Name**: javaredis
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-12-05
- **Last Updated**: 2024-12-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于Java实现Redis
## 前述
+ 关于redis作为缓存中间件是后端服务常见常用的缓存中间件,因为是基于C语言开源的,学了redis这么久就有了用golang或者Java实现一个redis的想法,但是网上已经有了golang版本的,所以我想做一个Java版本的redis.
+ 基本上是看着官网进行学习的https://redis.io/docs redis,实现一个简易版本的redis 但是数据结构都会实现以及aof和rdb.
## 架构图
## 简介
+ tcp服务没有采用netty实现,而是采用原生的NIO(全部实现)
+ redis是一个巨大的map,有着频繁扩容和缩容的操作,所以这里并不采用Java自带的HashMap,而是自定义实现的渐进式hash扩容Map
+ 常规数据类型与操作指令支持
* string:get/mget/set/mset(全部实现)
* list:lpush/lpop/rpush/rpop/lrange(lpush、lpop已实现)
* set:sadd/sismember/srem(未完成)
* hashmap:hset/hget/hdel(未完成)
* sortedset:zadd/zremzrangebyscore (未完成)
+ 数据持久化机制
* aof(未完成)
* rdb(已开始未完成)
## 核心架构流程
## redis理论知识
### 协议RESP
+ tcp服务器中通信客户端和服务端之前要有一个协议格式(这样服务端才能认识客户端给他发送的数据),比如常见的http...一系列之类的但是http协议太过于大有一些对于redis来说是一种无效传输。
所以定义了一些协议格式叫RESP.https://redis.io/docs/latest/develop/reference/protocol-spec/#resp-protocol-description
我们主要是做的就是tcp传输数据后,我们拿到数据按照RESP协议来解析这个数据转换成命令即可。这一步最简单的方式就是看官方文档,看一遍不行就两遍。
个人理解就是二进制传输协议
### rdb和aof
+ https://redisbook.readthedocs.io/en/latest/internal/rdb.html 先看rdb的设计 然后理解它的设计,然后用代码实现即可。
### 主从复制
+ 官方文档 https://redis.io/docs/latest/operate/oss_and_stack/management/replication/
+ 理论知识点可以参考ddia这本书的第五章:<<复制>>
+ 目前这个简易Redis,我采用的单领导者(single leader,单主)+异步复制
### 数据结构和数据类型
https://redis.io/docs/latest/develop/data-types/
#### 数据结构
+ list采用的双向链表(已实现)
+ dict采用的渐进式hash扩容(已实现)
+ sds没做采用的jdk String(已实现)
+ 跳表(未实现)