目标:实现一个产品查询,将热门产品放到 redis中并持久化,增加查询的效率
实现逻辑:
1.因为用户量较少,可以伪造浏览量,实现读取mysql中数据的浏览量,将数据放入redis缓存。
2.监控用户行为,将用户访问过的产品放入其中,并设置最大值。
这里我选择的是第二种方式
基本业务逻辑
目录
1.查询页面
实现功能:
1.搜索功能
2.显示热点商品
2.查找
1.进入redis查找
2.查不到进入mysql查找,mysql查到了添加进redis,并将mysql对应的索引信息添加进redis,方便下次查找
3.mysql查不到同样添加进redis,只不过绑定空值信息,减少mysql的查询操作
3.主要代码
1.controller层
@RequestMapping("/product/query")
public String goProduct(Model model,HttpServletRequest request){
Set<String> products = productDao.selectAll();
List<String> list=new ArrayList<>();
for(Iterator<String> iterator=products.iterator(); iterator.hasNext();){
list.add(iterator.next());
}
Product result = (Product) request.getAttribute("product");
if(result==null){
result=new Product(-1,"null","null","null",-1);
}
model.addAttribute("result",result);
model.addAttribute("products",list);
return "product";
}
@RequestMapping("/product/select")
public String add(@RequestParam("p") String name, HttpServletRequest request){
Product product = productDao.getProductByName(name);
request.setAttribute("product",product);
return "forward:/product/query";
}
2.dao层实现
@Autowired
private productMapper mapper;
@Autowired
private RedisTemplate<String,String> redisTemplate;
public Product getProductByName(String name){
if(Boolean.TRUE.equals(redisTemplate.hasKey(name))){
String s = redisTemplate.opsForValue().get(name);
if(Objects.equals(s, "0")){
return null;
}else{
assert s != null;
System.out.println("从redis获取");
return mapper.getById(Integer.parseInt(s));
}
}else {
System.out.println(name);
Product product=mapper.getByName(name);
if(product==null){
redisTemplate.opsForValue().set(name,"0");
return null;
}else {
System.out.println("从Mysql获取");
redisTemplate.opsForValue().set(name,product.getId().toString());
return product;
}
}
}
public Set<String> selectAll(){
return redisTemplate.keys("*");
}
3.操作mysql的mapper层就不予展示了
4.当然使用redisTemplate要先序列化,不然存储数据会乱码
序列化Config
@Configuration
public class MyRedis {
@Bean(name="redisTemplate")
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(redisSerializer);
//value hashmap序列化
template.setHashValueSerializer(redisSerializer);
//key haspmap序列化
template.setHashKeySerializer(redisSerializer);
//
return template;
}
}