分布式锁,分布式缓存

分布式锁:个人理解,其实一样是锁,只不过是为了分布式应用的锁。普通锁或者读写锁。
实现方法:比如通过redis,使用Redisson,应用可先获取锁(自定义字符串的key,可以是一个锁,也可同时获取多个锁,但需注意死锁问题),然后tryLock,拿到锁后进行操作即可。
难点:当然,会有很多细节,比如获取锁后阻塞,一直不释放。等等。

分布式缓存实践,发展历程:

  • 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 
    数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis
  • 可靠性需求 
    Cache的"雪崩"问题让人纠结 (雪崩即缓存失效,大量并发操作同时从数据取,数据库卡死。可通过多增加一个缓存标记(失效时间<对应数据失效时间),这样标记失效,第一个请求会在另外一个线程队列进行失效缓存查询set处理返回,并重置失效时间)
    Cache面临着快速恢复的挑战

疑问:
1、缓存穿透:数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。可通过查询数据为null后,设置默认值解决。

但假如,缓存没有,禁止从数据库拿。而缓存和数据库一致性,通过job也同步呢?但实用性有待确认。

分布式缓存:个人理解,由于单个redis是单线程,分布式由自己实现,一般采用一致性hash。每个实例又采用主从,防止实例不可用造成的请求穿透。

疑问:当扩展或者减少机器,缓存数据怎么迁移。以及,批量查询时,怎么操作?

猜你喜欢

转载自1181731633.iteye.com/blog/2395602