Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis

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,在放入新的

这样就可以了`~

尚自习 | 程序员的进阶平台 itzixi.com

微信公众号:BeJavaGod

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等做介绍以及详细讲解,欢迎关注并订阅我的头条号以及微信公众号,一起学习一起进步吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容