使用solrj進行solr查詢

1.構(gòu)建maven工程嘹履,使用spring boot 奖年,添加如下依賴

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
        <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-solr</artifactId>
        </dependency>
        <!-- 替換solrj為solr服務(wù)器的版本 -->
        <dependency>
              <groupId>org.apache.solr</groupId>
              <artifactId>solr-solrj</artifactId>
              <version>6.5.1</version>
        </dependency>
</dependencies>
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
 </build>

2.編寫查詢接口IIndexSearch

public interface IndexSearch {

    /**
     * 根據(jù)id查詢內(nèi)容
     *
     * @param id
     * @return
     * @throws Exception
     * @Title: search
     * @Description:
     * @return: PageData
     */
    ResultEntity search(String id);

    /**
     * @param query
     * @param isHight 是否高亮顯示
     * @return
     */
    ResultEntity execute(SolrQuery query, boolean isHight);

}
  • 接口ISolrIndexSearch
public interface ISolrIndexSearch extends IndexSearch {

    /**
     * 獲取SolrQuery對象
     *
     * @return
     */
    SolrQuery getQuery();

    /**
     * 查詢
     *
     * @param page    封裝分頁
     * @param query   查詢條件
     * @param isHight 是否高亮顯示
     * @return
     */
    ResultEntity search(Page page, SolrQuery query, boolean isHight);

}
  • 抽象實現(xiàn)類AbstractSolrIndexSearch
public abstract class AbstractSolrIndexSearch implements ISolrIndexSearch {

    private static final Logger LOGGER = Logger.getLogger(AbstractSolrIndexSearch.class);

    @Resource(name = "solrClient")
    protected SolrClient solr;

    public abstract SolrQuery setHighlightHandle(SolrQuery query);

    public abstract List<PageData> gethighlighDataList(SolrResponse response);

    private ResultEntity putResponseMessage(List<PageData> datas, int responseTime, Page page) {
        ResultEntity result = new ResultEntity();
        result.setResults(datas);
        result.setResponseTime(responseTime);
        if (page != null) {
            result.setPage(page);
        }
        return result;
    }

    private PageData getSolrDocumentToPageData(SolrDocument document) {
        Iterator<Entry<String, Object>> it = document.iterator();
        PageData pd = new PageData();
        while (it.hasNext()) {
            Entry<String, Object> entry = it.next();
            pd.put(entry.getKey(), entry.getValue());
        }
        return pd;
    }

    private List<PageData> getDataFromSolrDocumentList(SolrDocumentList documents) {
        List<PageData> dataList = Lists.newArrayList();
        Iterator<SolrDocument> it = documents.iterator();
        while (it.hasNext()) {
            SolrDocument document = it.next();
            PageData pds = getSolrDocumentToPageData(document);
            dataList.add(pds);
        }
        return dataList;
    }

    @Override
    public ResultEntity execute(SolrQuery query, boolean isHight) {
        CompletableFuture<ResultEntity> completableFuture = CompletableFuture.supplyAsync(() -> {
            return getDataAysc(query, isHight);
        });
        return completableFuture.join();
    }

    private ResultEntity getDataAysc(SolrQuery query, boolean isHight) {
        ResultEntity result = new ResultEntity();
        QueryResponse response;
        List<PageData> datas;
        try {
            response = solr.query(query);
            int responseTime = response.getQTime();
            SolrDocumentList documents = response.getResults();
            if (isHight) {
                datas = gethighlighDataList(response);
            } else {
                datas = getDataFromSolrDocumentList(documents);
            }
            result = putResponseMessage(datas, responseTime, null);
            LOGGER.info("查詢參數(shù):" + query.getQuery());
        } catch (SolrServerException e) {
        } catch (IOException e) {
        }
        return result;
    }

    @Override
    public ResultEntity search(String id) {
        long start = System.nanoTime();
        SolrQuery query = new SolrQuery();
        query.setQuery(SolrStatementUtils.generateBaseMatchStatement("id", id));
        //ResultEntity result = execute(query);
        ResultEntity result = getDataAysc(query, false);
        long end = System.nanoTime();
        LOGGER.info("異步查詢用時:" + (end - start) + "s");
        return result;
    }

    public ResultEntity search(Page page, SolrQuery query, boolean isHight) {
        long start = System.nanoTime();
        // 從page中獲取傳入的參數(shù)對象pagedata,是一個map數(shù)據(jù)結(jié)構(gòu)
        PageData pd = page.getPd();

        int showCount = 0;
        int currentPage = 0;
        int totalResult = 0;

        if (null != pd.getString("currentPage")) {
            currentPage = Integer.parseInt(pd.getString("currentPage"));
        }
        if (currentPage == 0) {
            currentPage = 1;
        }
        if (null != pd.getString("showCount")) {
            showCount = Integer.parseInt(pd.getString("showCount"));
        } else {
            showCount = Const.SHOW_COUNT;
        }
        query.setStart(showCount * (currentPage - 1)).setRows(showCount);
        if (isHight) {
            query = setHighlightHandle(query);
        }

        ResultEntity result = execute(query, isHight);

        page.setCurrentPage(currentPage);
        page.setShowCount(showCount);
        page.setTotalResult(totalResult);
        page = makePage(page);

        LOGGER.info("查詢參數(shù)--" + pd);
        LOGGER.info("查詢:" + query.toQueryString());
        long end = System.nanoTime();
        LOGGER.info("方法執(zhí)行時間:" + (end - start));
        return result;
    }

    private Page makePage(Page page) {
        page.getTotalPage();
        page.setEntityOrField(true);
        page.getPageStr();
        return page;
    }

}
  • 子類去實現(xiàn)抽象類中的的抽象方法SolrIndexSearch
public class SolrIndexSearch extends AbstractSolrIndexSearch {
    private static final Logger LOGGER = Logger.getLogger(SolrIndexSearch.class);

    @Override
    public SolrQuery getQuery() {
        return new SolrQuery();
    }

    @Override
    public SolrQuery setHighlightHandle(SolrQuery query) {
        return null;
    }

    @Override
    public List<PageData> gethighlighDataList(SolrResponse response) {
        return null;
    }

}

3.編寫索引操作接口IndexeWriter

public interface IndexeWriter {

    ResultEntity delete(List<String> ids);

    ResultEntity delete(String id);

    void deleteAll() throws Exception;
    
    ResultEntity execute(SolrInputDocument document);

    ResultEntity update(PageData document);
    
    ResultEntity updataBatch(List<Object> documents);

    ResultEntity write(List<Object> document);

    ResultEntity write(PageData pd);

    /**
     * 創(chuàng)建索引
     *
     * @throws Exception
     * @Title: createIndex
     * @Description:
     * @return: void
     */
    void createIndex(String beginTime);

    void commit();

    void close();

    /**
     * 提交操作釋放鏈接
     */
    void detory();

}
  • 抽象實現(xiàn)類AbstractSolrIndexWriter
public abstract class AbstractSolrIndexWriter implements IndexeWriter {

    private static final Logger LOGGER = Logger.getLogger(AbstractSolrIndexWriter.class);

    @Resource(name = "concurrentUpdateSolrClient")
    protected SolrClient solr;

    private SolrInputDocument getDocument(PageData pd) {
        SolrInputDocument document = new SolrInputDocument();
        Iterator it = pd.keySet().iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            document.addField(key, pd.get(key));
        }
        return document;
    }

    private List<SolrInputDocument> getDocuments(List<PageData> pds) {
        List<SolrInputDocument> datas = Lists.newArrayList();
        for (PageData pd : pds) {
            SolrInputDocument doc = getDocument(pd);
            datas.add(doc);
        }
        return datas;
    }

    /**
     * Title: delete
     *
     * @param id
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#delete(java.lang.String)
     */
    @Override
    public ResultEntity delete(String id) {
        ResultEntity result = new ResultEntity();
        UpdateResponse response;
        try {
            response = solr.deleteById(id);
            int resopnseTime = response.getQTime();
            result.setResponseTime(resopnseTime);
            commit();
            LOGGER.info("刪除索引:編號--" + id + "用時:" + resopnseTime);
        } catch (SolrServerException e) {

        } catch (IOException e) {

        }
        return result;
    }

    @Override
    public ResultEntity execute(SolrInputDocument document) {
        CompletableFuture<ResultEntity> future = CompletableFuture.supplyAsync(() -> {
            return executeAysc(document);
        });
        return future.join();
    }

    private ResultEntity executeAysc(SolrInputDocument document) {
        ResultEntity result = new ResultEntity();
        UpdateRequest request = new UpdateRequest();
        request.setAction(ACTION.COMMIT, false, false);
        request.add(document);
        UpdateResponse response;
        try {
            response = request.process(solr);
            int responseTime = response.getQTime();
            result.setResponseTime(responseTime);
            LOGGER.info("時間:" + new Date() + "用時:" + responseTime);
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Title: write
     *
     * @param pd
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#write(com.jianong.springbootproject.util.PageData)
     */
    @Override
    public ResultEntity write(PageData pd) {
        ResultEntity result = new ResultEntity();
        SolrInputDocument d = getDocument(pd);
        return execute(d);
    }

    /**
     * Title: write
     *
     * @param document
     * @return
     * @see com.jianong.springbootproject.util.indexes.indexing.IndexeWriter#write(java.util.List)
     */
    @Override
    public ResultEntity write(List<PageData> documents) {
        ResultEntity result = new ResultEntity();
        List<SolrInputDocument> datas = getDocuments(documents);
        int responseTime = 0;
        try {
            UpdateResponse response = solr.add(datas);
            commit();
            responseTime = response.getQTime();
            result.setResponseTime(responseTime);
            LOGGER.info("添加索引:" + documents.size() + "條--" + "用時:" + responseTime);
        } catch (SolrServerException e) {

        } catch (IOException e) {

        }
        return result;
    }

    private SolrInputDocument getUpdateDocument(PageData pd) {
        Iterator<String> it = pd.keySet().iterator();
        SolrInputDocument document = new SolrInputDocument();
        while (it.hasNext()) {
            String key = it.next();
            if (Objects.equals("id", key)) {
                document.setField(key, pd.get("id"));
            } else {
                Map<String, Object> updateMap = Maps.newHashMapWithExpectedSize(1);
                updateMap.put("set", pd.get(key));
                document.setField(key, updateMap);
            }
        }
        return document;
    }

    private List<SolrInputDocument> getUpdateDocuments(List<PageData> documents) {
        List<SolrInputDocument> datas = Lists.newArrayList();
        for (PageData pd : documents) {
            SolrInputDocument doc = getUpdateDocument(pd);
            datas.add(doc);
        }
        return datas;
    }

    /**
     * Title: update
     *
     * @param document
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#update(com.jianong.springbootproject.util.PageData)
     */
    @Override
    public ResultEntity update(PageData document) {
        ResultEntity result = new ResultEntity();
        SolrInputDocument doc = getUpdateDocument(document);
        return execute(doc);
    }

    /**
     * Title: updataBatch
     *
     * @param documents
     * @return
     * @see com.jianong.springbootproject.util.indexes.indexing.IndexeWriter#updataBatch(java.util.List)
     */
    @Override
    public ResultEntity updataBatch(List<PageData> documents) {
        ResultEntity result = new ResultEntity();
        int count = 0;
        if (documents.size() < 20) {
            for (PageData document : documents) {
                result = update(document);
            }
        } else {
            List<SolrInputDocument> datas = getDocuments(documents);
            try {
                UpdateResponse response = solr.add(datas);
                commit();
            } catch (Exception e) {

            }
        }
        return result;
    }

    /**
     * Title: commit
     *
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#commit()
     */
    @Override
    public void commit() {
        try {
            solr.commit();
        } catch (Exception e) {
            LOGGER.error(e);
        }
    }

    /**
     * Title: close
     *
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#close()
     */
    @Override
    public void close() {
        try {
            commit();
            solr.close();
        } catch (Exception e) {
            LOGGER.error(e);
        }
    }

    /**
     * Title: detory
     *
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#detory()
     */
    @Override
    public void detory() {
        commit();
        close();
    }

}
  • 子類實現(xiàn)抽象類中未實現(xiàn)的接口SolrIndexWriter
public class SolrIndexWriter extends AbstractSolrIndexWriter implements IndexeWriter {

    private static final Logger LOGGER = Logger.getLogger(SolrIndexWriter.class);

    /**
     * Title: delete
     * 
     * @param ids
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#delete(java.util.List)
     */
    @Override
    public ResultEntity delete(List<String> ids) {
        return null;
    }

    /**
     * Title: deleteAll
     * 
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#deleteAll()
     */
    @Override
    public void deleteAll() throws Exception {
        UpdateResponse response = solr.deleteByQuery("*:*");
        int responseTime = response.getQTime();
        solr.commit();
    }

    /**
     * Title: createIndex
     * 
     * @param beginTime
     * @throws Exception
     * @see com.jianong.springbootproject.util.indexes.IndexeWriter#createIndex(java.lang.String)
     */
    @Override
    public void createIndex(String beginTime) {

    }

}

4.創(chuàng)建solr查詢和操作索引的工廠烙荷,供外界調(diào)用使用SolrManager

public final class SolrManager {

    @Resource(name = "solrIndexSearch")
    private ISolrIndexSearch solrIndexSearch;

    @Resource(name = "solrIndexWriter")
    private IndexeWriter indexeWriter;

    public SolrQuery getQuery() {
        return solrIndexSearch.getQuery();
    }

    public ResultEntity search(String id) {
        return solrIndexSearch.search(id);
    }

    /**
     * 刪除索引
     *
     * @param ids
     * @throws Exception
     */
    public ResultEntity delete(List<String> ids) {
        return indexeWriter.delete(ids);
    }

    public ResultEntity delete(String id) {
        return indexeWriter.delete(id);
    }

    public void deleteAll() throws Exception {
        indexeWriter.deleteAll();
    }

    public ResultEntity update(PageData document) {
        return indexeWriter.update(document);
    }

    public ResultEntity write(List<PageData> document) {
        return indexeWriter.write(document);
    }

    public ResultEntity write(PageData pd) {
        return indexeWriter.write(pd);
    }

    /**
     * 創(chuàng)建索引
     *
     * @throws Exception
     * @Title: createIndex
     * @Description:
     * @return: void
     */
    public void createIndex(String beginTime) throws Exception {

    }

    /**
     * 查詢
     *
     * @param page
     * @param query
     * @param isHight
     * @return
     * @throws Exception
     */
    public ResultEntity search(Page page, SolrQuery query, boolean isHight) throws Exception {
        return solrIndexSearch.search(page, query, isHight);
    }

}

5.在application.properties中配置solr

solr.url=http://host:port/solr/
solr.collection=collectionname
#是否為集群
solr.cluster=false
solr.timeout=10000
solr.maxconnection=100
solr.queuesize=20
#集群中必須配置zookeeper地址
solr.zookeeper.url=192.168.0.5:2181

6.配置solr系谐,在spring boot啟動中,覆蓋默認的solrClient配置

public class SolrConfig implements EnvironmentAware {

    private static Logger LOGGER = Logger.getLogger(SolrConfig.class);

    private boolean solrCluster = false;

    private SolrConfigBean config;

    @Override
    public void setEnvironment(Environment environment) {
        config = new SolrConfigBean();
        loadProperties(environment);
    }

    private void loadProperties(Environment env) {
        String url = env.getProperty("solr.url");
        int maxConnection = Integer.parseInt(env.getProperty("solr.maxconnection"));
        String collection = env.getProperty("solr.collection");
        int timeout = Integer.parseInt(env.getProperty("solr.timeout"));
        boolean solrIsCluster = Boolean.parseBoolean(env.getProperty("solr.cluster"));

        if (solrIsCluster) {
            String zookeeperUrl = env.getProperty("solr.zookeeper.url");
            if (zookeeperUrl.indexOf(",") != -1) {
                String[] tmp = zookeeperUrl.split(",");
                List<String> zkList = Lists.newArrayList(tmp);
                config.setZookeeperUrl(zkList);
            } else {
                List<String> zkList = Lists.newArrayList(zookeeperUrl);
                config.setZookeeperUrl(zkList);
            }
        }

        config.setTimeout(timeout);
        config.setUrl(url);
        config.setCollection(collection);
        config.setMaxConnection(maxConnection);
        solrCluster = solrIsCluster;

    }

    @Bean
    public SolrClient solrClient() {
        boolean falg = isSolrCluster();
        if (falg) {
            SolrClient client = new CloudSolrClient.Builder().withZkHost(config.getZookeeperUrl()).build();
            ((CloudSolrClient) client).setDefaultCollection(config.getCollection());
            ((CloudSolrClient) client).setParser(new XMLResponseParser());
            ((CloudSolrClient) client).setRequestWriter(new BinaryRequestWriter());
            return client;
        } else {
            SolrClient solr = new HttpSolrClient.Builder(getSolrUrl()).build();
            ((HttpSolrClient) solr).setParser(new XMLResponseParser());
            ((HttpSolrClient) solr).setRequestWriter(new BinaryRequestWriter());
            ((HttpSolrClient) solr).setConnectionTimeout(config.getTimeout());
            ((HttpSolrClient) solr).setSoTimeout(100000);
            ((HttpSolrClient) solr).setDefaultMaxConnectionsPerHost(config.getMaxConnection());
            return solr;
        }
    }

    @Bean
    public ConcurrentUpdateSolrClient concurrentUpdateSolrClient() {
        ConcurrentUpdateSolrClient client =
                new ConcurrentUpdateSolrClient.Builder(getSolrUrl())
                        .withQueueSize(10)
                        .build();
        client.setRequestWriter(new BinaryRequestWriter());
        client.setParser(new XMLResponseParser());
        return client;
    }

    public SolrConfigBean getConfig() {
        return config;
    }

    public String getSolrUrl() {
        StringBuffer sb = new StringBuffer();
        sb.append(config.getUrl()).append(config.getCollection());
        return sb.toString();
    }

    public boolean isSolrCluster() {
        return solrCluster;
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魂奥,一起剝皮案震驚了整個濱河市菠剩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耻煤,老刑警劉巖具壮,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哈蝇,居然都是意外死亡棺妓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門炮赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怜跑,“玉大人,你說我怎么就攤上這事吠勘⌒苑遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵剧防,是天一觀的道長植锉。 經(jīng)常有香客問我,道長诵姜,這世上最難降的妖魔是什么汽煮? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮棚唆,結(jié)果婚禮上暇赤,老公的妹妹穿的比我還像新娘。我一直安慰自己宵凌,他們只是感情好鞋囊,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞎惫,像睡著了一般溜腐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓜喇,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天挺益,我揣著相機與錄音,去河邊找鬼乘寒。 笑死望众,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烂翰,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夯缺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甘耿?” 一聲冷哼從身側(cè)響起踊兜,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佳恬,沒想到半個月后捏境,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡毁葱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年典蝌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头谜。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠澈,靈堂內(nèi)的尸體忽然破棺而出柱告,到底是詐尸還是另有隱情,我是刑警寧澤笑陈,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布际度,位于F島的核電站,受9級特大地震影響涵妥,放射性物質(zhì)發(fā)生泄漏乖菱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一蓬网、第九天 我趴在偏房一處隱蔽的房頂上張望窒所。 院中可真熱鬧,春花似錦帆锋、人聲如沸吵取。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皮官。三九已至,卻和暖如春实辑,著一層夾襖步出監(jiān)牢的瞬間捺氢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工剪撬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摄乒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像缺狠,于是被迫代替她去往敵國和親问慎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挤茄,服務(wù)發(fā)現(xiàn)如叼,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法穷劈,類相關(guān)的語法笼恰,內(nèi)部類的語法,繼承相關(guān)的語法歇终,異常的語法社证,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 今天是個好日子,知道為什么嗎评凝?因為我的架子鼓能考七級了追葡。 雖然我能考七級,但是我特別緊張奕短,我緊張的是我的鼓花是錯的...
    有點意思的嗬閱讀 154評論 0 1
  • 這是一個最好的時代翎碑,它給了你遍地的機會谬返; 這是一個最壞的時代,它給了你莫大的壓力日杈。 作為一個不善言辭的你遣铝,想要有所...
    猴子本是王閱讀 357評論 0 0