>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 18899 个阅读者 刷新本主题
 * 贴子主题:  Redis solr一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis - 风间影月 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2020-06-16 02:42:30     消息  查看  搜索  好友  邮件  复制  引用

      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/

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                       下载后上传(chuang)到你的linux上

如下我是放到这个文件夹下,并且解压至此

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              名字太复杂了啦~!砸门改一个!

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,入正题

在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点

cd solr5 进入后

如此运行:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              启动solr ...

启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)

     那么8983就是搜索服务的端口啦

看到木有,启动成功了...  这logo我也就不说了,我当初的第一反应就是华为

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              这边是一些版本信息:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,以上是jetty,简单吧

那么有的童鞋喜欢用tomcat部署咋办捏

好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  把tomcat7解压到这个目录并且重命名

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              [图片上传中。。。(10)]

     在solr5/server/lib/ext 目录中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              所有的jar包添加到solr工程中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  记住此目录

修改刚刚放进tomcat7中的solr的web.xml

放开注释,并且替换第二行白色的部分为刚刚的目录

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  :wq保存退出

         拷贝日志文件到tomcat7下solr的classes中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              最后一步:

启动tomcat

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              日志:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              截图留念:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              版本信息,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/

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                       下载后上传(chuang)到你的linux上

如下我是放到这个文件夹下,并且解压至此

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              名字太复杂了啦~!砸门改一个!

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,入正题

在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点

cd solr5 进入后

如此运行:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              启动solr ...

启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)

     那么8983就是搜索服务的端口啦

看到木有,启动成功了...  这logo我也就不说了,我当初的第一反应就是华为

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              这边是一些版本信息:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,以上是jetty,简单吧

那么有的童鞋喜欢用tomcat部署咋办捏

好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  把tomcat7解压到这个目录并且重命名

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              [图片上传中。。。(10)]

     在solr5/server/lib/ext 目录中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              所有的jar包添加到solr工程中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  记住此目录

修改刚刚放进tomcat7中的solr的web.xml

放开注释,并且替换第二行白色的部分为刚刚的目录

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  :wq保存退出

         拷贝日志文件到tomcat7下solr的classes中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              最后一步:

启动tomcat

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              日志:

[图片上传中。。。(17)]

     截图留念:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              版本信息,tomcat7噢~

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              接下来的文章会对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

[url=link.jianshu.com?t=http://shang.qq.com/wpa/qunwpa?idkey=e9d4098b1ca9fb194762a46d6200f9afdc1ecf4c3af2282017e63b86997f7e60][/url]

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     微信公众号:BeJavaGod

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          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/

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                       下载后上传(chuang)到你的linux上

如下我是放到这个文件夹下,并且解压至此

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              名字太复杂了啦~!砸门改一个!

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,入正题

在solr5以后,自带了jetty作为服务器,可以自行启动,自带的要比曾经的solr4使用tomcat方便一点

cd solr5 进入后

如此运行:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              启动solr ...

启动成功,happy searching!(为何我突然想到了HHKB? 跪求送一把啊~~~)

     那么8983就是搜索服务的端口啦

看到木有,启动成功了...  这logo我也就不说了,我当初的第一反应就是华为

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              这边是一些版本信息:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              好,以上是jetty,简单吧

那么有的童鞋喜欢用tomcat部署咋办捏

好就是tomcat吧,虽然略嫌麻烦,既然官方使用jetty,那肯定自然是有他的理由的喽

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  把tomcat7解压到这个目录并且重命名

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              将solr5\server\solr-webapp目录下的webapp文件夹拷贝到tomcat7下webapps下,并改名为solr

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              在solr5/server/lib/ext 目录中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              所有的jar包添加到solr工程中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  记住此目录

修改刚刚放进tomcat7中的solr的web.xml

放开注释,并且替换第二行白色的部分为刚刚的目录

                    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                  :wq保存退出

         拷贝日志文件到tomcat7下solr的classes中

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              最后一步:

启动tomcat

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              日志:

[图片上传中。。。(17)]

     截图留念:

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

              版本信息,tomcat7噢~

[图片上传中。。。(19)]

     接下来的文章会对solr集群,zookeeper等做介绍以及详细讲解,欢迎关注并订阅我的头条号以及微信公众号,一起学习一起进步吧~


----------------------------
原文链接:https://www.jianshu.com/p/3c4ca9f69445

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-11-24 20:29:17 重新编辑]
  Java面向对象编程-->集合(上)
  JavaWeb开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->安全网络通信
  精通Spring-->通过Vuex进行状态管理
  Vue3开发-->虚拟DOM和render()函数
  Maven 安装及环境配置
  Spring Boot 入门,用 Spring Boot 写第一个 HelloWorld 程序
  从零开始手写 spring ioc 框架,深入学习 spring 源码
  git 常用指令总结
  说一下Spring @Autowired 注解自动注入流程
  Spring 5 webflux响应式编程 - 但时间也偷换概念
  Spring 5 webflux响应式编程 - 但时间也偷换概念
  Spring AOP的基本概念和注解
  Spring MVC SSE服务器端推送
  重新理解响应式编程
  Spring MVC关于分页的简单实现
  从零搭建一个基于 ELK 的日志、指标收集与监控系统
  Dubbo源码解析之SPI:扩展类的加载过程
  springboot —— 多数据源
  Java-CORBA
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。