Redis缓存的设计.

Redis缓存设计 

一、    现在redis缓存是一个很热门的话题,公司里面用了一个Redis作为缓存框架,感觉有很多地方不足,比如:

1.只有数据查询缓存而没有数据插入的缓存修改。

2.缓存太过于麻烦,要先插入后在查询一遍。

3.没有过期时间设置,默认永久

4.对代码的耦合度太高了。

5.  我还没有具体的实现,只是把我的想法写出来,顺着想法写出一个架构,完成了放出来。

二、        缓存要使用的技术

1.Redis :这个不用说了,作为缓存数据库

2.aspectJ :使用AOP来尽量的少侵入代码

3.jedits:java的redis驱动,因为想作为单独的插件使用,所以单独连接数据库。

三、       缓存的构思

1.       永久缓存,系统启动的时候把一些必要的参数放进去,一般不会更改,那么这个缓存除非是手动刷新否则就是永久保存,当系统第二次重启可以从缓存中读取数据。

2.       service层缓存,存储系统中的中间数据,一些对时间不太敏感的数据,或者对不太容易修改的,但是有很多逻辑的service,应该能够设置超时时间,更新到Redis利用Redis实现缓存清除。

3.       DAO层缓存,存储用户的sql查询数据,也是最复杂的查询,需要保存用户的查询数据,在修改与这个缓存有关数据时那么这个缓存也要更新,或者对时效行不太明的可以设置更短的超时时间。

四、       具体实现

1.  永久缓存:

l                    需要将用户的一系列的系统配置,或者系统变量什么的放进缓存中,当更新的更新的时候需要手动更新,系统要专门设置一个按钮用了更新系统级的缓存。

l       对读取系统配置的方法做一个切面,抓取系统的读取的数据放进缓存中,第二次重启的时候直接从Redis中读取(当然可以用可以不用,感觉一般不会用这一级缓存的,一般保存在系统的静态缓存中)。

2.  service层缓存:

l       一样对方法做一个环绕切面,把用户的类方法以及参数组成一个签名,并且保存当前的类以及方法

l       当缓存中没有数据的数据把这些数据转换成JSon格式保存到Redis中

l       当方法读取的时候切面拦截方法如果签名一直的话,就将缓存的数据取出来返回给方法,将不再执行具体业务。

l       使用的切面注解要支持传参数,设置超时时间,或者是否超时后进行自动更新(更觉用处不大,浪费资源)。

l       当某个方法调用后更改了数据可能导致缓存不同步的情况,可以谁在注解更新指定的缓存,或者更新与这个方法有关的全部缓存或者就是清空缓存。

l       当设置了自动更新后这里保存的类以及方法就比较有用了,调用后,找到Redis中的某个类以及方法和参数,使用反射调用,更新缓存,这样一个注解搞定缓存更新。

3.  DAO层缓存:

l       根Service层缓存一样使用切面进行保存以及更新策略,只是缓存时间要设置的更短。

l       使用sql和参数生成签名作为KEY要保存sql用于自动更新。

l       将数据保存为JSON格式保存到Redis中。

l       当方法读取的时候切面拦截方法如果签名一直的话,就将缓存的数据取出来返回给方法,将不再执行具体业务。

l       因为使用缓存的DAO具体位置不确定,可能是基类里面也可能是某个方法里面,但是一致的都是DAO层,要经过Service层,所以在执行sql的service增加一个注解,设置这个需要执行的sql的超时时间以及是否进行自动更新等一些参数,切面执行到这个dao后会找到调用的记录,如果到Servce没有这个注解就采取默认的超时时间以及配置,如果有注解则采用具体的注解的配置。

l       当修改或者插入方法的时候可能导致数据不一致,则使用注解更新指定的缓存,或者自动更新全部缓存,或者清除缓存。

五、    总结

1.  大概的想法就是这样可能有还需要完善的地方,当完成后将采用纯注解的形式使用,以jar包的形式引入,做到零侵入,高可配,易迁移。

2.  Redis应该可以配置切片模式,hash切片或者什么的,易于数据迁移和分布式。

3.  只是一个初步想法,请多多指教   


你可能感兴趣的:(架构,java,Redis)