Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/cs-basics/data-structure/bloom-filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ root@21396d02c252:/data# redis-cli

1. **`BF.ADD`**:将元素添加到布隆过滤器中,如果该过滤器尚不存在,则创建该过滤器。格式:`BF.ADD {key} {item}`。
2. **`BF.MADD`** : 将一个或多个元素添加到“布隆过滤器”中,并创建一个尚不存在的过滤器。该命令的操作方式`BF.ADD`与之相同,只不过它允许多个输入并返回多个值。格式:`BF.MADD {key} {item} [item ...]` 。
3. **`BF.EXISTS` ** : 确定元素是否在布隆过滤器中存在。格式:`BF.EXISTS {key} {item}`。
3. **`BF.EXISTS`** : 确定元素是否在布隆过滤器中存在。格式:`BF.EXISTS {key} {item}`。
4. **`BF.MEXISTS`** : 确定一个或者多个元素是否在布隆过滤器中存在格式:`BF.MEXISTS {key} {item} [item ...]`。

另外,`BF.RESERVE` 命令需要单独介绍一下:
Expand All @@ -272,7 +272,7 @@ root@21396d02c252:/data# redis-cli
下面简单介绍一下每个参数的具体含义:

1. key:布隆过滤器的名称
2. error_rate :误报的期望概率。这应该是介于 0 到 1 之间的十进制值。例如,对于期望的误报率 0.1%(1000 中为 1),error_rate 应该设置为 0.001。该数字越接近零,则每个项目的内存消耗越大,并且每个操作的 CPU 使用率越高。
2. error_rate : 期望的误报率。该值必须介于 0 到 1 之间。例如,对于期望的误报率 0.1%(1000 中为 1),error_rate 应该设置为 0.001。该数字越接近零,则每个项目的内存消耗越大,并且每个操作的 CPU 使用率越高。
3. capacity: 过滤器的容量。当实际存储的元素个数超过这个值之后,性能将开始下降。实际的降级将取决于超出限制的程度。随着过滤器元素数量呈指数增长,性能将线性下降。

可选参数:
Expand Down
4 changes: 2 additions & 2 deletions docs/database/mysql/InnoDB对MVCC的实现.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@

- 此时最新记录的 `DB_TRX_ID` 为 102,m_up_limit_id <= 102 < m_low_limit_id,所以要在 `m_ids` 列表中查找,发现 `DB_TRX_ID` 存在列表中,那么这个记录不可见

- 根据 `DB_ROLL_PTR` 找到 `undo log` 中的上一版本记录,上一条记录的 `DB_TRX_ID` 为 101,满足 102 < m_up_limit_id,记录可见,所以在 `T6` 时间点查询到数据为 `name = 李四`,与时间 T4 查询到的结果不一致,不可重复读!
- 根据 `DB_ROLL_PTR` 找到 `undo log` 中的上一版本记录,上一条记录的 `DB_TRX_ID` 为 101,满足 101 < m_up_limit_id,记录可见,所以在 `T6` 时间点查询到数据为 `name = 李四`,与时间 T4 查询到的结果不一致,不可重复读!

3. **`时间线来到 T9 ,数据的版本链为`:**

Expand Down Expand Up @@ -212,4 +212,4 @@
- **《MySQL 技术内幕 InnoDB 存储引擎第 2 版》**

- [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/2014/08/20/innodb-lock.html)
- [MySQL 事务与 MVCC 如何实现的隔离级别](https://blog.csdn.net/qq_35190492/article/details/109044141)
- [MySQL 事务与 MVCC 如何实现的隔离级别](https://blog.csdn.net/qq_35190492/article/details/109044141)
18 changes: 9 additions & 9 deletions docs/java/new-features/Java8新特性总结.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ Collections.sort(names, (String a, String b) -> {
});
```

可以看出,代码变得更段且更具有可读性,但是实际上还可以写得更短:
可以看出,代码变得更短且更具有可读性,但是实际上还可以写得更短:

```java
Collections.sort(names, (String a, String b) -> b.compareTo(a));
Expand Down Expand Up @@ -215,7 +215,7 @@ Person person = personFactory.create("Peter", "Parker");
```
我们只需要使用 `Person::new` 来获取Person类构造函数的引用,Java编译器会自动根据`PersonFactory.create`方法的参数类型来选择合适的构造函数。

### Lamda 表达式作用域(Lambda Scopes)
### Lambda 表达式作用域(Lambda Scopes)

#### 访问局部变量

Expand Down Expand Up @@ -423,15 +423,15 @@ Optional 是一个简单的容器,其值可能是null或者不是null。在Jav
译者注:示例中每个方法的作用已经添加。

```java
//of():为非null的值创建一个Optional
//of():为非null的值创建一个Optional
Optional<String> optional = Optional.of("bam");
// isPresent(): 如果值存在返回true,否则返回false
// isPresent(): 如果值存在返回true,否则返回false
optional.isPresent(); // true
//get():如果Optional有值则将其返回,否则抛出NoSuchElementException
optional.get(); // "bam"
//orElse():如果有值则将其返回,否则返回指定的其它值
//orElse():如果有值则将其返回,否则返回指定的其它值
optional.orElse("fallback"); // "bam"
//ifPresent():如果Optional实例有值则为其调用consumer,否则不做处理
//ifPresent():如果Optional实例有值则为其调用consumer,否则不做处理
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"
```

Expand Down Expand Up @@ -484,7 +484,7 @@ forEach 是为 Lambda 而设计的,保持了最紧凑的风格。而且 Lambda
.forEach(System.out::println);// aaa1 aaa2
```

需要注意的是,排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringCollection是不会被修改的
需要注意的是,排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringList是不会被修改的

```java
System.out.println(stringList);// ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1
Expand All @@ -502,7 +502,7 @@ forEach 是为 Lambda 而设计的,保持了最紧凑的风格。而且 Lambda
.stream()
.map(String::toUpperCase)
.sorted((a, b) -> b.compareTo(a))
.forEach(System.out::println);// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"
.forEach(System.out::println);// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "BBB1", "AAA2", "AAA1"
```


Expand Down Expand Up @@ -649,7 +649,7 @@ parallel sort took: 475 ms//串行排序所用的时间

## Maps

前面提到过,Map 类型不支持 streams,不过Map提供了一些新的有用的方法来处理一些日常任务。Map接口本身没有可用的 `stream()`方法,但是你可以在键,值上创建专门的流或者通过 `map.keySet().stream()`,`map.values().stream()`和`map.entrySet().stream()`。
前面提到过,Map 类型不支持 streams,不过Map提供了一些新的有用的方法来处理一些日常任务。Map接口本身没有可用的 `stream()`方法,但是你可以在键,值上创建专门的流或者通过 `map.keySet().stream()`,`map.values().stream()`和`map.entrySet().stream()`。

此外,Maps 支持各种新的和有用的方法来执行常见任务。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,

![SSO系统设计-登录时序图](https://img.ken.io/blog/sso/sso-login-sequence.png-kbrb.png)

按照上图,用户登录后Authtoken保存在Cookie中。 domian= test. com
按照上图,用户登录后AuthToken保存在Cookie中。 domain=test.com
浏览器会将domain设置成 .test.com,
这样访问所有*.test.com的web站点,都会将Authtoken携带到服务器端
这样访问所有*.test.com的web站点,都会将AuthToken携带到服务器端
然后通过SSO服务,完成对用户状态的校验/用户登录信息的获取

- 登录信息获取/登录状态校验
Expand Down Expand Up @@ -122,4 +122,4 @@ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,

- 关于时序图

时序图中并没有包含所有场景,ken.io只列举了核心/主要场景,另外对于一些不影响理解思路的消息能省就省了。
时序图中并没有包含所有场景,ken.io只列举了核心/主要场景,另外对于一些不影响理解思路的消息能省就省了。