solr,什么是solr,就是你要吃的东西“馊了”,不能吃了,out of date~
嘛。。。开个玩笑,发音就是‘搜了’,专门用于搜索的一个开源框架,lunce就不说了,不好用,麻烦
来讲讲solr吧
目前最新更新的是6.0,4月7-8号更新的,哥不太喜欢用新出来的版本,多多少少会有bug,centos7出来后我至今使用的是6.5(实在无法忍受7啊。。。西吧)
6.0我也试着装了,但是会报错,日志文件找不到,自己新建一个也不行,去官方的jira看看,发现的确有这么一个bug,但是已经close状态,估计fix了吧
那么抛弃6.0不说,我们先来讲讲上一个版本5.5吧
首先你得下载这个版本的包
地址:
http://archive.apache.org/dist/lucene/solr/5.5.0/
下载后上传(chuang)到你的linux上
如下我是放到这个文件夹下,并且解压至此
名字太复杂了啦~!砸门改一个!
好,入正题
在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点
cd solr5 进入后
如此运行:
启动solr ...
启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)
那么8983就是搜索服务的端口啦
看到木有,启动成功了... 这logo我也就不说了,我当初的第一反应就是华为
这边是一些版本信息:
好,以上是jetty,简单吧
那么有的童鞋喜欢用tomcat部署咋办捏
好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽
把tomcat7解压到这个目录并且重命名
将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr
[图片上传中。。。(10)]
在solr5/server/lib/ext 目录中
所有的jar包添加到solr工程中
记住此目录
修改刚刚放进tomcat7中的solr的web.xml
放开注释,并且替换第二行白色的部分为刚刚的目录
:wq保存退出
拷贝日志文件到tomcat7下solr的classes中
最后一步:
启动tomcat
日志:
截图留念:
版本信息,tomcat7噢~
[图片上传中。。。(19)]
接下来的文章会对solr集群,zookeeper等做介绍以及详细讲解,欢迎关注并订阅我的头条号以及微信公众号,一起学习一起进步吧~solr,什么是solr,就是你要吃的东西“馊了”,不能吃了,out of date~
嘛。。。开个玩笑,发音就是‘搜了’,专门用于搜索的一个开源框架,lunce就不说了,不好用,麻烦
来讲讲solr吧
目前最新更新的是6.0,4月7-8号更新的,哥不太喜欢用新出来的版本,多多少少会有bug,centos7出来后我至今使用的是6.5(实在无法忍受7啊。。。西吧)
6.0我也试着装了,但是会报错,日志文件找不到,自己新建一个也不行,去官方的jira看看,发现的确有这么一个bug,但是已经close状态,估计fix了吧
那么抛弃6.0不说,我们先来讲讲上一个版本5.5吧
首先你得下载这个版本的包
地址:
http://archive.apache.org/dist/lucene/solr/5.5.0/
下载后上传(chuang)到你的linux上
如下我是放到这个文件夹下,并且解压至此
名字太复杂了啦~!砸门改一个!
好,入正题
在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点
cd solr5 进入后
如此运行:
启动solr ...
启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)
那么8983就是搜索服务的端口啦
看到木有,启动成功了... 这logo我也就不说了,我当初的第一反应就是华为
这边是一些版本信息:
好,以上是jetty,简单吧
那么有的童鞋喜欢用tomcat部署咋办捏
好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽
把tomcat7解压到这个目录并且重命名
将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr
[图片上传中。。。(10)]
在solr5/server/lib/ext 目录中
所有的jar包添加到solr工程中
记住此目录
修改刚刚放进tomcat7中的solr的web.xml
放开注释,并且替换第二行白色的部分为刚刚的目录
:wq保存退出
拷贝日志文件到tomcat7下solr的classes中
最后一步:
启动tomcat
日志:
[图片上传中。。。(17)]
截图留念:
版本信息,tomcat7噢~
接下来的文章会对solr集群,zookeeper等做介绍以及详细讲解,欢迎关注并订阅我的头条号以及微信公众号,一起学习一起进步吧~Redis真是好,其中的键值用起来真心强大啊有木有,
之前的文章讲过搭建了redis集群
那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢?
先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:
1 [root@nginx bin]# ./redis-server redis.conf
启动就行
在sprig文件中配置如下
<!--
TODO:
开发环境使用单机版
生产环境务必切换成集群
-->
<!-- 配置redis客户端单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis.single.client.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.single.client.port}"></constructor-arg>
</bean>
<!-- 配置redis客户端实现类 -->
<bean id="jedisClientSingle" class="com.lee.rest.component.impl.JedisClientSingle"/>
<!-- 配置redis客户端集群版 单机版和集群版的jedis只能存在一个 -->
<!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis01.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis01.real.cluster.client.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis02.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis02.real.cluster.client.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis03.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis03.real.cluster.client.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis04.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis04.real.cluster.client.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis05.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis05.real.cluster.client.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis06.real.cluster.client.host}"/>
<constructor-arg name="port" value="${redis06.real.cluster.client.port}"/>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.lee.rest.component.impl.JedisClientCluster"/> -->
这是配置的redis-cli的连接池
然后定义一个接口,这个接口供两个类实现
一个是单机版,一个是集群版
有人会问为啥要2个类实现,因为redis的单机和集群都是不同的实现方法
一般在开发环境会使用单机版来做测试,生产环境直接上集群
#fake cluster
redis.single.client.host=192.168.1.191
redis.single.client.port=6379
redis01.cluster.client.host=192.168.1.192
redis01.cluster.client.port=7001
redis02.cluster.client.host=192.168.1.192
redis02.cluster.client.port=7002
redis03.cluster.client.host=192.168.1.192
redis03.cluster.client.port=7003
redis04.cluster.client.host=192.168.1.192
redis04.cluster.client.port=7004
redis05.cluster.client.host=192.168.1.192
redis05.cluster.client.port=7005
redis06.cluster.client.host=192.168.1.192
redis06.cluster.client.port=7006
在你的资源文件中配好如上信息,供spring调用
说个题外话,资源文件*.properties,在spring的父子容器中不是公用的
也就是说,在service的spring容器中,只能配service层调用
在springMVC容器中只能被springmvc自己调用,因为资源文件不是夸容器的
而spring容器中的对象是可以被springMVC来访问的
但是springMVC的对象以及资源文件绝对不能被spring来访问,
举个栗子:你有见过service访问controller的吗?没有吧,哈哈
咱们先来建一个通用jedis客户端
(有2个小家伙看不懂最后2个方法什么意思,就加了注释,其实规范点来讲,所有的接口方法都要加注释,而实现类就不需要,但是实现类中的私有方法必须加注释,这是规范)
package com.lee.rest.component;
/**
*
* @Title: JedisClient.java
* @Package com.lee.rest.component
* @Description: redis客户端
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:28:46
* @version V1.0
*/
public interface JedisClient {
public String set(String key, String value);
public String get(String key);
public Long hset(String key, String item, String value);
public String hget(String key, String item);
public Long hdel(String key, String item);
public Long incr(String key);
public Long decr(String key);
/**
*
* @Description: 设置存存活时间
* @param key
* @param second
* @return
*
* @author leechenxiang
* @date 2016年4月27日 下午4:34:35
*/
public Long expire(String key, int second);
/**
*
* @Description: 判断key多久过期
* @param key
* @return 秒
* >= 0 剩余秒数
* = -1 永久存活
* = -2 已经消除
*
* @author leechenxiang
* @date 2016年4月27日 下午4:34:22
*/
public Long ttl(String key);
}
/**
*
* @Title: JedisClientSingle.java
* @Package com.lee.rest.component.impl
* @Description: 单机版的jedis客户端操作
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:36:42
* @version V1.0
*/
public class JedisClientSingle implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String item, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, item, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String item) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, item);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String item) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, item);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long decr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.decr(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int second) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, second);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
}
/**
*
* @Title: JedisClientCluster.java
* @Package com.lee.rest.component.impl
* @Description: 集群版的jedis客户端操作
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:44:02
* @version V1.0
*/
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Long hset(String key, String item, String value) {
return jedisCluster.hset(key, item, value);
}
@Override
public String hget(String key, String item) {
return jedisCluster.hget(key, item);
}
@Override
public Long hdel(String key, String item) {
return jedisCluster.hdel(key, item);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long decr(String key) {
return jedisCluster.decr(key);
}
@Override
public Long expire(String key, int second) {
return jedisCluster.expire(key, second);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
}
使用地方,一般都是在service中调用,把需要加缓存的地方都实现接口
取之前查询有没有缓存,有直接返回,没有查数据库,然后再放入缓存
也有企业会这么做,所有的缓存都有一个团队来管理,做一个定时器,每天凌晨固定一个时间点来跑批,把数据放入缓存
这么做也是可以的
我们采取的是第一种
PS:@Autowired 这边是用的类型相同,有人喜欢用@resource,这样的话就得多写一个,区别点
@Autowired
private JedisClient jedisClient;
@Value("${REDIS_CONTENT_KEY}")
private String REDIS_CONTENT_KEY;
@Override
public List<Content> gettList(Long id) {
// TODO 这个地方加缓存和不加缓存,单台或者集群的redis,都要进行压力测试
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try {
//从redis中取缓存数据
String json = jedisClient.hget(REDIS_CONTENT_KEY, id + "");
if (!StringUtils.isBlank(json)) {
//把json转换成List
List<Content> list = JsonUtils.jsonToList(json, Content.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//执行查询
List<?> list = xxxMapper.select(id);
// 返回结果之前,向缓存中添加数据
try {
// 为了规范key可以使用hash
// 定义一个保存内容的key,hash中每个项就是cid
// value是list,需要把list转换成json数据。
jedisClient.hset(REDIS_CONTENT_KEY, id + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
那么service就好了,集群版的也通用
那么集群的配置如何呢?
放开注释
使用资源文件的配置
好了,启动一下就可以运行了
配置好Test或者controller都可以调用
但是要做好缓存同步,也就是在增加,修改,删除数据后,要同步缓存,把原有的del,在放入新的
这样就可以了`~
Java技术交流群solr,什么是solr,就是你要吃的东西“馊了”,不能吃了,out of date~
嘛。。。开个玩笑,发音就是‘搜了’,专门用于搜索的一个开源框架,lunce就不说了,不好用,麻烦
来讲讲solr吧
目前最新更新的是6.0,4月7-8号更新的,哥不太喜欢用新出来的版本,多多少少会有bug,centos7出来后我至今使用的是6.5(实在无法忍受7啊。。。西吧)
6.0我也试着装了,但是会报错,日志文件找不到,自己新建一个也不行,去官方的jira看看,发现的确有这么一个bug,但是已经close状态,估计fix了吧
那么抛弃6.0不说,我们先来讲讲上一个版本5.5吧
首先你得下载这个版本的包
地址:
http://archive.apache.org/dist/lucene/solr/5.5.0/
下载后上传(chuang)到你的linux上
如下我是放到这个文件夹下,并且解压至此
名字太复杂了啦~!砸门改一个!
好,入正题
在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点
cd solr5 进入后
如此运行:
启动solr ...
启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)
那么8983就是搜索服务的端口啦
看到木有,启动成功了... 这logo我也就不说了,我当初的第一反应就是华为
这边是一些版本信息:
好,以上是jetty,简单吧
那么有的童鞋喜欢用tomcat部署咋办捏
好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽
把tomcat7解压到这个目录并且重命名
将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr
在solr5/server/lib/ext 目录中
所有的jar包添加到solr工程中
记住此目录
修改刚刚放进tomcat7中的solr的web.xml
放开注释,并且替换第二行白色的部分为刚刚的目录
:wq保存退出
拷贝日志文件到tomcat7下solr的classes中
最后一步:
启动tomcat
日志:
[图片上传中。。。(17)]
截图留念:
版本信息,tomcat7噢~
[图片上传中。。。(19)]
接下来的文章会对solr集群,zookeeper等做介绍以及详细讲解,欢迎关注并订阅我的头条号以及微信公众号,一起学习一起进步吧~