一、为redis缓存设计key
1、如何设计这个key是关键,这里查询的是json字符串
2、使用客户端连接redis服务器redis-cli -h 172.25.0.11 -p 6379
3、keys * 查看所有的key(json字符串),这里只存了skuId为122的商品
二、查询redis缓存为空时,再去数据库查询
4、然后我们访问skuId为123的商品,看一下代码运行流程:
(1)后端接收到了前端的请求skuId为123,把它包装成key
(2)先拿着这个key去redis服务器查询,返回为null
(3)再查询MySQL数据库,查询到了,不为空,返回对象数据
(4)再把这个java对象数据转为json字符串,并存到redis服务器中
(5)最后把这个对象数据返回给前端
在redis服务器就可以查询到刚存过来的json字符串(skuId为123的商品信息)
运行一下这个命令:get sku:123:info
,查看存放的信息,注意这里的中文转成了URLencode编码
三、查询redis缓存存在数据
5、既然skuId为123的商品信息存到了redis缓存服务器上,那么现在访问skuId为123的商品,再看一下这个流程:
(1)后端接收到了前端请求连接skuId为123
(2)先查询redis缓存服务器,查询到了,返回结果json字符串
(3)把这个json字符串 转为java对象,直接返回给前端
牛皮吧,这就是缓存服务器的魅力!三步解决!!!
代码如下:
@Override
//用户购买商品页面:查看sku商品,sku图片集合
public PmsSkuInfo getSkuById(String skuId) {
PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
//连接缓存
Jedis jedis = redisUtil.getJedis();
//查询缓存
String skuKey = "sku:"+skuId+":info";
String skuJson = jedis.get(skuKey); //根据skuId到redis缓存查询得到一个json的字符串
if(StringUtils.isNotBlank(skuJson)) { //如果不等于空,即是可以在缓存查到
pmsSkuInfo = JSON.parseObject(skuJson,PmsSkuInfo.class); //把查询到的json字符串 转为 java对象
}else {
//如果缓存没有,就查询mysql
pmsSkuInfo = getSkuByIdFromDb(skuId);
if(pmsSkuInfo!=null) {
//mysql查询结果存入redis
jedis.set("sku:"+skuId+":info", JSON.toJSONString(pmsSkuInfo)); //把java对象 转为 json字符串
}
}
jedis.close(); //关闭缓存连接
return pmsSkuInfo;
}
//用户购买商品页面:查看sku商品,sku图片集合
public PmsSkuInfo getSkuByIdFromDb(String skuId) {
//根据skuId获得sku商品信息
PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
pmsSkuInfo.setId(skuId);
PmsSkuInfo skuInfo = pmsSkuInfoMapper.selectOne(pmsSkuInfo);
//根据skuId获得sku商品图片的集合
PmsSkuImage pmsSkuImage = new PmsSkuImage();
pmsSkuImage.setSkuId(skuId);
skuInfo.setSkuImageList(pmsSkuImageMapper.select(pmsSkuImage));
return skuInfo;
}