




免費預覽已結束,剩余26頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1 Redis簡介Redis是Remote Dictionary Server的縮寫,是一種高性能的Key-value存儲系統(tǒng),類似于Memcached,不過Redis支持存儲的value類型更多,包括String,List,Hash,Set和Sorted Set,以及對這些數據結構的操作支持。和Memcached一樣,為了保證效率,Redis的數據都緩存在內存中,但是Redis會周期性地把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave同步。2 安裝$ wget http:/download.redis.io/releases/redis-3.0.0.tar.gz$ tar xzf redis-3.0.0.tar.gz$ cp -r redis-3.0.0 /usr/local/redis$ cd /usr/local/redis$ make# 編譯好的文件將被復制到/usr/local/bin下#redis-server:Redis 服務器的 daemon啟動程序#redis-cli:Redis 命令行操作工具#redis-benchmark:Redis 性能測試工具,測試 Redis 在你的系統(tǒng)及你的配置下的讀寫性能$redis-benchmark -n 100000 c 50 #模擬同時由50個客戶端發(fā)送100000 個SETs/GETs 查詢#redis-check-aof:更新日志檢查#redis-check-dump:本地數據庫檢查2.1 配置修改配置文件,并將其復制到etc 目錄下$cp redis.conf /etc/redis.conf配置文件基本說明daemonize: #是否以后臺守護進程方式運行pidfile: #pid 文件位置port: #監(jiān)聽的端口號timeout: #請求超時時間loglevel: #log 信息級別,總共支持四個級別:debug、verbose、notice、warning,默認為verboselogfile: #默認為標準輸出(stdout),如果配置為守護進程方式運行,而這里又配置為日志記錄方式為標準輸出,則日志將會發(fā)送給/dev/nulldatabases: #開啟數據庫的數量。使用“SELECT 庫ID”方式切換操作各個數據庫save * *: #保存快照的頻率,第一個*表示多長時間,第二個*表示執(zhí)行多少次寫操作。在一定時間內執(zhí)行一定數量的寫操作時,自動保存快照??稍O置多個條件。rdbcompression:#保存快照是否使用壓縮dbfilename: #數據快照文件名(只是文件名,不包括目錄)。默認值為dump.rdbdir: #數據快照的保存目錄(這個是目錄)requirepass: #設置Redis 連接密碼,如果配置了連接密碼,客戶端在連接Redis 時需要通過AUTH 命令提供密碼,默認關閉。2.2 啟動redis$redis-server /etc/redis.conf2.3 關閉redis$ redis-cli shutdown#關閉指定端口的redis-server$redis-cli -p 6379 shutdown2.4 Redis主從復制只需要修改slave的配置redis.conf修改如下內容:Port 6380slaveof 25 6379 # slaveof master的ip master的端口主從測試:在master set:6379 set testslave hahaOK在slave get:6380 get testslavehaha3 簡單測試$redis-server /etc/redis.conf$ redis-cli -p 6379:6379 set foo barOK:6379 get foobar4 Redis數據類型4.1 String類型及操作1) Set設置key對應的值為string類型的value例如,添加一個name=test的鍵值對,可以這樣做::6379 set name testOK2) Setnx設置key對應的值為string類型的value。如果key已經存在,則返回0,nx是not exist的意思。例如,添加一個name=test_new的鍵值對,可以這樣做::6379 get name“test”:6379 setnx name test_new(integer) 0:6379 get name“test”3) Setex設置key對應的值為string類型的value,并指定此鍵值對應的有效期。例如,添加一個sex=male的鍵值對,并指定其有效期是10秒,可以這樣做::6379 setex sex 10 male:6379 get sex“male”:6379 get sex(nil)最后一次調用的時間已超過10秒范圍,因此無法取得sex鍵對應的值。4) Setrange設置指定key的value值的子字符串。例如,將Test的126郵箱替換為gmail郵箱,可以這樣做::6379 get name“T”:6379 setrange name 8 “T”其中8是指從下標為8(包含8)的字符開始替換。5) mset一次設置多個key的值,成功后返回OK,表示所有的值都設置完畢;失敗則返回0,表示沒有任何值被設置。:6379 mset key1 Test1 key2 Test2OK:6379 get key1“Test1”:6379 get key2“Test2”6) msetnx一次設置多個key的值,成功后返回OK,表示所有的值都設置完畢;失敗則返回0,表示沒有任何值被設置,但是不會覆蓋已經存在的key。:6379 get key1“Test1”:6379 get key2“Test2”:6379 msetnx key2 Test2_new key3 Test3(integer) 0:6379 get key2“Test2”:6379 get key3(nil)可以看出,如果這條命令返回0,那么內部的操作都會回滾,都不會被執(zhí)行。7) Get獲取key對應的string值,如果key不存在則返回nil。例如,獲取一個庫中存在的鍵name::6379 get name“Test”獲取一個庫中不存在的鍵name1,那么會返回一個nil以表示無此鍵值對。:6379 get name1(nil)8) getset設置key的值,并返回key的舊值。:6379 get name“Test”:6379 getset name Test_new“Test”:6379 get name“Test_new”如果key不存在會出現什么狀況呢?:6379 getset name1 haha (nil)9) getrange獲取指定key的value值的子字符串。:6379 get name“T”:6379 getrange name 0 6“Test12”字符串左面下標是從0開始的。:6379 getrange name -7 -1“126.com”字符串右面下標是從-1開始的。:6379 getrange name 7 100“6.com”當下標超出字符串長度時,將默認為是同方向的最大下標。10) mget一次獲取多個key的值,如果對應的key不存在,則對應返回nil。:6379 mget key1 key2 key31) “Test1”2) “Test2”3) (nil)11) incr對key的值進行加加操作,并返回新的值。注意:incr不是int的value會返回錯誤信息,incr一個不存在的key,則將該key設置為1。:6379 set age 20OK:6379 incr age(integer) 21:6379 get age“21”12) incrby同incr類似,與指定值相加,key不存在的時候會設置key,并認為原來的value為0。:6379 get age“21”:6379 incrby age 5(integer) 26:6379 get age“26”13) decr對key的值進行減操作,decr一個不存在的key,則設置該key為-1。:6379 get age“26”:6379 decr age(integer) 25:6379 get age“25”14) decrby同decr類似,與指定值相減。:6379 get age“25”:6379 decrby age 5“20”Decrby完全是為了增加代碼的可讀性,完全可以通過incrby一個負值來實現同樣的效果;:6379 get age“20”:6379 incrby age -5(integer) 1515) append給指定key的字符串值追加value,返回新字符串值的長度,例如,向name的值追加一個126.com的字符串,那么可以這樣做::6379 append name 126.com(integer) 15:6379 get name“T”16) strlen取指定key的value值的長度。:6379 get name“T”:6379 strlen name(integer) 12:6379 get age“15”:6379 strlen age(integer) 24.2 hashRedis的hash是一個string類型的field和value的映射表。1) hset設置hash field為指定值,如果key不存在,則先創(chuàng)建。:6379 hset myhash field1 Hello(integer) 12) hsetnx設置hash field為指定值,如果key不存在,則先創(chuàng)建。如果field已經存在,則返回0值。nx是not exist的意思。:6379 hsetnx myhash field Hello(integer) 1:6379 hsetnx myhash field Hello(integer) 03) hmset同時設置hash的多個field。:6379 hmset myhash field1 Hello field2 WorldOK4) hget獲取指定的hash field。:6379 hget myhash field1“Hello”:6379 hget myhash field2“World”5) hmget獲取全部指定的hash field。:6379 hget myhash field1 field2 field31) “Hello”2) “World”3) (nil)6) hincrby為指定的hash field加上給定值。:6379 hset myhash field3 20(integer) 1:6379 hget myhash field3“20”:6379 hincrby myhash field3 -8(integer) 12:6379 hget myhash field3“12”7) hexists測試指定field是否存在。:6379 hexists myhash field1 (integer) 1:6379 hexists myhash field9 (integer) 08) hlen返回指定hash的field數量。:6379 hlen myhash(integer) 4可以看到,myhash庫中有4個field。9) hdel返回指定hash的field數量。:6379 hlen myhash(integer) 4:6379 hdel myhash field1(integer) 1:6379 hlen myhash(integer) 310) hkeys返回hash的所有key。:6379 hkeys myhash1) “key1”2) “key2”3) “key3”11) hvals返回hash的所有value。:6379 hvals myhash1) “World”2) “Hello”3) “12”12) hgetall獲取某個hash中全部的field及value。:6379 hgetall myhash1) “key1”2) “World”3) “key2”4) “Hello”5) “key3”6) “12”4.3 List1) lpush在與key對應的list的頭部添加字符串元素。:6379 lpush mylist world(integer) 1:6379 lpush mylist hello(integer) 2:6379 lrange mylist 0 -11) “hello”2) “world”此處先插入一個world,然后在world的頭部插入一個hello。其中l(wèi)range指令用于獲取mylist的內容。2) rpush在與key對應的list的尾部添加字符串元素。:6379 rpush mylist2 hello(integer) 1:6379 rpush mylist2 world(integer) 2:6379 lrange mylist2 0 -11) “hello”2) “world”3) linsert在與key對應的list的特定位置(之前或之后)添加字符串元素。:6379 rpush mylist3 hello(integer) 1:6379 rpush mylist3 world(integer) 2:6379 linsert mylist3 before world there(integer) 3:6379 lrange mylist3 0 -11) “hello”2) “there”3) “world”先插入一個hello,然后在hello的尾部插入一個world,然后又在world的前面插入了there。4) lset設置list中指定下標的元素值(從0開始):6379 rpush mylist4 one(integer) 1:6379 rpush mylist4 two(integer) 2:6379 rpush mylist4 three(integer) 3:6379 lset mylist4 0 fourOK:6379 lset mylist4 -2 fiveOK:6379 lrange mylist4 0 -11) “four”2) “five”3) “three”此處依次插入了one,two,three,然后將下標為0的值設置為four,再將下標為-2的值設置為five。5) lrem從與key對應的list中刪除count個和value相同的元素,使用count查詢。:6379 rpush mylist5 hello(integer) 1:6379 rpush mylist5 hello(integer) 2:6379 rpush mylist5 foo(integer) 3:6379 rpush mylist5 hello(integer) 4:6379 lrem mylist5 2 hello(integer) 2:6379 lrange mylist5 0 -11) “foo”2) “hello”count rpush mylist6 hello(integer) 1:6379 rpush mylist6 hello(integer) 2:6379 rpush mylist6 foo(integer) 3:6379 rpush mylist6 hello(integer) 4:6379 lrem mylist6 -2 hello(integer) 2:6379 lrange mylist6 0 -11) “hello”2) “foo”count = 0 時,刪除全部,具體代碼如下::6379 rpush mylist7 hello(integer) 1:6379 rpush mylist7 hello(integer) 2:6379 rpush mylist7 foo(integer) 3:6379 rpush mylist7 hello(integer) 4:6379 lrem mylist7 0 hello(integer) 2:6379 lrange mylist7 0 -11) “foo”6) ltrim保留指定key值范圍內的數據::6379 rpush mylist8 one(integer) 1:6379 rpush mylist8 two(integer) 2:6379 rpush mylist8 three(integer) 3:6379 rpush mylist8 four(integer) 4:6379 ltrim mylist8 1 -1(integer) 2:6379 lrange mylist8 0 -11) “two”2) “three”3) “four”7) lpop從list的頭部刪除元素,并返回刪除元素的內容::6379 lrange mylist 0 -11) “hello”2) “world”:6379 lpop mylist“hello”:6379 lrange mylist 0 -11) “world”8) rpop從list的尾部刪除元素,并返回刪除元素的內容::6379 lrange mylist2 0 -11) “hello”2) “world”:6379 rpop mylist2“world”:6379 lrange mylist2 0 -11) “hello”9) rpoplpush從第一個list的尾部移除元素并將其添加到第二個list的頭部,最后返回被移除的元素值,整個操作是原子性的。如果第一個list為空或者不存在,則返回nil。:6379 lrange mylist5 0 -11) “three”2) “foo”2) “hello”:6379 lrange mylist6 0 -11) “hello”2) “foo”:6379 rpoplpush mylist5 mylist6“hello”:6379 lrange mylist5 0 -11) “three”2) “foo”:6379 lrange mylist6 0 -11) “hello”2) “hello”3) “foo”10) lindex返回名稱為key的list中index位置的元素。:6379 lrange mylist5 0 -11) “three”2) “foo”:6379 lindex mylist5 01) “three”:6379 lindex mylist5 11) “foo”11) llen返回與key對應的list的長度。:6379 llen mylist5(integer) 24.4 SetRedis的set是string類型的無序集合,set元素最多可以包含232個元素。關于set集合類型除了基本的添加,刪除操作,其他操作還包括對集合取并集(union)、交集(intersection)、差集(difference)。1) sadd向名稱為key的set中添加元素。:6379 sadd myset hello(integer) 1:6379 sadd myset world(integer) 1:6379 sadd myset world(integer) 0:6379 smembers myset1) “world”2) “hello”此處向myset中添加了3個元素,但由于第3個元素跟第2個元素相同,所以第3個元素沒有添加成功。最后用smembers來查看myset中的所有元素。2) srem刪除名稱為key的set中的元素member。:6379 sadd myset2 one(integer) 1:6379 sadd myset2 two(integer) 1:6379 sadd myset2 three(integer) 1:6379 srem myset2 one(integer) 1:6379 srem myset2 four(integer) 0:6379 smembers myset21) “three”2) “two”此處向myset2中添加了3個元素后,再調用srem來刪除one和four,但由于元素中沒有four,所以srem命令執(zhí)行失敗。3) spop隨機返回并刪除名稱為key的set中的一個元素。:6379 smembers myset21) “two”2) “three”3) “one”:6379 spop myset2three:6379 smembers myset21) “two”2) “one”4) sdiff返回所有給定key與第一個key的差集。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sdiff myset2 myset31) one可以看出,myset2和myset3中不同的元素只是“one”所以只有one出現在查詢結果中。也可以將myset2和myset3交換順序后再查看結果。:6379 sdiff myset3 myset21) three5) sdiffstore返回所有給定key與第一個key的差集,并將結果保存為另一個key。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sdiffstore myset4 myset2 myset3(integer) 1:6379 smembers myset41) “one”6) sinter返回所有給定key的交集。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sinter myset2 myset31) “two”7) sinterstore返回所有給定key的交集,并將結果存為另一個key。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sinterstore myset5 myset2 myset3(integer) 1:6379 smembers myset51) “two”8) sunion返回所有給定key的并集。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sunion myset2 myset31) “two”2) “three”3) “one”9) sunionstore返回所有給定key的并集,并將結果保存為另一個key。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 sunionstore myset6 myset2 myset3(integer) 3:6379 smembers myset61) “two”2) “three”3) “one”10) smove從第一個key對應的set中移除member并將其添加到第二個對應的set中。:6379 smembers myset21) “two”2) “one”:6379 smembers myset31) “two”2) “three”:6379 smove myset2 myset7 one(integer) 1:6379 smembers myset71) “one”:6379 smembers myset21) “two”可以看出myset2的成員one被移到myset7中了。11) scard返回名稱為key的set的元素個數。:6379 scard myset2(integer) 112) sismember測試member是否為名稱為key的set中的元素。:6379 smembers myset21) “two”:6379 sismember myset2 two(integer) 1:6379 sismember myset2 one(integer) 013) srandmember隨機返回名稱為key的set中的一個元素,但不刪除該元素。:6379 smembers myset31) “two”2) “one”:6379 srandmember myset3“two”:6379 srandmember myset3“one”4.5 Sorted sets和set一樣,sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個double類型的score。1) zadd向名稱為key的zset中添加元素(member),并使用score指令進行排序。如果該元素已經存在,則更新該元素的順序。:6379 zadd myzset 1 one(integer) 1:6379 zadd myzset 2 two(integer) 1:6379 zadd myzset 3 two(integer) 0:6379 zrange myzset 0 -1 withscores1) “one”2) “1”3) “two”2) “3”此處向myzset中添加了one和two成員,并且two被設置了2次,那么將以最后一次的設置為準,最后將所有元素按順序顯示出來。2) zrem刪除名稱為key的zset中的元素(member)。:6379 zadd myzset 0 -1 withscores1) “one”2) “1”3) “two”2) “3”:6379 zrem myzset two(integer) 1:6379 zrange myzset 0 -1 withscores1) “one”2) “1”3) zincrby如果在名稱為key的zset中已經存在元素(member),則該元素的score增加(increment);否則向集合中添加該元素,其score的值為increment。:6379 zadd myzset2 1 one(integer) 1:6379 zadd myzset2 2 two(integer) 1:6379 zincrby myzset2 2 one“3”:6379 zrange myzset2 0 -1 withscores1) “two”2) “2”3) “one”4) “1”這里將元素one的score從1增加了2,即增加到了3。4) zrank返回名稱為key的zset中member的排名(按score從小到大排序),排名以0為底,也就是說,score值最小的成員排名為0。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zrank myzset3 two(integer) 15) zrevrank返回名稱為key的zset中member的排名(按score從大到小排序)。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zrevrank myzset3 two(integer) 26) zrevrange在名稱為key的zset中,檢索從開始到結束的所有元素,按score從大到小進行排序,再取出全部元素。:6379 zrevrange myzset3 0 -1 withscores1) “five”2) “5”3) “three”4) “3”5) “two”6) “2”7) “one”8) “1”7) zrangebyscore返回集合中score在給定區(qū)間的元素。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zrangebyscore myzset3 2 3 withscores1) “two”2) “2”3) “three”4) “3”8) zcount返回集合中score在給定區(qū)間的數量。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zcount myzset3 2 3(integer) 29) zcard返回集合中元素的個數。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zcard myzset3(integer) 410) zscore返回給定元素對應的score。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zscore myzset3 two“2”11) zremrangebyrank刪除集合中排名在給定區(qū)間的元素。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”7) “five”8) “5”:6379 zremrangebyrank myzset3 3 3(integer) 1:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”12) zremrangebyscore刪除集合中排名在給定區(qū)間的元素。:6379 zrange myzset3 0 -1 withscores1) “one”2) “1”3) “two”4) “2”5) “three”6) “3”:6379 zremrangebyscore myzset3 1 2(integer) 1:6379 zrange myzset3 0 -1 withscores1) “three”2) “3”5 持久化通常Redis將數據存儲在內存中或虛擬內存中,它是通過以下兩種方式實現對數據的持久化。在實際運營中,注意備份持久化文件以防止數據丟失。5.1 快照方式:(默認持久化方式)這種方式就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名為dump.rdb??蛻舳艘部梢允褂胹ave 或者bgsave 命令通知redis 做一次快照持久化。save 操作是在主線程中保存快照的,由于redis 是用一個主線程來處理所有客戶端的請求,這種方式會阻塞所有客戶端請求。所以不推薦使用。另一點需要注意的是,每次快照持久化都是將內存數據完整寫入到磁盤一次,并不是增量的只同步增量數據。如果數據量大的話,寫操作會比較多,必然會引起大量的磁盤IO 操作,可能會嚴重影響性能。注意:由于快照方式是在一定間隔時間做一次的,所以如果redis 意外當機的話,就會丟失最后一次快照后的所有數據修改。 數據快照配置:save 900 1save 300 10save 60 10000以上在redis.conf中的配置指出在多長時間內,有多少次更新操作,就將數據同步到數據文件,這個可以多個條件配合。上面的含義是900秒后有一個key發(fā)生改變就執(zhí)行save,300秒后有10個key發(fā)生改變執(zhí)行save,60秒有10000個key發(fā)生改變執(zhí)行save。5.2 日志追加方式這種方式redis 會將每一個收到的寫命令都通過write 函數追加到文件中(默認appendonly.aof)。當redis 重啟時會通過重新執(zhí)行文件中保存的寫命令來在內存中重建整個數據庫的內容。當然由于操作系統(tǒng)會在內核中緩存write做的修改,所以可能不是立即寫到磁盤上。這樣的持久化還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis 我們想要通過fsync 函數強制操作系統(tǒng)寫入到磁盤的時機。有三種方式如下(默認是:每秒fsync 一次)appendonly yes /啟用日志追加持久化方式#appendfsync always /每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用appendfsync everysec /每秒鐘強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦#appendfsync no /完全依賴操作系統(tǒng),性能最好,持久化沒保證日志追加方式同時帶來了另一個問題。持久化文件會變的越來越大。例如我們調用incr test 命令100次,文件中必須保存全部100 條命令,其實有99 條都是多余的。因為要恢復數據庫狀態(tài)其實文件中保存一條set test 100 就夠了。為了壓縮這種持久化方式的日志文件。redis 提供了bgrewriteaof命令。收到此命令 redis 將使用與快照類似的方式將內存中的數據以命令的方式保存到臨時文件中,最后替換原來的持久化日志文件。6 集群Redis 集群是一個可以在多個 Redis 節(jié)點之間進行數據共享的設施,Redis 集群使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現: 一個 Redis 集群包含16384個哈希槽(hash slot), 數據庫中的每個鍵都屬于這16384個哈希槽的其中一個,集群提供了以下兩個好處: 將數據自動切分(split)到多個節(jié)點的能力。 當集群中的一部分節(jié)點失效或者無法進行通訊時, 仍然可以繼續(xù)處理命令請求的能力。下面就來著手創(chuàng)建一個Redis集群。6.1 集群配置
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國電窯行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國電池螺帽扳手行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國電動摩托車產業(yè)行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國豬飼料預混料行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國物流金融行業(yè)市場發(fā)展現狀分析及發(fā)展趨勢與投資前景報告
- 分揀機器人實驗平臺的數據安全與隱私保護研究
- 探索教育游戲化的多維度營銷策略
- 教育心理學的力量激發(fā)孩子學習興趣的方法論
- 教育信息化戰(zhàn)略新科技成果的推動與實施
- 從課程到教學-數字化辦公中的技術和倫理探討
- 2024年上海高中學業(yè)水平合格性考試歷史試卷真題(含答案)
- 公司年終答謝宴策劃方案
- 小學一年級數學下冊應用題100道
- 安徽省馬鞍山市2023-2024學年高一下學期期末教學質量監(jiān)測化學試卷(含解析)
- 反詐騙(企業(yè)員工)講座培訓課件
- T/CBMCA 019-2021醫(yī)用潔凈室裝飾材料技術標準
- 2025-2030中國微晶纖維素市場深度評估與需求潛力分析研究報告
- 2025年社會調查方法與實踐考試試題及答案
- 房東合法免責協(xié)議書
- 湖北中考英語真題單選題100道及答案
- 母嬰店轉讓協(xié)議書范本
評論
0/150
提交評論