目标:
(1)实现缓存逻辑。(Redis)
(2)完成搜索功能。(Solr)
缓存可以提高搜索效率,以下情况一般使用缓存
(1)查询频率较高的数据。
(2)修改频率较低的数据。
缓存逻辑实现:
1.添加缓存
需求:在REST接口中,给导航菜单、首页大广告位内容添加缓存。缓存逻辑在ego-rest工程中实现。
1.1.添加Redis的jar包
1.2.spring整合Redis集群
1.3.修改ContentServiceImpl类
public class ContentServiceImpl implements ContentService{
private String EGO_CONTENT = "EGO_CONTENT";
@Autowired
private JedisCluster jedisCluster;
@Autowired
private ContentMapper mapper;
/*
* 缓存逻辑
* (1)首先查找缓存。
* (2)如果缓存有数据,则直接返回数据,不需要查询数据库
* (3)如果缓存中没有数据,则查询数据库。并且将数据放入缓存中。
*
* (4)缓存不能影响正常的业务执行,即当前缓存无法使用,则直接查询数据库
*
* 确定选用哪一个数据结构类型(string,list,set,hash)
* 选用数据结构类型的时候,有一个原则:能用hash尽量使用hash。原因:减少key的数量,在寻址的时候速度更快。
*
* {key:{field:value}}
* 我们这里使用hash数据结构类型,key定义成一个常量EGO_CONTENT field就使用类型分类的id,value使用内容列表的json格式。
*
* 注意:hash结构只能存储string格式的数据
*
*/
public EgoResult getContentByCatId(Long catId) {
List<Content> list = null;
try {
//1、查找缓存
String jsonData = jedisCluster.hget(EGO_CONTENT, catId+"");
if(null!=jsonData && !"".equals(jsonData)){
//缓存里面有数据,则直接返回数据即可
list = JsonUtils.jsonToList(jsonData, Content.class);
}else{
//如果缓存中查不到数据,则查询数据库
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("category_id", catId);
list = mapper.selectByMap(columnMap);
//再将数据放入缓存中
jedisCluster.hset(EGO_CONTENT, catId+"", JsonUtils.objectToJson(list));
}
} catch (Exception e) {
e.printStackTrace();
//如果缓存中查不到数据,则查询数据库
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("category_id", catId);
list = mapper.selectByMap(columnMap);
}
return EgoResult.ok(list);
}
}
1.4.测试
(1)重启rest工程
(2)访问portal工程首页。将缓存添加到redis中。
(3)再次访问portal工程首页。查看缓存是否生效。
缓存同步:修改、更新导航菜单、网站内容后,要同步修改缓存,或者清空对应的缓存。
2.系统架构
在本项目中,我们将搜索业务独立出来,创建搜索子系统。这样做,既能提高系统的拓展能力,也能灵活的对系统进行分布式部署。
实现思路:
(1)搭建搜索服务器。
(2)创建搜索系统。
(3)发布搜索服务的公共接口。
(4)在门户系统调用该接口,实现搜索。
3.搭建搜索服务器
3.1.配置solr服务器
3.1.1.解压一个新的Tomcat,专门用来加载Solr。
3.1.2.部署solr到Tomcat中
3.1.3.添加Tomcat依赖的jar包
3.1.4.创建SolrHome
3.1.5.配置SolrHome
3.1.6.修改web.xml加载SolrHome
3.1.7.启动Tomcat测试
访问地址 http://localhost:8080/solr