Redis搭建,集群搭建,多属于运维知识,基本了解就可以。但是在项目如何让redis发挥它的特长就属于我们需要掌握和探索的。接下来讲解一下在项目中如何使用redis来做缓存的。
一:适用场景
什么样的情况才会用到缓存呢?一个项目中有些数据长时间不会发生变动,但是用户又访问特别频繁。我觉得这样的情况会用到缓存。从我们项目的使用情况,我总结出来了这一点。
我们项目的首页上会有一些大的广告位,而且大家都知道用户最先访问的都会是首页,所以访问特别频繁,广告更换也不会很频繁,所以我们觉得用在这里挺合适的。
二:如何让数据从缓存中取到
第一,我们首先会判断缓存中是否有该数据,如果没有就从数据库中获取,返回给前台的同时存入到缓存一份儿。如果缓存中有数据,则直接返回缓存中的数据。
public List<TbContent> getContentList(Long cid) { // 查询数据时,先从缓存查询,有就直接返回 try { String json = jedisClient.hget(REDIS_CONTENT_KEY, cid + ""); if (!StringUtils.isEmpty(json)) { // 把json数据转换成List List<TbContent> jsonToList = JsonUtils.jsonToList(json, TbContent.class); return jsonToList; } } catch (Exception e1) { e1.printStackTrace(); } // 如果没有则查询数据库 // 根据cid查询内容列表 TbContentExample example = new TbContentExample(); Criteria criteria = example.createCriteria(); criteria.andCategoryIdEqualTo(cid); // 执行查询 List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example); // 查询之后再放入缓存 // 有关content的保存在一个hash中,key为REDIS_CONTENT_KEY // 其中每项的item为contentCid,value为list(list要转换成json) try { jedisClient.hset(REDIS_CONTENT_KEY, cid + "", JsonUtils.objectToJson(list)); } catch (Exception e) { e.printStackTrace(); } return list; }
三:如何让缓存中的数据与数据库中的保持同步
刚开始接触的时候,我有一个疑问,不知道大家有没有,就是在项目中如果使用redis做缓存的话,如果数据有变化的时候怎么让redis中的数据与数据库中的保持同步。应该会有很多种方法,我们项目中用的是下面这种方法。
在后台对大广告位的内容进行添加或修改或删除的同时删除缓存中大广告位的信息。
/** * 添加内容 * @param content * @return */ @RequestMapping("/save") @ResponseBody public TaotaoResult insertContent(TbContent content){ TaotaoResult result = null; try { //添加大广告位信息 result = contentService.insertContent(content); //删除缓存中的信息 jedisClient.hde(REST_BASE_URL+REST_CONTENT_SYNC_URL+content.getCategoryId()); // } catch (Exception e) { e.printStackTrace(); } return result; }