说到缓存,你可能想到的是:热点数据增加缓存,提升读取性能,降低系统负载,但是数据不一致问题和维护成本会增加,只要使用缓存的收益大于成本就可以使用。
本篇只讨论分布式缓存的应用过程中,项目中的代码应该怎么写?相对来说比较优雅。我见过的有三种(当然有更好的可以推荐),直接使用RedisTemplate、自定义注解和使用Spring Cache。本文直接拿Spring Boot+Redis举例子:
直接使用RedisTemplate
RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端,用户可直接通过RedisTemplate进行多种操作。
学习成本最低,只需了解RedisTemplate的封装的操作和方法。需要注意Object对象的序列化和反序列化。
自定义缓存注解
利用AOP和Spring EL表达式的方式集成进去,使用的时候就引用注解的方式。
可以支持自定义注解,方便定制化,开发成本较高,细节需要关注的比较多:过期时间自定义,缓存击穿等。
使用Spring Cache
它利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能。
有这么好的轮子,干嘛不用呢?使用自带的Cacheable、CacheEvict、CachePut注解去实现,支持一些通用的功能,一般够用了。但是一些特殊的如通配符get和delete是不支持的,需要单独实现。
代码中使用还有一些注意事项,序列化和反序列化、设置TTL时间(每个key都要有过期时间)、不要用Keys用Scans(使用游标)、AOP对象内部调用需要Proxy对象(防止缓存时效)、划分好服务域(命名的一些规范)、缓存失效策略(过期删除和主动删除)等。
设计原则里面依赖导致原则(DIP)—面向接口编程,不要面向实现编程。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以减少类与类之间耦合性,提高代码的可读性和可维护性。你使用缓存方式的是哪一种?你觉得哪种方式更好一点?
成不了想要成为的人,也没关系。但至少,别成为不想成为的人。