Redis 一二事 - 在spring中使用jedis 连接调试

作者: 风间影月 | 来源:发表于2017-10-27 11:12 被阅读121次

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

    相关文章

      网友评论

        本文标题:Redis 一二事 - 在spring中使用jedis 连接调试

        本文链接:https://www.haomeiwen.com/subject/ktsrpxtx.html