Skip to content

Commit

Permalink
[docs update] redis 数据结构部分
Browse files Browse the repository at this point in the history
  • Loading branch information
Snailclimb committed Jul 20, 2022
1 parent e7b6ee6 commit a96400c
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 64 deletions.
19 changes: 13 additions & 6 deletions docs/database/redis/redis-data-structures-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@ tag:
- Redis
---

你可以在 Redis 官网上找到 Redis 数据结构非常详细的介绍:[Redis Data Structures](https://redis.com/redis-enterprise/data-structures/) 。未来随着 Redis 新版本的发布,可能会有新的数据结构出现,通过查阅 Redis 官网对应的介绍,你总能获取到最靠谱的信息。
你可以在 Redis 官网上找到 Redis 数据结构非常详细的介绍:

- [Redis Data Structures](https://redis.com/redis-enterprise/data-structures/)
- [Redis Data types tutorial](https://redis.io/docs/manual/data-types/data-types-tutorial/)

未来随着 Redis 新版本的发布,可能会有新的数据结构出现,通过查阅 Redis 官网对应的介绍,你总能获取到最靠谱的信息。

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/database/redis/image-20220720181630203.png)

## String(字符串)

Expand Down Expand Up @@ -130,7 +137,7 @@ Redis 中的 List 其实就是链表数据结构的实现。我在 [线性数据

更多 Redis List 命令以及详细使用指南,请查看 Redis 官网对应的介绍:https://redis.io/commands/?group=list

**通过 `RPUSH/LPOP` 实现队列**
**通过 `RPUSH/LPOP` 或者 ` LPUSH/RPOP`实现队列**

```bash
> RPUSH myList value1
Expand All @@ -147,7 +154,7 @@ Redis 中的 List 其实就是链表数据结构的实现。我在 [线性数据
2) "value3"
```

**通过 `RPUSH/RPOP` 实现栈**
**通过 `RPUSH/RPOP`或者`LPUSH/LPOP` 实现栈**

```bash
> RPUSH myList2 value1 value2 value3
Expand Down Expand Up @@ -192,15 +199,15 @@ Redis 中的 List 其实就是链表数据结构的实现。我在 [线性数据

**消息队列**

Redis List 数据结构可以用来做消息队列,只是功能过于简单,不建议这样做。
Redis List 数据结构可以用来做消息队列,只是功能过于简单且存在很多缺陷,不建议这样做。

相对来说,Redis 5.0 新增加的一个数据结构 `Stream` 更适合做消息队列一些,只是功能依然非常简陋。和专业的消息队列相比,还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。

## Hash(哈希)

### 介绍

Hash 是一个 String 类型的 fieldvalue 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值
Redis 中的 Hash 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值

Hash 类似于 JDK1.8 前的 `HashMap`,内部实现也差不多(数组 + 链表)。不过,Redis 的 Hash 做了更多优化。

Expand All @@ -214,7 +221,7 @@ Hash 类似于 JDK1.8 前的 `HashMap`,内部实现也差不多(数组 + 链
| HSETNX key field value | 只有指定字段不存在时设置指定字段的值 |
| HMSET key field1 value1 field2 value2 ... | 同时将一个或多个 field-value (域-值)对设置到指定哈希表中 |
| HGET key field | 获取指定哈希表中指定字段的值 |
| HMGET key field1 field2 | 获取指定哈希表中一个或者多个指定字段的值 |
| HMGET key field1 field2 ... | 获取指定哈希表中一个或者多个指定字段的值 |
| HGETALL key | 获取指定哈希表中所有的键值对 |
| HEXISTS key field | 查看指定哈希表中指定的字段是否存在 |
| HDEL key field1 field2 ... | 删除一个或多个哈希表字段 |
Expand Down
67 changes: 31 additions & 36 deletions docs/zhuanlan/handwritten-rpc-framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ category: 知识星球

## 介绍

**《手写 RPC 框架》** 是我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。
**《手写 RPC 框架》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。

麻雀虽小五脏俱全,项目代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。

Expand All @@ -18,41 +18,36 @@ category: 知识星球
- Github 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework)
- Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework)

## 项目基本情况和可优化点

为了循序渐进,最初的是时候,我是基于传统的 **BIO** 的方式 **Socket** 进行网络传输,然后利用 **JDK 自带的序列化机制** 来实现这个 RPC 框架的。后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面 👇。

**为什么要把可优化点列出来?** 主要是想给哪些希望优化这个 RPC 框架的小伙伴一点思路。欢迎大家 fork 本仓库,然后自己进行优化。

- [x] **使用 Netty(基于 NIO)替代 BIO 实现网络传输;**
- [x] **使用开源的序列化机制 Kyro(也可以用其它的)替代 JDK 自带的序列化机制;**
- [x] **使用 Zookeeper 管理相关服务地址信息;**
- [x] **Netty 重用 Channel 避免重复连接服务端;**
- [x] **使用 `CompletableFuture` 包装接受客户端返回结果**(之前的实现是通过 `AttributeMap` 绑定到 Channel 上实现的);
- [x] **增加 Netty 心跳机制** : 保证客户端和服务端的连接不被断掉,避免重连。
- [x] **客户端调用远程服务的时候进行负载均衡** :调用服务的时候,从很多服务地址中根据相应的负载均衡算法选取一个服务地址。ps:目前实现了随机负载均衡算法与一致性哈希算法。
- [x] **处理一个接口有多个类实现的情况** :对服务分组,发布服务的时候增加一个 group 参数即可。
- [x] **集成 Spring 通过注解注册服务;**
- [x] **集成 Spring 通过注解进行服务消费;**
- [x] **增加服务版本号** :建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级。为什么要增加服务版本号?为后续不兼容升级提供可能,比如服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。
- [x] **对 SPI 机制的运用;**
- [ ] **增加可配置比如序列化方式、注册中心的实现方式,避免硬编码** :通过 API 配置,后续集成 Spring 的话建议使用配置文件的方式进行配置
- [x] **客户端与服务端通信协议(数据包结构)重新设计** ,可以将原有的 `RpcRequest``RpcReuqest` 对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计):
- **魔数** : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。
- **序列化器编号** :标识序列化的方式,比如是使用 Java 自带的序列化,还是 json,kyro 等序列化方式。
- **消息体长度** : 运行时计算出来。
- ......
- [ ] **编写测试为重构代码提供信心**
- [ ] **服务监控中心(类似 dubbo admin)**
- [x] **设置 gzip 压缩**

## 知识星球

欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc),干货非常多,学习氛围非常好!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。

我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!

如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(文末有优惠券)。
## 星球其他资源
除了 **《手写 RPC 框架》** 之外,星球还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《Java 面试指北》****《Kafka 常见面试题/知识点总结》** 等多个专属小册。

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220316200015412.png)
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304124333119.png)

## 星球限时优惠

欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习非常好!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。

两年前,星球的定价是 **50/年** ,这是星球的最低定价,我还附送了 33 元优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。感兴趣的小伙伴可以看看我在 2020-01-03 发的头条:[做了一个很久没敢做的事情](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd),去考古一下。

随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,星球的定价慢慢被调整为了 **159/年**

目前已经有 **1.3w+** 人加入星球,随着加入的人数增加,这个定价还会继续调整。

这里再送出一张新人优惠券,使用优惠券 **139/年** 加入(即将调整为 **199/年**)。

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/xingqiuyouhuijuan-20.png)

如果你在犹豫要不要加入的话,我建议你进来体验一下,三天之内知识星球 APP 右上角可以申请全额退款,秒到账!绝对不会坑大家!

进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)。

待你完成目标在星球分享之后,我会将星球的门票费退还给你。

**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**

**加入星球之后记得看[置顶主题](https://t.zsxq.com/04iiiAqf6),你会发现物超所值!**



Expand Down
45 changes: 28 additions & 17 deletions docs/zhuanlan/java-mian-shi-zhi-bei.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,9 @@ category: 知识星球
star: 5
---

你好,我是 Guide。

犹豫了很久,还是想借这篇文章来简单介绍以及宣传一下我这两年利用业余时间完成的 [**JavaGuide 开源版**](https://javaguide.cn/)的兄弟 — **《Java 面试指北》**

每次写这种“软文”我还是挺忐忑的,但是转念一想,自己用心做内容,真诚帮助别人,为什么不能宣传一下呢?这内容不比很多几千块钱的训练营强?

一到面试季,熬夜到转点帮忙修改简历回答问题就成了家常便饭。不过,大家也不用心疼我,我做这些事情是有收获的,不仅仅是多了一份可观的副业收入,内心也更加充实开心。不过,也确实是真的累!

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304123156348.png)

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/IMG_2975_%E5%89%AF%E6%9C%AC.png)

## 介绍

**《Java 面试指北》** 是我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)的一个内部小册,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补。相比于开源版本来说,《Java 面试指北》添加了下面这些内容(不仅仅是这些内容):
**《Java 面试指北》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补。相比于开源版本来说,《Java 面试指北》添加了下面这些内容(不仅仅是这些内容):

- 10+ 篇文章手把手教你如何准备面试。
- 更全面的八股文面试题(系统设计、常见框架、分布式、高并发 ......)。
Expand Down Expand Up @@ -78,11 +66,34 @@ star: 5

每一篇内容都非常干货,不少球友看了之后表示收获漫漫。不过,最重要的还是知行合一。

## 知识星球
## 星球其他资源

除了 **《Java 面试指北》** 之外,星球还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》** 等多个专属小册。

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220316200015412.png)
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304124333119.png)

## 星球限时优惠

欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习非常好!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。

两年前,星球的定价是 **50/年** ,这是星球的最低定价,我还附送了 33 元优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。感兴趣的小伙伴可以看看我在 2020-01-03 发的头条:[做了一个很久没敢做的事情](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd),去考古一下。

随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,星球的定价慢慢被调整为了 **159/年**

目前已经有 **1.3w+** 人加入星球,随着加入的人数增加,这个定价还会继续调整。

这里再送出一张新人优惠券,使用优惠券 **139/年** 加入(即将调整为 **199/年**)。

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/xingqiuyouhuijuan-20.png)

如果你在犹豫要不要加入的话,我建议你进来体验一下,三天之内知识星球 APP 右上角可以申请全额退款,秒到账!绝对不会坑大家!

欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc),干货非常多,学习氛围非常好!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高
进入星球之后,你可以为自己制定一个目标,比如自己想要进入某某还不错的公司或者达成什么成就(一定要是还算有点挑战的目标)

我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!
待你完成目标在星球分享之后,我会将星球的门票费退还给你。

如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(文末有优惠券)。
**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!**

**加入星球之后记得看[置顶主题](https://t.zsxq.com/04iiiAqf6),你会发现物超所值!**
Loading

0 comments on commit a96400c

Please sign in to comment.