>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 18973 个阅读者 刷新本主题
 * 贴子主题:  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面向对象编程-->面向对象开发方法概述之UML语言(下)
  JavaWeb开发-->JSP中使用JavaBean(Ⅱ)
  JSP与Hibernate开发-->JPA API的高级用法
  Java网络编程-->ServerSocket用法详解
  精通Spring-->CSS过渡和动画
  Vue3开发-->绑定CSS样式
  使用IntelliJ IDEA开发Maven HelloWorld
  几种常见的MAVEN仓库地址
  使用Spring MVC处理404错误的方法
  Spring MVC处理静态资源文件的方式
  Spring Boot 基于 JUnit 5 实现单元测试
  @ModelAttribute注解用法详解
  @SessionAttribute和@SessionAttributes的区别
  Spring MVC控制器类的方法的所支持的方法参数类型
  Redis的漏洞利用,原来大佬都是这样操作的
  Spring Cloud 技术栈及架构一览
  SpringCloud微服务框架搭建
  Java软件架构设计七大原则
  Kafka笔记整理
  spring-boot-plus V1.4.0发布 集成用户角色权限部门管理 - g...
  Spring Boot整合WebSocket及Spring Security实例
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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