我这里将商城中某些会被用户经常查看的商品的详细信息存储到redis中示例
1.首先我们需要在linux中安装redis服务。
https://blog.youkuaiyun.com/ly_linyuan/article/details/80003231
2.启动redis服务
./redis-server
3.在项目中配置spring整合redis的配置文件
spring-redis.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- jedis客户端单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.64.129"/>
<constructor-arg name="port" value="6379"></constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
</bean>
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
</bean>
</beans>
4.在后台查询商品详细信息的时候,我们做一个处理
查询redis缓存,如果缓存中有该商品的信息,那么直接返回redis中的数据,不继续进行查询,如果redis缓存中没有该商品详细信息,则查询数据库中该商品信息,并将该信息添加至缓存中,以便下一次该商品被访问时可以直接在缓存中加载出该商品的信息。设置一个时限,让缓存每隔一段时间自己清理,提高缓存的效率。
后台代码:
//jedis
@Autowired
private JedisPool jedisPool;
@Value("${GOOD_INFO}")
private String GOOD_INFO;
@Value("${TIME_EXPIRE}")
private String TIME_EXPIRE;
/**
* 根据id查询到商品详细信息
*/
@Override
public Good getGoodById(Integer id) {
//从连接池获取连接
Jedis jedis = null;
//先查询缓存
//添加缓存不能影响正常业务逻辑
try {
jedis = jedisPool.getResource();
String json = jedis.get(GOOD_INFO + ":" + id + ":BASE");
//删除指定key的缓存
/*jedis.exists(id.toString());*/
//查询到结果,把json转换成List返回
if (StringUtils.isNotBlank(json)) {
Good good = JsonUtils.jsonToPojo(json, Good.class);
return good;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
jedisPool.returnResource(jedis);
}
//缓存中没有存储,需要查询数据库
GoodExample example = new GoodExample();
GoodExample.Criteria criteria = example.createCriteria();
criteria.andIdEqualTo(id);
List<Good> glist = goodMapper.selectByExample(example);
if(glist != null && glist.size() > 0){
try {
jedis = jedisPool.getResource();
//把结果添加到缓存
jedis.set(GOOD_INFO+":" + id + ":BASE", JsonUtils.objectToJson(glist.get(0)));
//设置过期时间,提过缓存的利用率
jedis.expire(GOOD_INFO + ":" + id + ":BASE", Integer.parseInt(TIME_EXPIRE));
} catch (Exception e) {
e.printStackTrace();
}finally{
jedisPool.returnResource(jedis);
}
return glist.get(0);
}
return null;
}
注意:我这里,GOOD_INFO是我自己命名的key,TIME_EXPIRE是缓存的最大有效时间,当超过该时间后该缓存自动清理,提高缓存效率
3.这里,我们可以通过RedisDesktopManager工具连接我们的缓存服务器,查询缓存中有没有存储该商品信息
例如我这里的缓存中已经查看过的商品添加进去的数据
(我们这里查询一个没有的商品做一个测试)
查看后再次查看缓存,缓存中添加成功