1、我在做电商项目的时候需要使用到缓存,这里我选择了redis,电商项目一般都是80%的访问用在了20%的热点数据上,所以我为了减少数据库的压力,减少io操作,就把热点数据放到了redis中,具体的实现做法是(把每次访问到的商品信息放入到redis中,并且设置过期时间为1天,这样就可以保证redis中保存的一直是热点数据)
2、redisClient的配置(使用策略模式,可以在需要的时候随时切换单机模式和集群模式,两个实现类都是实现了redisClient接口)
<!-- redis单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="6379"/>
</bean>
<bean id="JedisClientPool" class="com.taotao.jedis.JedisClientPool" />
<!-- redis集群版 -->
<!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108" />
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.117.17.108"/>
<constructor-arg name="port" value="7006"/>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.jedis.JedisClientCluster"/> -->
3、在查询商品详情前,先查询缓存,如果缓存中有数据则取出数据返回给页面,没有数据则查询数据库,并在返回页面前把数据同步到缓存中,因为不能影响正常业务逻辑,所以需要try/catch到异常
代码如下:
@Override
public TbItem getItemById(Long id) {
// 先从缓存中查出数据 key 由itemINfo+id+base组成
try {
// 得到json串
String json = jedisClient.get(ITEM_INFO + id + ITEM_BASE);
if (StringUtils.isNotBlank(json)) {
// 得到对象
TbItem tbItem = JsonUtils.jsonToPojo(json, TbItem.class);
return tbItem;
}
} catch (Exception e) {
e.printStackTrace();
}
TbItem tbItem = itemMapper.selectByPrimaryKey(id);
// 把数据同步到缓存中
try {
// 得到json串的数据
String json = JsonUtils.objectToJson(tbItem);
// 同步到缓存
jedisClient.set(ITEM_INFO + id + ITEM_BASE, json);
// 设置有效时间 1天
jedisClient.expire(ITEM_INFO + id + ITEM_BASE, ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return tbItem;
}
22