发表于: 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测试,加入缓存的
明天计划的事:部署到服务器,看缓存穿透和缓存雪崩,任务要抓紧了,有点慢
遇到的困难:
收获:
评论