Skip to content

Commit

Permalink
java
Browse files Browse the repository at this point in the history
  • Loading branch information
deipss committed Oct 13, 2023
1 parent 5fa5870 commit 7f774be
Show file tree
Hide file tree
Showing 21 changed files with 261 additions and 226 deletions.
2 changes: 2 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ mermaid:
version: "9.1.3"


# For copy button on code
enable_copy_code_button: true
38 changes: 19 additions & 19 deletions docs/Database/ElasticSearch.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,29 @@ parent: Database
nav_order: 2
---

# ES集群常用命令
# 1. ES集群常用命令

```shell
# 获取整个 cluster 的状态。
#获取整个 cluster 的状态。
GET _cluster/state
# 集群健康状态 API
#集群健康状态 API
GET _cluster/health?pretty
# 索引信息 API
#索引信息 API
GET _cat/indices?pretty&v
# 节点状态 API
#节点状态 API
GET _nodes?pretty
# 主节点信息 API
#主节点信息 API
GET _cat/master?pretty&v
# 分片分配、索引信息统计 API
#分片分配、索引信息统计 API
GET _stats?pretty
# 节点状态信息统计 API
#节点状态信息统计 API
GET _nodes/stats?pretty

```

# 索引常用命令
# 2. 索引常用命令

## 查询
## 2.1. 查询

- GET /索引名/_doc/_search

Expand All @@ -41,7 +41,7 @@ GET _nodes/stats?pretty
}
```

## 设置索引的配置
## 2.2. 设置索引的配置

- PUT /索引名/_settings

Expand All @@ -60,11 +60,11 @@ GET _nodes/stats?pretty

```

### 关于索引的Translog
### 2.2.1. 关于索引的Translog

- https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html

## 索引的mapping设置
## 2.3. 索引的mapping设置

PUT /my-index-000001/_mapping

Expand All @@ -80,9 +80,9 @@ PUT /my-index-000001/_mapping
}
```

# 文档操作
# 3. 文档操作

## 批量导入
## 3.1. 批量导入

POST my_goods/_bulk

Expand All @@ -95,11 +95,11 @@ POST my_goods/_bulk

```

## 删除某个文档,通过ID
## 3.2. 删除某个文档,通过ID

- DELETE /my_goods/_doc/2

## 通过查询删除
## 3.3. 通过查询删除

POST /my_goods/_delete_by_query

Expand All @@ -113,7 +113,7 @@ POST /my_goods/_delete_by_query
}
```

## 通过ID更新
## 3.4. 通过ID更新

POST /my_goods/_update/1

Expand All @@ -125,5 +125,5 @@ POST /my_goods/_update/1
}
```

## 判断id是否存在
## 3.5. 判断id是否存在
- HEAD /my_goods/_doc/1
4 changes: 2 additions & 2 deletions docs/Database/ElasticSearch实战手册阅读.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ parent: Database
nav_order: 6
---

# index 设计优化
# 1. index 设计优化

- 对于不需要的字段,可以关闭index功能,来节省空间

Expand All @@ -22,7 +22,7 @@ nav_order: 6
}
```

# 部署优化
# 2. 部署优化

- 官方标准建议是:将 50% 的可用内存(不超过 32 GB,一般建议最大设置为:31 GB)分配给 Elasticsearch 堆,而其余 50% 留给 Lucene
缓存。
Expand Down
74 changes: 36 additions & 38 deletions docs/Database/Redis.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@ parent: Database
nav_order: 3
---

# 主从复制
# 1. 主从复制

```shell


# 启动主从三个redis容器
docker run -it --name redis-6300 -d -p 6300:6379 redis redis-server
docker run -it --name redis-6380 -d -p 6380:6379 redis redis-server
Expand All @@ -35,9 +33,9 @@ redis-sentinel sentinel.conf
对三个redis容器都进行上述操作
```

# 持久化
# 2. 持久化

## RDB
## 2.1. RDB

在的指定的时间间隔内,将内存中的数据以快照的方式存入磁盘,恢复时将快照文件直接读入到内存
redis会单独创建(fork)一个子进程来进行持久化(fork时会影响主进程作业),会将数据暂时写入到一个临时文件中,待持久化的过程全部结束,将这个临时文件替换为新的.rdb文件。
Expand All @@ -47,29 +45,29 @@ redis会单独创建(fork)一个子进程来进行持久化(fork时会影响
![redis_rdb.png](img%2Fredis_rdb.png)
- save 60 100 可以在停机时保存一次,也可以指定60秒达到1000次可以触发RDB

## AOF
## 2.2. AOF

以日志的形式来记录每个写操作,将redis执行过的所有写指令保存,只是追加文件而不是改写文件,
redis启动时会加载这个.aof文件重新构建数据。为避免.aof文件累加过大,redis会以重写的形式来更新.aof文件的版本,保持数据的
其配置中【APPEND ONLY MODE】一栏中

![redis_rdb_aof.png](img%2Fredis_rdb_aof.png)

### fork
### 2.2.1. fork

是将当前进程复制出一个一模一样的进程出来,包括当前进程的变量、程序计算器、上下文环境,这个全新的进程作为当前进程的子进程。

# 数据类型
# 3. 数据类型

## reids中的key
## 3.1. reids中的key

- keys * :列出当前库中所有的key
- exists 为:判断key_name是滞存在
- expire key_name [s]:给key_name设置过期时间
- ttl key_name:查看还有多少秒过期 -1表示永不过期、-2表示已过期、0表示正在计时
- type key_name:查看key_name的类型

## String
## 3.2. String

- set/get/del/append/strlen
- incr/decr/incrby/decrby :后者是按步增长、减少
Expand All @@ -79,14 +77,14 @@ redis启动时会加载这个.aof文件重新构建数据。为避免.aof文件
- mset/mget/msetnx
- getset

## List
## 3.3. List

- 基于List的消息队列的优劣:
- 可以满足消息的有序性
- 无法避免消息丢失
- 只能单消费者

## Set
## 3.4. Set

- sadd/smembers/sismenber
- scard 获取集合里面的元素个数
Expand All @@ -96,7 +94,7 @@ redis启动时会加载这个.aof文件重新构建数据。为避免.aof文件
- smove key1 key2:将key1的值赋予key2
- sdiff\sinter\sunion:差集、交集、并集

## Zset
## 3.5. Zset

- zadd/zrange
- zrangebyscore key [开始的分数] [结束的分数]
Expand All @@ -106,7 +104,7 @@ redis启动时会加载这个.aof文件重新构建数据。为避免.aof文件
- zrevrange
- zrevrangebyscore key [开始的分数] [结束的分数]

## Hash
## 3.6. Hash

- hset/hget/hmset/hmget/hgetall/hdel
- hlen
Expand All @@ -115,41 +113,41 @@ redis启动时会加载这个.aof文件重新构建数据。为避免.aof文件
- hincrby/hincbyfloat
- hsetnx

# 缓存问题
# 4. 缓存问题

- https://cloud.tencent.com/developer/article/1525256

## 穿透
## 4.1. 穿透

一直访问不存在的一个值,如id=-1,缓存中没有,DB中也没有。所以一直在消耗IO资源。

### 应对方法
### 4.1.1. 应对方法

- 入口加判断,如非法的参数拦截
- 将这类请求作为key,缓存起来,可以设置TTL时间
- 使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。

## 击穿
## 4.2. 击穿

某个key,在特定时刻被大规模访问,过期后,后续的流量全部落到了DB上。

- 对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。
- 基于逻辑过期应对击穿问题,写入redis时,不指定过期时间,在数据中添加过期时间,以数据中过期时间为准
- 使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。

### 应对方法
### 4.2.1. 应对方法

## 雪崩
## 4.3. 雪崩

缓存雪崩指的是,在某一时刻,多个key失效。这样就会有大量的请求从缓存中获取不到值,全部到数据库。还有另一种情况,就是缓存服务器宕机,也算做缓存雪崩。

### 应对方法
### 4.3.1. 应对方法

- 对每个key的过期时间设置一个随机值,而不是所有key都相同。
- 热点数据永不过期
- 使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。

## 踩踏
## 4.4. 踩踏

当多个线程试图并行访问缓存时,就会发生缓存踩踏。如果缓存的值不存在,那么线程将同时尝试从数据源获取数据。数据源通常是数据库,也可以是
Web 服务器、第三方 API 或任何其他可以返回数据的东西。
Expand All @@ -161,53 +159,53 @@ Web 服务器、第三方 API 或任何其他可以返回数据的东西。
4. 这个循环不断持续。
- https://www.infoq.cn/article/Bb2YC0yHVSz4qVwdgZmO

# 应用场景
# 5. 应用场景

## session 短信登陆
## 5.1. session 短信登陆

## 商品信息缓存
## 5.2. 商品信息缓存

## 优惠秒杀:计时器、LUA脚本、分布式锁、redis消息队列
## 5.3. 优惠秒杀:计时器、LUA脚本、分布式锁、redis消息队列

## 附近的商户:GeoHash
## 5.4. 附近的商户:GeoHash
Geo使用的Zset的基础能力
附近的人,附近的车
## UV统计:HyperLogLog
## 5.5. UV统计:HyperLogLog

## 用户签到、圈选:BitMAP
## 5.6. 用户签到、圈选:BitMAP
基于String的能力

## 好友关注:Set 交集、差集
## 5.7. 好友关注:Set 交集、差集

## 达人探店:SortSet的点赞排行榜
## 5.8. 达人探店:SortSet的点赞排行榜

- 某个评论是否被用户(去重)点赞过
使用Set来记录某个评论是否被点赞过
- 点赞排行榜
以时间戳作为SortedSet的分数,来保存点赞的用户的信息

# 问题讨论
# 6. 问题讨论

## 删除缓存还是更新缓存
## 6.1. 删除缓存还是更新缓存

- ~~更新缓存~~:每次更新数据库时都更新缓存,无效写过多
- 删除缓存:让缓存失效,查询时再重新加载新的信息到缓存中

## 缓存与DB一致性
## 6.2. 缓存与DB一致性

- 单体系统:放在同一事务中
- 分布式系统:使用TCC分布式事务

## 先操作缓存,还是先操作DB
## 6.3. 先操作缓存,还是先操作DB

- 先删除缓存,再删除DB,并发时(一个线程查询、一个线程删除)会存在不一致的情况
- 先删除DB,再删除缓存,并发时(一个线程查询、一个线程删除)会存在不一致的情况,但比前者的概率低,因为DB的时间比缓存的操作时间长

## 乐观锁应对库存超卖问题
## 6.4. 乐观锁应对库存超卖问题

- 用户A读取出是100件,更新库存时添加查询条件 **where quantity=100**

## 一人一单(单机)
## 6.5. 一人一单(单机)

- 因为要insert,所以要使用悲观锁来应对这个问题
- 这个悲观锁可以使用UserID,如
Expand All @@ -221,7 +219,7 @@ synchronized(userId.toString().intern)

![transaction.png](img%2Ftransaction.png)

## 一人单(集群)
## 6.6. 一人单(集群)

NX是互斥,EX是超时

Expand Down
Loading

0 comments on commit 7f774be

Please sign in to comment.