发表于: 2020-07-10 23:53:06

1 1997



今天完成的事:

使用memcached和redis实现缓存,并在本地测试


编写memcached的properties文件

#######################设置Memcached服务器参数#######################
#设置服务器地址###该端口号默认为11211
memcached.server=127.0.0.1:11211

#容错
memcached.failOver=true
#设置初始连接数
memcached.initConn=20
#设置最小连接数
memcached.minConn=10
#设置最大连接数
memcached.maxConn=250
#设置连接池维护线程的睡眠时间
memcached.maintSleep=3000
#设置是否使用Nagle算法(Socket的参数),如果是true在写数据时不缓冲,立即发送出去
memcached.nagle=false
#设置socket的读取等待超时时间
memcached.socketTO=3000
#设置连接心跳监测开关
memcached.aliveCheck=true


编写memcached.xml配置文件

<!-- Memcached配置 -->
   <bean id="memCachedPool" class="com.whalin.MemCached.SockIOPool"
         factory-method="getInstance" init-method="initialize"
         lazy-init="false" destroy-method="shutDown">

       <constructor-arg>
           <value>memCachedPool</value>
       </constructor-arg>

       <property name="servers">
           <list>
               <value>${memcached.server}</value>
           </list>
       </property>
       <property name="initConn">
           <value>${memcached.initConn}</value>
       </property>
       <property name="minConn">
           <value>${memcached.minConn}</value>
       </property>
       <property name="maxConn">
           <value>${memcached.maxConn}</value>
       </property>
       <property name="maintSleep">
           <value>${memcached.maintSleep}</value>
       </property>
       <property name="nagle">
           <value>${memcached.nagle}</value>
       </property>
       <property name="socketTO">
           <value>${memcached.socketTO}</value>
       </property>
   </bean>

   <bean id="memCachedClient" class="com.whalin.MemCached.MemCachedClient" lazy-init="false">
       <constructor-arg>
           <value>memCachedPool</value>
       </constructor-arg>
   </bean>
</beans>


编写缓存的业务逻辑

public List<Bmb> queryAllBmb() {

List<Bmb> bmbs = (List<Bmb>) memCachedClient.get("list");
   logger.info("缓存值为:"+bmbs);

   if(bmbs != null){
logger.info("memCached执行了");
       return bmbs;
   }else {

logger.info("缓存为空");
       List<Bmb> bmb = bmbMapper.queryAllBmb();
       logger.info("数据库中查询的数据为:"+bmb);

       boolean state = memCachedClient.set("list",bmb);
       logger.info("缓存是否成功"+state);
       return bmb;
   }


通常情况下,我们做缓存的目的是为了减少对数据库的压力,我们对数据库只进行增删改查的操作,缓存既然是减轻压力,那就具体定位就是查,查出现频率高,适合做缓存


启动tomcat,访问

没有加缓存查询的时间为544毫秒


加入缓存后的查询时间变为了4毫秒

速度显著提升


使用jmeter进行测试





同样的使用redis进行测试


public List<Bmb> queryAllBmb() {

List<Bmb> bmbs = (List<Bmb>) redisTemplate.opsForValue().get("list");
       logger.info("缓存值为:"+bmbs);

       if(bmbs != null){
logger.info("redis缓存执行了");
           return bmbs;
       }else {

logger.info("缓存为空");
           List<Bmb> bmb = bmbMapper.queryAllBmb();
           logger.info("数据库中查询的数据为:"+bmb);
           try {
redisTemplate.opsForValue().set("list",bmb);
           }catch (Exception e){
logger.error("redis-error:"+e);
           }

return bmb;
       }

}
}


这里遇到了一个问题,就是applicationContext主配置文件中加载多个properties文件时需要进行处理

<bean id="PropertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="order" value="1" />
   <property name="ignoreUnresolvablePlaceholders" value="true" />
   <property name="locations">
       <list>
           <!--读取src目录的db.properties文件-->
           <value>classpath:jdbc.properties</value>
           <!--读取src目录的redis-config.properties文件-->
           <value>classpath:redis.properties</value>
       </list>
   </property>
</bean>

不能直接用context来加载,这个地方花了好久时间,最后还是问师兄才知道怎么回事

<!--    <context:property-placeholder location="classpath:jdbc.properties" />-->
<!--    <context:property-placeholder location="classpath:redis.properties" />-->


启动tomcat,访问页面




同样使用jmeter测试,加入缓存的


明天计划的事:部署到服务器,看缓存穿透和缓存雪崩,任务要抓紧了,有点慢


遇到的困难:

收获:








返回列表 返回列表
评论

    分享到