版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、開(kāi)發(fā)spring redis應(yīng)用程序開(kāi)源的spring框架是企業(yè)應(yīng)用程序開(kāi)發(fā)的一根中流砥柱,它的用戶 群中包含數(shù)百萬(wàn)的java開(kāi)發(fā)人員。spring data是保護(hù)性開(kāi)源項(xiàng)目,用于 簡(jiǎn)化受spring支持的、使用了數(shù)據(jù)訪問(wèn)技術(shù)的應(yīng)用程序的構(gòu)建,這些數(shù) 據(jù)訪問(wèn)技術(shù)包括非關(guān)系數(shù)據(jù)廂、mapreduce框架和基于云的數(shù)據(jù)服務(wù)等現(xiàn) 代技術(shù)。其中一項(xiàng)技術(shù)是redis (遠(yuǎn)程字典服務(wù)器),它是一個(gè)開(kāi)源的、高 級(jí)的、nosql鍵值數(shù)據(jù)存儲(chǔ),是使用ansic編寫(xiě)的。本文將介紹redis、 它的數(shù)據(jù)模型和數(shù)據(jù)類型,以及它的優(yōu)點(diǎn)。然后將展示如何使用spring data redis構(gòu)建一個(gè)樣例應(yīng)用程序。redis
2、簡(jiǎn)介redis是一種內(nèi)存型數(shù)據(jù)存儲(chǔ),也可以將它寫(xiě)入磁盤(pán)中來(lái)實(shí)現(xiàn)耐久性。 redis可通過(guò)兩種方式來(lái)持久存儲(chǔ)數(shù)據(jù):rdb和aof。rdb持久性按照指 定的間隔對(duì)您的數(shù)據(jù)集執(zhí)行吋間點(diǎn)快照。它不是非常耐久,而且您可能會(huì) 丟失一些數(shù)據(jù),但它非???。aof的持久性要長(zhǎng)得多,而且記錄了服務(wù)器 收到的每個(gè)寫(xiě)入操作。這些寫(xiě)入操作在服務(wù)器啟動(dòng)時(shí)重新執(zhí)行,重新構(gòu)建 原始數(shù)據(jù)集。在查詢r(jià)edis時(shí),將從內(nèi)存中獲取數(shù)據(jù),絕不會(huì)從磁盤(pán)獲取 數(shù)據(jù),redis對(duì)內(nèi)存中存儲(chǔ)的鍵和值執(zhí)行所有操作。redis采用了一種客戶端/服務(wù)器模型,借用該模型來(lái)監(jiān)聽(tīng)tcp端口 并接受命令。redis屮的所有命令都是原子性的,所以您可以從不同
3、的客 戶端處理同一個(gè)鍵,沒(méi)有任何爭(zhēng)用條件。如果您使用的是memcached ( 是memcached+o redis也支持?jǐn)?shù)據(jù)復(fù)制。數(shù)據(jù)模型redis數(shù)據(jù)模型不僅與關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(rdbms)不同,也不同于 任何簡(jiǎn)單的nosql鍵值數(shù)據(jù)存儲(chǔ)。redis數(shù)據(jù)類型類似于編程語(yǔ)言的基 礎(chǔ)數(shù)據(jù)類型,所以開(kāi)發(fā)人員感覺(jué)很口然。每個(gè)數(shù)據(jù)類型都支持適用于其類 型的操作。受支持的數(shù)據(jù)類型包括:字符串列表集合有序集哈希值關(guān)鍵優(yōu)勢(shì)redis的優(yōu)勢(shì)包括它的速度、它對(duì)富數(shù)據(jù)類型的支持、它的操作的原 子性,以及它的通用性: redis非??臁K棵肟蓤?zhí)行約100,000個(gè)set以及約100,000個(gè) get操作。您可
4、以使用redis-benchmark實(shí)用程序在自己的機(jī)器上對(duì)它的性 能進(jìn)行基準(zhǔn)測(cè)試。(redis-benchmark模擬在它發(fā)送總共m個(gè)查詢的同時(shí), n個(gè)客戶端完成的set/get操作。) redis對(duì)大多數(shù)開(kāi)發(fā)人員已知道的大多數(shù)數(shù)據(jù)類型提供了原生支持, 這使得各種問(wèn)題得以輕松解決。經(jīng)驗(yàn)會(huì)告訴您哪個(gè)問(wèn)題最好由何種數(shù)據(jù)類 型來(lái)處理。因?yàn)樗衦edis操作都是原子性的,所以多個(gè)客戶端會(huì)并發(fā)地訪 問(wèn)一個(gè)redis服務(wù)器,獲取相同的更新值。 redis是一個(gè)多效用工具,對(duì)許多用例很有用,這些用例包括緩存、 消息隊(duì)列(redis原生支持發(fā)布/訂閱)、短期應(yīng)用程序數(shù)據(jù)(比如web會(huì) 話、web頁(yè)面命中計(jì)數(shù)
5、)等。開(kāi)始使用redis要開(kāi)始在linux?或unix?上使用redis,可以下載壓縮的tar文件(參見(jiàn)參考資料),解壓它,然后運(yùn)行make命令:wget http:/redis.googlecode.eom/files/redis-2.6.7.tar.gztar xzf redis-2.6.7.tar.gzcd redis-2.6.7make編譯的二進(jìn)制文件現(xiàn)在包含在sre目錄中。使用以下命令運(yùn)行redis: sre/redis-serverredis使用以下輸出進(jìn)行響應(yīng):988 05 jan 14:41:00.230 # warning: no config file specified,
6、 using the default confign order to specify a config file use sre/redis-server /path/to/redis.c onf988 05 jan 14:41:00.231 * max number of open files set to 10032''._'、' '_ ''-._ redis 2.6.7 (00000000/0) 64 bit.、.、v_ ,_';'._(',|) run
7、ning in stand alone modei'-.j-.-'''_.'| port: 6379|/_.' | pid:988' './ -'-'|' _.'_.'|'_.' | http:/redis.io'_.' _'i' _#39;_.'|_.-'_''_.&a
8、mp;#39; _.'' _.'_.-''_-'988 05 jan 14:41:00.238 # server started, redis version 2.6.7988 05 jan 14:41:00.239 * db loaded from disk: 0.000 seconds988 05 jan 14:41:00.239 * the server is now ready to accept connections on port 6379要使用內(nèi)置的客戶端與redis交互,可從命令行 啟動(dòng)該
9、客戶端:src/redis-cli客戶端會(huì)話顯示了 redis對(duì)ping和info命令的響應(yīng):redis :6379> pingpongredis :6379>redis :6379>redis :6379> info# serverredis_version:2.6.7redis_git_shal:00000000redis_git_dirty:oredis_mode:sta ndaloneos:darwin 12.0.0 x86_64arch_bits:64mul
10、tiplexi ng_api:kqueuegcc_versio n:4.2.1process_id:3449run_id:270454ebadl9fbc851194548569efca6ac63e00atcp_port:6379uptimeseconds:95uptimej n_days:0lru_clock:1407736redis數(shù)據(jù)類型示例現(xiàn)在我將簡(jiǎn)要介紹一下受redis支持的數(shù)據(jù)類型,展示一些使用內(nèi)置客戶端的簡(jiǎn)單示例。字符串字符串是redis支持的一種基本數(shù)據(jù)類型。您可以使用set命令設(shè)置 一個(gè)鍵的字符串值,也可以使用get命令獲取一個(gè)鍵的字符串值:redis> set
11、firstname shekharokredis> set last name gulatiokredis> get firstname"shekhar"redis> get lastnamengulatih如果您的鍵的值是整數(shù),那么可使用decr或decrby遞減這些值,使 用incr或incrby遞增它們。這些操作在您希望維護(hù)一些對(duì)象的數(shù)量(比 如網(wǎng)頁(yè)的命中次數(shù))的情形中很有用:redis> incr votes(in teger) 1redis> incr votes(integer) 2redis
12、> incr votes(integer) 3redis> decr votes(integer) 2其他一些操作(包括 append、getrange、mset 和 strlength 也可 用于字符串。,獲取所有redis數(shù)據(jù)類型的完整操作列表的鏈接。列表redis中的列表是一個(gè)有序的字符串集合,您可以向其中添加任意數(shù) 量的(惟一或非惟一)元素。除了向列表添加元素和從中獲取元素的操作 z外,redis還支持對(duì)列表使用取出、推送、范圍和其他一些操作。作為一個(gè)例子,假設(shè)您希望維護(hù)一個(gè)單詞列表(無(wú)論是否惟一),并 獲取您最近添加到系統(tǒng)中的三個(gè)單詞。要將單詞添加到列表中
13、,可以使用lpush命令,它將一個(gè)或多個(gè)值附 加到列表前部:redis> lpush words austerity(in teger) 1redis> lpush words socialism moratorium socialism socialism(integer) 5使用lpush,最近添加的單詞位于列表頂部,以前添加的單詞會(huì)在后 面。可使用lrange命令查看列表中頂部的三個(gè)單詞:redis> lrange words 0 21) "socialism"2) "socialism"3) "
14、moratorium"要獲得列表的長(zhǎng)度,可使用llen命令:redis > llen words(integer) 5要從列表中刪除元素,可使用lrem命令。例如,使用此命令刪除所有 socialism:redis> lrem words 0 socialism(integer) 2要?jiǎng)h除列表,必須刪除words鍵:redis :6379> del words(integer) 1采口要獲取一個(gè)集合的所有成員,可使用smembers命令。作為一個(gè)例子, 假設(shè)我希望維護(hù)所有添加到系統(tǒng)中的惟一單詞的集合(稱為uniqueword
15、s)。 可以看到,因?yàn)槲沂褂昧?set,所以無(wú)法將同一個(gè)單詞(socialism)添加兩 次:redis> sadd uniquewords austerity(in teger) 1redis> sadd unique words pragmatic(in teger) 1redis> sadd uniquewords moratorium(in teger) 1redis> sadd uniquewords socialism(integer) 1redis> sadd uniquewords socialism(int
16、eger) 0要查看uniquewords集合中的所有單詞,可使用smembers命令:redis :6379> smembers uniquewords1) "moratorium"2) "austerity"3) "socialism"4) "pragmatic"也可以在多個(gè)集合上執(zhí)行intersection和union命令。我將創(chuàng)建另一 個(gè)集合,稱為newwords,并向其中添加一些元素:redis 127.0.0.l:6379> sadd newwords au
17、sterity good describe strange(integer) 4為了找出兩個(gè)集合屮的所有共同元素(uniquewords和newwords),我執(zhí)行了 sinter命令:redis :6379> sinter uniquewords newwords1) "austerity"為了合并多個(gè)集合,我使用了 sunion命令??梢钥吹剑瑔卧~austerity僅被添加了一次。redis :6379> sunion uniquewords newwords2) "strange113) &qu
18、ot;describe114) "socialism"5) "pragmatic"6) "good"7) "moratorium"有序集有序集是可基于一個(gè)分?jǐn)?shù)進(jìn)行排序并口僅包含惟一元素的集合。每次 您向集合屮添加一個(gè)值,您都會(huì)提供一個(gè)用于排序的分?jǐn)?shù)。例如,假設(shè)您希望基于單詞的長(zhǎng)度對(duì)一組單詞進(jìn)行排序。使用zadd 命令將一個(gè)元素添加到一個(gè)有序集中,使用語(yǔ)法zadd鍵分?jǐn)?shù)值。使用 zrange命令按分?jǐn)?shù)查看一個(gè)有序集的元素。redis> zadd wordswithlength 9 austerity(i
19、n teger) 1redis> zadd wordswithlength 7 furtive(in teger) 1redis> zadd wordswithlength 5 bigot(integer) 1redis> zrange wordswithlength 0 -11) "bigot*12) "furtive"3) "austerity"要獲得有序集的大小,可使用zcard命令:redis :6379> zcard wordswithlength(intege
20、r) 3哈希值哈希值允許您針對(duì)一個(gè)哈希值存儲(chǔ)一個(gè)鍵值對(duì)。此選項(xiàng)可能對(duì)您希望redis> hset user:l name shekhar(integer) 1redis> hset user:l lastname gulati(integer) 1redis> hget user:lredis> hget user:l name"shekhar"redis> hgetall user:l1) "name"2) “shekhar”3) "lastname"4) &qu
21、ot;gulati"現(xiàn)在,您已經(jīng)了解了 redis數(shù)據(jù)類型,可以嘗試使用spring data redis 框架構(gòu)建一個(gè)應(yīng)用程序,使用redis作為后端數(shù)據(jù)存儲(chǔ)。開(kāi)發(fā)一個(gè)spring redis應(yīng)用程序 redis jdk 6或更高版本 apache maven 3或更高版本 spring tool suitegit使用spring data redis, java開(kāi)發(fā)人員可以編程方式訪問(wèn)redis并執(zhí) 行相應(yīng)操作。spring框架總是推薦一種基于pojo (plain old java object, 簡(jiǎn)單java對(duì)象)的編程模型,高度重視生產(chǎn)力、一致性和可移植性。這 些值會(huì)傳輸?shù)?/p>
22、spring data redis項(xiàng)目。spring data redis 在現(xiàn)有 redis 客戶端庫(kù)(比如 jedis> jredis> redis-protocol和rjc,參見(jiàn)參考資料)上提供了一種抽象。通過(guò)消除與 redis交互所需的樣板代碼,它使得使用redis鍵值數(shù)據(jù)存儲(chǔ)變得很容易, 無(wú)需了解低級(jí)redis apio它還提供了一個(gè)名為redistemplate的泛化的模 板類(類似于 jdbctemplate 或 hibernatetemplate)來(lái)與 redis 進(jìn)行交互。redistemplate是與redis執(zhí)行面向?qū)ο蟮慕换サ闹饕悺K幚韺?duì)象 序列化和類型
23、轉(zhuǎn)換,使得作為開(kāi)發(fā)人員的您在處理對(duì)象時(shí)無(wú)需擔(dān)憂序列化 和數(shù)據(jù)轉(zhuǎn)換。以使用有序集。)例如,單詞astonishing可以是一個(gè)鍵,astounding和staggering是它的值。首先創(chuàng)建一個(gè)簡(jiǎn)單的單詞含義列表。使用redis-server命令啟動(dòng)redis, 使用redis-cli命令啟動(dòng)客戶端。然后,執(zhí)行這個(gè)客戶端會(huì)話中所示的命令: redis> rpush astonishing astouncling(in teger) 1redis> rpush a st on ishing staggering(integer) 2redis> lrang
24、e astonishing 0 -11) "astounding”2) "staggering"您創(chuàng)建了一個(gè)名為astonishing的列表,并將含義astounding和 staggering推送到astonishing列表的末尾。您還使用lrange命令獲取了 astonishing的所有含義。使用spring tool suite創(chuàng)建一個(gè)模板項(xiàng)冃現(xiàn)在必須創(chuàng)建一個(gè)spring模板項(xiàng)目,以便可以將它用于應(yīng)用程序。 打開(kāi) spring tool suite 并轉(zhuǎn)至u file -> new -> spring template proj
25、ect -> simple spring utility project ->o 在系統(tǒng)提示您時(shí)單擊 yes。輸入 dictionary作為項(xiàng)目名稱,提供頂級(jí)包名稱(我的為com.shekhar.dictionary)。 現(xiàn)在您在spring tool suite工作區(qū)中已經(jīng)有了一個(gè)名為dictionary的樣例 項(xiàng)目。使用依賴關(guān)系更新pom.xmldictionary項(xiàng)目沒(méi)有與spring data redis項(xiàng)目相關(guān)的依賴關(guān)系。要添加 它們,可以將您創(chuàng)建的模板項(xiàng)目的pom.xml替換為清單1中的pom.xmlo (這個(gè)文件使用了 spring data redi
26、s項(xiàng)目1.0.2版,這是編寫(xiě)本文時(shí)的最 新版本。)清單1.放置添加spring data redis依賴關(guān)系的pom.xmlxmlns:xsi二"/2001/xmlschema-instance" xsi:schemalocation=hhttp:/mave n.apache. org/pom/4.0.0 http:/mave /xsd/maven4.0.0.xsct>4.0.0com.shekhardictionaryo.o.l-snapshot jardicti onary http:/maven.a
27、utf-8spring-releasespring maven release repository http:/mave n.spri /release javax.i njectjavax.i nject1cglibcglib2.2.2org.spri ngframework.dataspring-data redis1.0.2.releaseorg.spri ngframeworkspri ngtest3.1.2.releasetestjunitjunit 4.8.1test org.apache, maven.pluginsmave nc
28、ompilerplugin1.61.6酉c置 redisconnection factory 和 redistemplateredisconnectionfactory是一個(gè)用來(lái)與redis建立連接的線程安全的 連接供了與redis命令的一對(duì)一映射,而redisconnectionfactory提供了 有助于消除樣板代碼的便捷方法。redisconnectionfactory使不同redis客 戶端api之間的切換就像定義一個(gè)bean那么簡(jiǎn)單。我們將對(duì)樣例應(yīng)用程 序使用jedisconnectionfactory,但也可使用其他任何 connectionfactory 變體。創(chuàng)建一個(gè)local
29、redisconfig類,如清單2所示:清單 2.創(chuàng)建 localredisconfig 類import org.springframework.c on text.a nno tation.bea n;import org.spri ngframework.c on text.a nnotati on .comp onen tscan;import org.springframework.context.armotation.configuration;importorg.springframework.data.redis.c onn ectio n. redisc onn ectio n
30、f actory;importimport org.springframework.data.redis.core.stringredistemplate;import redis.die nts.jedis jedispoolc on fig;configurati oncomp onen tscan(basepackages=,com.shekhar.dictionary.daon)public class localredisconfig beanpublic redisconnectionfactory jedisconnectionfactory()jedispoolconfig p
31、oolconfig = new jedispoolconfig(); poolconfig.maxactive = 10;poolc on fig.maxldle = 5;poolconfig.minldle = 1;poolconfig.teston borrow = true;poolconfig.testonreturn 二 true;poolc on fig.testwhileldle = true;jedisc onn ectionfactory jedisc onn ectio nf actory = newjedisco nn ectio nf actory(poolc on f
32、ig);return jedisco nn ecti onf actory;beanpublic stringredistemplate redistemplate()return redistemplate;localredisconfig 定義了 jedisconnectionfactory 和springredistemplatebean。springredistemplate 是 redistemplate 的一4*處 理字符串的特殊版本??墒褂靡粋€(gè)junit測(cè)試來(lái)測(cè)試配置,如清單3所示:清單3測(cè)試配置import javax.i njectn ject;import org.juni
33、t.test;import org.junit.rurrner.runwith;importorg.spri ngframework.data.redis.c onn ectio n.jedisedisc onn ectio nf actory;impo rt org.springframework.data.redis.core.stringredistemplate;import org.springframework.test.context.contextconfiguration;importorg.spri ngframework.test.c on text.ju nit4.sp
34、ri ngjun it4classr un ner;c on textco n figurati on (classes = localredisc on fig.class)runwith(springjunit4classrunner.class)public class localredisconfigtest lnjectlnjectprivate stringredistemplate redistemplate;testpublic void testjedisconnectionfactory() assertnotnull(jedisc onn ectio n factory)
35、;testpublic void testredistemplatef) assertnotnull(redistemplate);編寫(xiě) dictionarydao現(xiàn)在創(chuàng)建一個(gè)dictionarydao類,如清單4所示:清單4.創(chuàng)建dictionarydao類import org.springframework.data.redis.core.stringredistemplate;(©repositorypublic class dictionarydao private static final string all_unique_words = "all-unique
36、-words"private stringredistemplate redistemplate;lnject this.redistemplate = redistemplate;public long addwordwithltsmeaningtodictionary(string word, string meaning) long index = redistemplate.opsforlist().rightpush(word? meaning);return index;您可以使用dictionarydao執(zhí)行redis中的操作。從清單4中可以看 到,您將redistem
37、plate (spring data redis項(xiàng)目中的核心類)注入到了 dictionarydao 中。清單 4 中的 stringredistemplate 是 redistemplate 的一 個(gè)處理字符串?dāng)?shù)據(jù)類型的子類。redistemplate 提供了鍵類型操作,比如 valueoperations、listoperations、setoperations> hashoperations 和 zsetoperationso 清單 4 使用 listoperations將一個(gè)新單詞存儲(chǔ)在redis數(shù)據(jù)存儲(chǔ)中o rightpush()操作將 該單詞和它的含義添加到列表末尾處。dic
38、tionarydao.addwordwithltsmea ningtodictionary()方法返回添加至 lj 列表中的元素的索引。案例:清單 5.測(cè)試 dictionarydao.add word withltsmeaningtodictionary()方法 import static org.hamcrest.corematchers.equalto;import static org.hamcrest.corematchers.is;import static org.hamcrest.corematchers.notnullvalue;import static org.junit
39、.assert.assertequals;import static org.junit.assert.assertthat;import static org.junit.matchersjunitmatchers.hasitems;import java.util.list;import java.util.set;import javax.i njectn ject;import org.junit.after;import org.junitgnore;import org.junit.test;import org.junit.rurrner.runwith;import org.s
40、pringframework.data.redis.core.stringredistemplate;importorg.spri ngframework.test.c on text.c on textc on figurati on;importorg.spri ngframework.test.c on text.ju nit4.spri ngjun it4classr unn er;import com.shekhar.dictionary.config.localredisconfig;con textc on figurati on( classes = localredisc o
41、n fig.class )runwith(springjunit4classrunner.class)public class dictionarydaotest lnjectprivate stringredistemplate redistemplate;testpublic void testaddwordwithltsmeaningtodictionary() string meaning = "to move forward with a bounding, drooping motion.“;long index = dictionarydao.addwordwithlt
42、smeaningtodictionary(nlollop",meani ng);assertthat(index, is(notnullvalue();assertthat(index? isfequalto(ll);第一次運(yùn)行此測(cè)試時(shí),它通過(guò)了,這個(gè)單詞被存儲(chǔ)到了 redis中。但 是,如果隨后再次運(yùn)行該測(cè)試,測(cè)試會(huì)失敗,因?yàn)閞edis再次添加了相同 的含義,并返回2作為它的索引。所以,在每次運(yùn)行之后必須清理redis數(shù) 據(jù)存儲(chǔ),這可以使用flushaii()或flushdb服務(wù)器命令來(lái)完成。flushaiio命令從數(shù)據(jù)庫(kù)中刪除所有鍵,而flushdb()僅刪除當(dāng)前數(shù)據(jù)庫(kù) 中的鍵。
43、清單6給出了己修改的測(cè)試:清單 6.已修改的 dictionarydao.addwordwithltsmeaningtodictionary() 測(cè)試contextconfiguration(classes = localredisc on fig.class )runwith(springjunit4classrunner.class)private dictionarydao dictionarydao;lnjectprivate stringredistemplate redistemplate; afterpublic void teardown() redistemplate.get
44、co nn ectio nfactoy()getc onn ectio n()flushdb();testpublic void testaddwordwithltsmeaningtodictionary() string meaning = "to move forward with a bounding, drooping motion."long index = dictionarydao.addwordwithltsmeaningtodictionary(,lollopn,meaning);assertthat(index, is(notnullvalue();te
45、stpublic void shouldaddmeaningtoawordlfltexists() long index = dictionarydao.addwordwithltsmeaningtodictionaryc'lollop","to move forward with a bounding, drooping motion."); assertthat(index, is(notnullvalue();assertthat(index, is(equalto(ll); index = dictionarydao.add word withltsmeaningtodictionary("lollop","to hang loosely; droop; dangle.");assertthat(index? is(equalto(2l);現(xiàn)在您已經(jīng)擁有將一個(gè)單詞存儲(chǔ)到redis數(shù)據(jù)存儲(chǔ)中的功能,下一步 是實(shí)現(xiàn)獲取
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考生物一輪復(fù)習(xí):細(xì)胞中的糖類和脂質(zhì)
- 正規(guī)勞動(dòng)合同(范本)
- 職業(yè)女農(nóng)民培訓(xùn)心得體會(huì)5篇
- 有價(jià)證券買(mǎi)入委托書(shū)(3篇)
- 24.4 相似三角形判定(第5課時(shí))同步練習(xí)
- 工會(huì)先進(jìn)女職工事跡材料
- 研討會(huì)主持詞結(jié)束語(yǔ)(22篇)
- 拒絕校園欺凌廣播稿范文600字(30篇)
- 師德教育個(gè)人自查報(bào)告范文(3篇)
- 新教材高考地理二輪專題復(fù)習(xí)單元綜合提升練8工業(yè)生產(chǎn)與地區(qū)產(chǎn)業(yè)結(jié)構(gòu)變化含答案
- 灌漿材料性能測(cè)試方案
- 競(jìng)聘團(tuán)委書(shū)記演講.doc
- 煤礦安全數(shù)字化智能巡檢系統(tǒng)
- 廣告宣傳費(fèi)用巧籌劃三個(gè)方案
- 模板支架及腳手架安全使用培訓(xùn)課件
- 企業(yè)財(cái)產(chǎn)保險(xiǎn)投保單
- 柿子品種介紹PPT課件
- 內(nèi)鏡清潔消毒登記表格模板
- 天然氣脫硫(課堂運(yùn)用)
- 幼兒園教師師德師風(fēng)考核表(共2頁(yè))
- 城鎮(zhèn)職工醫(yī)療保險(xiǎn)運(yùn)行中的問(wèn)題分析及措施
評(píng)論
0/150
提交評(píng)論