Kamafeel

求其上,得其中;求其中,得其下,求其下,必败


  • 首页

  • 归档

坐

发表于 2020-06-09 | 更新于 2020-09-20 | 分类于 瞎扯蛋

alt

设计模式-模板

发表于 2020-06-05 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

具备相同的步骤,但是步骤细节存在部分差异

和策略区别

策略关注多种策略(广度),模板同种策略(相同流程)

招式

定义一个interface,定义所有步骤的defaut方法
定义一个abstract,定义步骤执行的模板方法

下面子类,执行实现差异性步骤方法。

额外工厂类,定义如何选择子类。

参考

https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650425722&idx=1&sn=c08418f767ee4c70331d311776c53a89&chksm=83968162b4e10874eeb119ef807bd2670cab90f73f3ee13d7146a1f535937aa311bbe958643e&scene=21#wechat_redirect

设计模式-适配器

发表于 2020-06-05 | 更新于 2020-06-09 | 分类于 设计模式

1.分类适配器

继承需要适配的对象-实现新接口(适配使用)

2.对象适配
是委派方式

尽量使用对象适配,方便灵活些。

简单例子:

电源110V 适配到 220V

分区表和分库分表和读写分离

发表于 2020-06-05 | 更新于 2021-11-18 | 分类于 数据库 , MYSQL

分区表

由于分区表在MySQL Server层为一个表,因此:

1、DDL操作需要锁定所有分区,导致所有分区上操作都被阻塞。

2、当表数据量较小时,分区表和非分区表性能相近,分区表效果有限。

3、当表数据量较大时,对分区表进行DDL或其他运维操作难度大风险高。

4、分区表使用较少,存在未知风险多,BUG多BUG多BUG多,MySQL社区版本免费,横向扩展成> 本低,分库分表实现简单且中间件完善。

5、当单台服务器性能无法满足时,对分区表进行分拆的成本较高,而分库分表能很容易实现横> 向分拆。

6、当分区表操作不当导致访问所有分区时,会导致严重的性能问题,而分库分表操作不当仅影> 响访问的表。

7、使用分库分表可以有效运维降低运维操作影响,对1亿数据量表做DDL操作需要谨慎评估,而> 对10万数据量表做DDL操作可以默认其很快完成。

8、使用分库分表可以有效减小宕机或其他故障影响,将数据分库分表到10套群集上,一套群集> 发生故障仅影响业务的一成。

分区表无法解决单库的性能瓶颈
分区表关联查询,很困难
不走分区健,将会导致所有分区性能下降
DDL操作风险大

分库分表

sharding-jdbc

独写分离

alt

MYSQL双主,主从等
replication协议 的大数据量延迟很严重,需要特别注意。

设计模式-代理

发表于 2020-06-04 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

对目标进行功能扩展,但是不修改目标本身

招式-静态代理

无太多实际加载

招式-动态代理

1.JDK InvocationHandler 模式
被代理对象必须是接口,
动态代理生成的类为 com.sun.proxy.$Proxy4
核心实现InvocationHandler

2.Spring AOP 切面模式-推荐
支持jdk模式和cglib模式(不需要一定是接口)

提供Aspect相关注解,方便方法代理加强

参考

https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650417780&idx=1&sn=a4076a47b2fc6800a8e10528a0ac1dd7&chksm=8396e26cb4e16b7a93828b1cef4eaedf1b3df8bbc9a9ddee2368d927c71369ffcf115fdddc0a&scene=21#wechat_redirect

https://bugstack.cn/md/develop/design-pattern/2020-06-16-%E9%87%8D%E5%AD%A6%20Java%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F%E3%80%8B.html

设计模式-装饰

发表于 2020-06-04 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

扩展对象功能,比继承灵活

招式

装饰者,被装饰者,都需要实现同一个接口或父类。
装饰者,构造方法,包含接口或父类

设计模式-策略

发表于 2020-06-04 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

1.避免写过多if else, 更面向对象oo

2.符合开闭原则,只需要增加策略

3.客户端决定使用何种策略

招式

实现同一接口,Context改变策略对象,得到不同的策略实现

设计模式-单例

发表于 2020-06-04 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

用途:减少NEW对象的内存占用

招式

  1. 利用Enum 实例化一次,并且线程安全。

  2. 2次锁+volatile (禁止重排序,避免NEW和分配内存地址,顺序不是预期,导致NULL异常)

  3. Spring bean的默认是单例模式

设计模式-工厂

发表于 2020-06-04 | 更新于 2021-12-01 | 分类于 设计模式

使用场景

屏蔽内部复杂,符合迪米特法则(最少知道原则)

原理

根据标识(string,emum),创建相关对象(一组实现相同接口对象)

招式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

public class StrategyFactory<T, S extends Strategy<T>>
implements InitializingBean, ApplicationContextAware {

private final Class<S> strategyType;

private Map<T, S> strategyMap;

private ApplicationContext appContext;

/**
* 创建一个策略工厂
*
* @param strategyType 策略的类型
*/
public StrategyFactory(Class<S> strategyType) {
this.strategyType = strategyType;
}

/**
* 根据策略 id 获得对应的策略的 Bean
*
* @param id 策略 id
* @return 策略的 Bean
*/
public S getStrategy(T id) {
return strategyMap.get(id);
}

@Override
public void afterPropertiesSet() {
// 获取 Spring 容器中,所有 S 类型的 Bean
Collection<S> strategies = appContext.getBeansOfType(strategyType).values();

strategyMap = Maps.newHashMapWithExpectedSize(strategies.size());

// 将 所有 S 类型的 Bean 放入到 strategyMap 中
for (final S strategy : strategies) {
T id = strategy.getId();

strategyMap.put(id, strategy);
}
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appContext = applicationContext;
}
}

参考

https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650432631&idx=1&sn=fd90b80b2fe566b6f04a67fc18f156aa&chksm=8396ac6fb4e125799c6b2329fdb67727e1da3949a4c2f4a879e80f1d83591fcea2744b76f124&mpshare=1&scene=1&srcid=1130XXmPwschNyomtGkEQPvb&sharer_sharetime=1638251225567&sharer_shareid=21878bc7924c790b0c0f03ef06b36d15&key=e659f3596625ecf27da3dfe12c21b9d0ab6196d90c93ebd6ef0350cb39e85d5011980f9e404c8ecf9ce2e4ba183c8a94a82716f1099b5f0c8c3a4de3f07c4e40273037b1c31be2a76d1e0df599df7ec50ab616eb1ef6695785f2a86cb365c7faf4fe997e6766db9b15d6699660d287de1f345b09229df6149d0d55ad4833baf1&ascene=1&uin=OTM4NTY4MzU%3D&devicetype=Windows+10&version=62060844&lang=zh_CN&exportkey=AYClbodKvloqPXREo8WM3Kc%3D&pass_ticket=E2HAxmlxE49N%2BHNKlcaaoJaZhFVYW1ALfzpBQFpFc5eS5fsfcMcK3nX%2BMTgMxZGA&wx_header=0

mysql 分页和数据量

发表于 2020-04-28 | 更新于 2021-11-18 | 分类于 数据库 , MYSQL
select id,title from collect limit 0,10;
select id,title from collect limit 1000,10;
select id,title from collect limit 90000,10;
select id from collect order by id limit 90000,10; -走主键索引 
select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;  -走主键索引 

带查询条件
select id from collect where vtype=1 order by id limit 90000,10; 
create idx_search(vtype,id)

select id ,title from collect where vtype=1 limit 90000,10;--慢

如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键

最终办法 用IN 查询主键,会走索引
select * from collect where id in (9000,12,50,7000);

1…171819…21

Kamafeel

204 日志
57 分类
129 标签
© 2022 Kamafeel
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.1.2