- 基于数据库排他锁实现的分布式锁、基于redis原子性实现的分布式锁、基于zookeeper配置实现的分布式锁。我自己就用过redis的分布式锁,主要也是利用redis执行的原子性,实际上redis底层也是单线程进行执行处理的,所以就算是多个并发请求进来也会被放到队列中一一处理,在实现分布式锁中还要注意 基于数据库实现一个轻量级的分布式排他锁 select xxx where xxx for update 需要注意的条件必须走索引,否则会锁表,使用redis setnx 设置分布式锁
- 使用命令介绍: (1)SETNX SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 (2)expire expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。 (3)delete delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。 缓存穿透指的是在分布式应用中,一个缓存数据过期失效了,但是却同时有很多个请求进来请求该数据导致请求压力从redis转到了数据库,数据承受不了同时这么多请求然后就蹦了,可以通过请求限流,热点数据设置不过期等等方案来解决,缓存雪崩是指redis同时有多个缓存过期失效了,导致请求成倍增长,设置到数据库,解决方案是缓存失效时间随机开来设置,不要同时设置一个时效过期,热点数据放到redis不设置过期时间
工厂模式就是比较经典的一类设计模式了,属于创建型设计模式的一种,创建型模式主要是为了解决对象创建过程中频繁创建对象,创建细节过多的问题,最简单最常用的就是简单工厂模式,通过工厂对象对对象的创建细节进行封装,通过传入的参数去判断返回对应的对象,基于简单工厂上又扩展出了工厂模式,对类创建的本质进行接口定义,让实现的工厂去定义具体的创建细节,通过一个工厂包装类去选择返回需要创建的工厂对象,基于工厂模式,又扩展初了抽象工厂模式,就是在工厂模式的基础上,先定义一个抽象基类对一些工厂中共性的属性方法进行提取,然后工厂的具体创建逻辑延迟到子类去实现,这种做法的好处是抽离冗余代码,入参出参统一,屏蔽差异化,易维护,可扩展,缺点是,一但定义的抽象逻辑有变更可能会影响到所有子类一起进行修改,所以需要在设计时就考虑好所有可能的因素和未来扩展的方向进行设计。