1:数据统计类型的项目,用户量多、业务数据量大、计算逻辑复杂。
2:项目开发工作临近完成,不宜大改动。
1:针对背景第1点,需要使用Redis把复用性高的统计结果缓存起来。减少重复的计算,减少数据库压力,提高服务响应速度。
2:使用 注解+AOP的技术,达到代码修改最小化、缓存可配置化。
下图是我整个设计的详细思维:
流 程
=172.26.175.74
=6379
=admin0:不启用 1:启用
=1
import n.*;@Documented@Target()@Retention()public @interface RedisCashe { //缓存名称,用于Redis Key的命名。 String cacheName(); //过期时间配置 以秒为单位,示例(1天):3600*60*24 int expire();}
/**部份命名空间因为脱敏,干掉了。**/@Aspect@Componentpublic class RedisProcess { private static final Logger logger = (); @Resource RedisTemplate<String, Object> redisTemplate; //可以直接取toString的类型集合。 private static final List<String> typeList; static { ArrayList<String> rs =new ArrayList<>(); (me()); (me()); (me()); (me()); (me()); (me()); (me()); (me()); (me()); typeList= rs; } /** * 拦截所有元注解RedisCache注解的方法 */ @Pointcut(@annotation(e)) public void pointcutMethod() { (************拦截命中***************); } @Value(${}) private int reportCacheEnable ; /** * 流程 * 1:检查是否有缓存,有缓存直接返回 * 2:执行业务 * 3:结果缓存 * 4:返回结果 * @param joinPoint * @return */ @Around(pointcutMethod()) public RestResult around(ProceedingJoinPoint joinPoint) { //前置:从Redis里获取缓存 //先获取目标方法参数 (************拦截命中***************); long startTime = meMillis(); Object cdn = ()[0]; String key = getKey(joinPoint); if (reportCacheEnable==1 && (key)) { Object obj = ue().get(key); (Redis的KEY值: + key); (**********从Redis中查到了数据**********); return (RestResult) obj; } (Redis缓存命中耗时: + (meMillis() - startTime)); (**********没有从Redis查到数据**********); try { (**********执行业务方法**********); RestResult rs = (RestResult) (); (**********Redis缓存**********); if(reportCacheEnable==1) { RedisCashe cacheCfg =getCacheConfig(joinPoint); ue().set(key,rs,(), ); } (Redis缓存未命中耗时: + (meMillis() - startTime)); return rs; } catch (Throwable e) { kTrace(); } return null; } private RedisCashe getCacheConfig(ProceedingJoinPoint joinPoint) { String methodName =ure().getName(); RedisCashe rs ; Method[] methods =().getClass().getMethods(); for(Method m :methods) { if((()) ) { Annotation[] annotations =edAnnotations(); for(Annotation a: annotations) if(e(a)) { rs = ( RedisCashe) a; return rs; } } } return null; } //定义Key的格式,示例:RptCacheName:getDphuDatePassPrc@2018-01-01@1@abc private String getKey(ProceedingJoinPoint joinPoint) { Object[] args = (); RedisCashe cacheCfg =getCacheConfig(joinPoint); String key=RptCacheName:+(); for(int i=0;i< ;i++) { Object o=args[i]; String oType =().getTypeName(); if((oType)) { key+=@+ (); } else { //类对象的使用JSON转换 key+=@+ new Gson().toJson(o); } } return key; }}
@Service(dphuRptBiz)public class DphuRptBiz implements IDphuRptBiz { @Autowired DphuRptMapper mapper; @Override @RedisCashe( cacheName = getDphuDatePassPrc, expire = 3600 * 60 * 24) public RestResult<List<DphuInputResult>> getDphuDatePassPrc(DphuInput inp) { (new ArrayList<DphuInputResult>()); RestResult<List<DphuInputResult>> rs=new RestResult<>(); (1); tePassPassRpt(inp); (获取成功); (()); return rs; } @Override @RedisCashe( cacheName = getDphuWorstPrc, expire = 3600 * 60 * 24) public RestResult<List<DphuWorstInputResult>> getDphuWorstPrc(Date vCurrentDate, String vSumaryType, String vGroupBy, String vWhere, String vTop) { DphuWorstInput inp = new DphuWorstInput(); ntDate(vCurrentDate); yType(vSumaryType); By(vGroupBy); (vWhere); (vTop); (new ArrayList<DphuWorstInputResult>()); RestResult<List<DphuWorstInputResult>> rs=new RestResult<>(); (1); rstRpt(inp); (获取成功); (()); return rs; }}
关键是注解 : @RedisCashe( cacheName = “getDphuDatePassPrc”, expire = 3600 * 60
* 24)
1:定义了缓存的Key格式(方面后期Redis操作)
2:定义过期时间
好的,大功告成。
[ DEBUG] [2020-03-24 14:56:19] 拦截命中***
[ INFO ] [2020-03-24 14:56:19] - Redis缓存AOP处理所用时间:11
[ INFO ] [2020-03-24 14:56:19] 没有从Redis查到数据
[ INFO ] [2020-03-24 14:56:19] 执行业务方法
[ INFO ] [2020-03-24 14:56:25] Redis缓存
[ DEBUG] [2020-03-24 14:59:47] 拦截命中***
[ INFO ] [2020-03-24 14:59:47] 从Redis中查到了数据
[ INFO ] [2020-03-24 14:59:47] - Redis的KEY值:Base{rptName=‘getDphuDatePassPrc’, rptCondition={“result”:[],“vCurDate”:“2020-01-01 00:00:00”,“vGroupBy”:“factory_code”,“vSumaryType”:“10”,“vTop”:“4”,“vWhere”: 1=1 }}
[ INFO ] [2020-03-24 14:59:47] - REDIS的VALUE值:{“data”:[’’],“msg”:“获取成功”,“result”:1}
PS:
1:第一次没有命中缓存,耗时6秒
2:第二次命中缓存,耗时小于1秒
1:性能提示显著,应对多并发轻松自如。
2:使用切面编程,业务代码没有任何改动,缓存没有景响到原来的开发进度。
整理来自:,csdn博客【Richy Liu】
看完本篇文章是什么感受呢?是不是学习到了一些,如果觉得还行的话,动动您的金手指点个关注收藏转发吧!谢谢您的支持!继续加油整理有用的文章分享给大家!一起加油!欢迎指导评论!我会收集评论对大家进行了解回答!谢谢您的支持!
我们同学希望找到在线学习的资料,通常还希望将它保存在自己的电脑里随时调用,可是没有办法下载,很是头疼,这里我为同学们找到了三个方法我试过没问题,特向大家推荐注意:视频下载的是.flv格式!方法一:最常见的方法利用缓存来保存视频! 首先坐下来耐心的把要下的视频看完!不要砸我!只有当视频都播放完了在缓存中才能找到FLV的视频文件。我感觉在要下视频之前先不缓存中的文件全部删除!那样等下完视频也是很容易就能找到。缓存一般都是默认保存在这个文件夹里C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files 等看完视频之后,到这个文件夹里找带 .FLV 的文件就是要下的视频!保存到本地上就OK了!这个方法虽然简单不用什么软件的但是太浪费时间了!而且有时候网络忙的时候有的视频一半就没了!那样缓存存储的方法就不太好了! 方法二:利用维棠FLV视频下载软件下载视频,这个方法菲菲向大家推荐下!我一直都是用这个挖视频的很不错的的软件!给大家做个链接/这个是维棠的官方网站没有病毒的!可以放心下载! 这个软件本身就不大!而且还带FLV的播放器!先把要下的视频的视频网址复制下来,在维棠上点“新建”把网址粘贴在“视频网址”上保存在你想要的文件夹中,重新命下名字就可以下载了!这个软件的好处是可以10文件一起下载!但是有时侯它会停下来,只要把停下的先暂停下在开始就可以了!要是还不可以就把它删除掉,在重新下载!还是下到那个文件夹也还是那个名字!放心他们会连在一起的。 其实我建议大家最好不要白天下!因为白天下的很慢的!最好是在晚上或后半夜!我曾经在晚上12点多下过一回,速度很惊人的!40M!所以我建议大家晚点下! 方法三:其实这个也很好用,闪播FLV文件下载器,这个软件也很小才200K多点。 同样把要下的视频网址复制下来,粘贴在FLV视频网址上,点旁边的“开始扑捉”等几秒!在下面就会出现你要下的视频的!在下面的操作中有下载!注意一点这个下载就本地下载,要是下到一半的时候,一不小心死机了也就没了!所以我建议大家用“拷贝到剪帖板上”可以用WEB迅雷下载!很方便的!就跟下普通的视频文件一样! 参考资料:雪儿あ菲菲
怎样把56网的视频能下载下来其实下载视频和音频文件根本不用软件根本不用刻意的去下载,方法简单的让人看了都直发笑,只是有的朋友不知道而已,在试看视频或试听音频文件等缓冲完后,这时候想文件已经下载到我们电脑里了,下载网页里的和暴风影音酷我音乐盒QQ空间等等方法完全一样,下面我说一下怎么下载音频或视频文件:
1:打开浏览器或某个网页后,选择:工具-internet选项-删除文件-确定。
2:这时候开始去试听或试看你想要下载的文件。
(记住,一定要等播放的视频或音频文件缓冲完成后再回头去找这个已经下载到电脑里的文件)
3:找到已经下载到电脑里的我们刚才试听或试看的文件,音频文件为MP3格式,视频文件为FLV或MP4等格式的文件。
(找文件的方法:工具-internet选项-设置-查看文件-这时,在打开的C盘的画面的空白处点右键-排列图标-
大小,其实点右键选择图标再选择大小的目的只是为了方便不太熟悉的朋友寻找文件,这时候最后的一个文件就是我们想下载的文件了,在最后的一个文件上点右键选择复制,之后粘贴到桌面或其他地方就可以了,如果需要,自己就更改一下文件的名字,播放的时候选择一下播放器就可以了,右键视频文件,选择程序)
看我写了这么多好象很麻烦,其实真的简单的不能再简单了!闪播flv视频下载器(flashmov播放器) 可下载优酷,土豆,56等许多网站的视频. 下载地址:
/player_ 是由闪播网官方提供的视频播放和视频下载软件. 闪播flv下载器支持互联网上任何一家视频分享平台的flv视频下载和播放!
使用方法:安装后运行桌面的flash mov视频下载器.然后把你要下载的视频地址从ie的地址拦里复制到flash
mov视频下载器的开始捕捉地址拦里.然后点开始捕捉 最后在下面搜索到的地址上右键点---
下载.复制下网址,到kisstudou里有个输入栏,把刚才复制的地址粘贴过去,点“开始go“。
跳到另一网页后,有个地址,右击单击下载即可