spring-boot项目-员工管理系统开发笔记06-增加redis实现缓存

该文章描述了一个通过将热门产品存储在Redis缓存中以提升查询速度的方案。当用户访问时,首先在Redis中查找,若不存在则查询MySQL,同时将MySQL的数据同步到Redis,以减少后续查询对数据库的依赖。此外,文章还提到了如何处理MySQL中未找到的情况,并展示了相关的Controller层和DAO层代码片段,以及Redis的配置和序列化方法。
摘要由CSDN通过智能技术生成

目标:实现一个产品查询,将热门产品放到 redis中并持久化,增加查询的效率

实现逻辑:

   1.因为用户量较少,可以伪造浏览量,实现读取mysql中数据的浏览量,将数据放入redis缓存。

   2.监控用户行为,将用户访问过的产品放入其中,并设置最大值。

这里我选择的是第二种方式

基本业务逻辑

 

目录

1.查询页面

2.查找

3.主要代码

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值