memcache真实项目缓存实例

最近因为公司的项目数据量越来越大,导致在系统在运行的时候,每一次都进行大量的查询,很多页面的查询的频率很高,所以每次都进行了差不多一模一样的查询,返回了一模一样的数据,其实这样就非常的浪费资源了,所以就将一部分常用的数据,放在缓存中,如果下次还是查询相同的内容,那么就可以直接从缓存中返回了,不需要和数据库进行交互了。

公司的客户要频繁的查自己的报表数据,返回相同的数据频率很高,现在准备把报表的数据缓存到memcache的缓存中,因为报表是一个小时更新一次,所以我们缓存数据的时间也调整到一个小时。

思路:因为memcache是根据键值对(K-V)存储的,所以每次返回的报表数据通常都是10条,

根据查询条件的不同,返回的数据也是不同的

1.用查询条件和分页条件作为key,查询出所有的对象的主键id的集合作为value。

2.将1查询出来的所有对象,每个对象都把自己的主键id作为key,自身对象作为value缓存到memcache缓存中。

存储一次的结果可能是这样的:

(10_1_4352_9674_null , [85,48,69,345,849,279])

(85,object1)

(48,object2)

(69,object3)

(345,object4)

(849,object5)

(279,object6)

这样分开存储是有好处的,如果说只把把查询条件和分页条件作为key,查询出来的结果集合作为value的话,是很有局限性的。把查询出来的对象,通过id单独缓存的话这样很多结果集中间有重复的对象就不会在缓存第二次了。

来看一下缓存的代码.

private void cacheData(QueryResult<AdspacereportInfo> result,String queryStr,String cacheType) {
        List<AdspacereportInfo> resultList = result.getResultList();
        String totalRecord = result.getTotalRecord()+"";

        String cacheKey = cacheType+Constant.CACHE_ADSREPORT;
        try {
            ArrayList<String> idList = new ArrayList<String>();
            // 设置arraylist容器的初始容量
            idList.ensureCapacity(resultList.size());

            for(AdspacereportInfo report : resultList){
                idList.add(report.getId()+"");

                if(null != report){
                    // 1 缓存查询结果
                    if (null == memcachedClient.get(cacheKey+report.getId())) {
                        memcachedClient.set(cacheKey+report.getId(), MemcachedManager.CACHE_EXP_HALF_HOUR, report);
                    }
                }
            }

            // 2 缓存查询条件
            if( null == memcachedClient.get(cacheKey+queryStr)){
                memcachedClient.set(cacheKey+queryStr, MemcachedManager.CACHE_EXP_HALF_HOUR, idList);
            }

            // 3 缓存查询总数
            if( null == memcachedClient.get(cacheKey+Constant.CACHE_SIZE+queryStr)){
                memcachedClient.set(cacheKey+Constant.CACHE_SIZE+queryStr, MemcachedManager.CACHE_EXP_HALF_HOUR, totalRecord);
            }
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (MemcachedException e) {
            e.printStackTrace();
        }

    }

这是查询缓存的代码:

/**
*  @queryStr  就是查询条件和分页条件
*/

private QueryResult<AdspacereportInfo> queryCacheData(String queryStr,String cacheType) {
        QueryResult<AdspacereportInfo> result = new QueryResult<AdspacereportInfo>();
        List<AdspacereportInfo> list = new ArrayList<AdspacereportInfo>();
        String cacheKey = cacheType+Constant.CACHE_ADSREPORT;
        try {
            // 1  查出只含有 id的集合{2, 38, 75, 8, 3, 5}
            ArrayList<String> arr =(ArrayList<String>) memcachedClient.get(cacheKey+queryStr);
            if(null != arr){
                for(String id : arr){
                    //  2   遍历id集合  取出对象
                    AdspacereportInfo report =(AdspacereportInfo) memcachedClient.get(cacheKey+id);
                    if( null != report){
                        list.add(report);
                    }
                }
            }

            // 3 查出缓存的数据大小
            String totalRecord =(String) memcachedClient.get(cacheKey+Constant.CACHE_SIZE+queryStr);

            //  4  组装
            result.setResultList(list);
            if(StringUtils.isNotBlank(totalRecord)){
                result.setTotalRecord(Integer.valueOf(totalRecord));
            } else {
                //  默认  10
                result.setTotalRecord(10);
            }

        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (MemcachedException e) {
            e.printStackTrace();
        }

        return result;
    }
时间: 2024-11-06 04:58:30

memcache真实项目缓存实例的相关文章

Java算法之递归打破及在真实项目中的使用实例

开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归算法与真实项目接口??? 3.如何打破递归算法??? 解决问题 1.首先练习下网上一些递归经典题 1 package com.hwy.test; 2 3 /** 4 * 递归函数测试 5 * Created by Ay on 2016/7/2. 6 */ 7 public class RecursionTes

ehcache memcache redis 三大缓存男高音_转

ehcache memcache redis 三大缓存男高音 2013-01-16 15:43 10500人阅读 评论(2) 收藏 举报 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apache 2.0  license).充满特色(稍

分布式缓存之 memcache 实现分布式缓存

最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可以百度下) memecached -d instal memcached -d start(stop) 然后我们用vs建个console项目 用nuget 下载memcache的c#调用驱动 当然有一些驱动,我选择的是EnyimMemcached github开源地址为:https://github

读写锁ReadWriteLock和缓存实例

读写锁:多个读锁不互斥,读锁与些锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁可提高性能. 例子1:三个线程同时对一个共享数据进行读写. import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantRea

PHP memcache实现消息队列实例

现在,memcache于server缓存广泛应用.下面我来介绍一下memcache消息队列中等待的样本实现,有需要了解的朋友可以参考. memche消息队列原则key上做文章.后消息或者日志. 然后通过定时程序将内容落地到文件或者数据库. php实现消息队列的用处比方在做发送邮件时发送大量邮件非常费时间的问题.那么能够採取队列. 方便实现队列的轻量级队列server是: starling支持memcache协议的轻量级持久化server https://github.com/starling/s

初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例

asp.net中的数据缓存可以用 HttpRuntime.Cache ,这个是大家都知道的,但如果缓存的数据比较多,又比较杂乱,想要把缓存分开管理(也就是创建多个缓存实例)应该怎么做呢... 于是常规做法来了 using System.Web.Caching; public static class MyCache { public static Cache cache = new Cache(); } 不用说也知道,肯定跑不起来,不然也不会有这篇文章了,使用的时候对新建的 MyCache.ca

jQuery清除缓存实例代码

jQuery清除缓存实例代码:缓存是个好东西,但是有些情况下则会出现一些麻烦,比如验证码不能刷新等等,尤其是在IE浏览器下面,本章节就简单介绍一下如何清除缓存以避免一些不必要的困扰,解决方案一:使用ajax方法的时候可以设置cache的参数为false.代码如下: $.ajaxSetup ({ cache: false }); $(fucntion({ $.ajaxSetup ({ cache: false }); })) 特别说明:不能够设置为全局的.解决方案二:在请求的链接后面添加随机数,比

ThinkPHP中F方法快速缓存实例

一般使用文件方式的缓存就能够满足要求,而thinkPHP还提供了一个专门用于文件方式的快速缓存方法F方法. 由于采用的是PHP返回方式,所以其效率较S方法较高.F方法具有如下特点:1.简单数据缓存:2.文件形式保存:3.采用PHP返回数据方式加载缓存:4.支持子目录缓存以及自动创建:5.支持删除缓存和批量删除:$path="../Public/Runtime/";$str="fastrunaaaaaaaaaaaaaaaa";F("str/ffun"

UEditor之图片上传如何和真实项目结合

1.首先,我们定义一个名为GetConfigServlet的Servlet,真实项目应该是一个Controller,一样的,这个类就是加载后端配置文件类 package com.ay.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;