天天看点

【原】Spring AOP实现对Redis的缓存同步

      公司的项目刚开始采用spring cache作为缓存数据,到后面发现扩展性不灵活,于是基于sprig cache原理自定义一套规则用于缓存数据。

根据请求参数生成Key,后面我们会对生成Key的规则,进一步说明; 根据Key去缓存服务器中取数据,如果取到数据,则返回数据,如果没有取到数据,则执行service中的方法调用dao从DB中获取数据,同时成功后将数据放到缓存中。 删除、新增、修改会触发更新缓存的拦截类对缓存服务器进行更新。

    1.首先贴上核心注解类

 2.使用注解案例。

    解释下上面注解:根据业务的需要,将缓存key进行分组,第一个group参数即是分组,用来标识某个模块,例如新闻模块统一是group.news;第二个key是根据参数拼接成的key,第三个name只是一个名称而已,没什么太大的作用,主要是用于给其它开发人员理解, 第四个param则是操作参数,这个很重要,到时候会用它来拼接key,第五个logParam是日志。

3.贴上具体拦截类

    上面的代码使用了@Around环绕切面这个注解,为什么不用@Befor或者@After呢?

      由于@Befor是在方法执行开始前才进行切面,而@After是方法结束后进行切面。 根据业务场景的需要,@Around 可以在所拦截方法的前后执行一段逻辑,例如在查询前先去Redis查数据,发现没有数据再回到service层去执行查db,查完了之后需要把数据重新放到Redis,此时其他线程的请求就可以直接从Redis获得数据,减少频繁对数据库的操作。

 4.下面贴上查询的具体实现方法

【原】Spring AOP实现对Redis的缓存同步
【原】Spring AOP实现对Redis的缓存同步

View Code

    了解过aop 以及反射相关技术的都知道这是从方法内取出传入参数,例如传入的是 (String user,String age), 通过这个方法可以分别得到user和age的值。

  

                  假设用户id = 1,分页查询了订单信息,这时候 record 参数为:pageSize:10,pageNum:2,id:1。key的最终格式 : group+namespace+record(这样基本是唯一不会重复)。

继续阅读