導航:首頁 > 編程語言 > javaredis消息隊列

javaredis消息隊列

發布時間:2022-09-27 13:05:11

A. java 目前市面上比較火的框架有哪些

Java 始終排在第一位,這使它成為有史以來最著名的軟體編程語言之一。及時的更新和新版本發布使它成為一種充滿活力的、有競爭力的編程語言。

2020年最常用的java框架

十大常用框架:

B. 如何使用NODEJS+REDIS開發一個消息隊列

MQ全稱為Message
Queue,
消息隊列(MQ)是一種應用程
序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們>。消
息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過
隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較為成熟的MQ產品有IBM
WEBSPHERE
MQ。
以上介紹仍舊來自網路.
消息隊列產品對比
目前比較流行的MQ有2種,ActiveMQ
以及
RabbitMQ
,
RabbitMQ性能號稱能夠達到每秒10000,而REDIS官方的壓力測試值在7-8萬之間,而且是去掉了網路IO操作,真實情況我估計在每秒2-3
萬的並發操作,但這個數目對於一般的應用應該足夠了.
Redis如何支持消息隊列?
在新版本的redis
v2.6以上以及以上版本開始支持
subscribe
以及
publish
操作,
subscribe訂閱一個頻道,publish可以像頻道廣播消息.
這個機制最老的應用應該是算是聊天室了.
Sub/Pub
模式固然很好用,但是同樣有一個問題,就是如果有多個人訂閱了同一頻道,而這個頻道的數據只能被一個接收方處理,不能夠重復處理,這時該怎麼辦?
解決方法有2種,
1.
publish
將數據寫入到一個list
or
sorted
list
隊列,寫完成後開始給終端廣播消息,告訴大家,有新的數據等待處理,這個時候,誰能pop到數據,就是誰處理,這個操作是原子性的,也就是說不會被重復處理.
2.
使用阻塞模式,
redis提供了blpop
brpop這種操作,也就是一直阻塞一個隊列,直到有數據來.
這種模式保證了數據的原子性,而且使應用程序可以支持分布式多台機器部署.
Sub/Pub模式
(sub.js):
var
redis
=
require("redis");
var
client
=
redis.createClient(6379,
『127.0.0.1『,
{connect_timeout:
1});
//訂閱一個頻道
var
sub
=
function(c)
{
var
c
=
c
||
『roban:test:channel『;
client.subscribe(c,function(e){
console.log(『starting
subscribe
channel:『+c);
});
};
//訂閱一個頻道
sub();
//處理錯誤,如果出現錯誤,或者伺服器斷開了鏈接,等待恢復時,繼續訂閱這個頻道
client.on(『error『,
function(error)
{
console.log(error);
sub();
});
//訂閱處理函數
client.on(『message『,function(err,response){
console.log(response);
});
打開redis命令行,輸入以下命令:
publish
roban:test:channel
hello
發布這條信息後,sub端會輸出以下信息:
Robans-Pro:node
robanlee$
node
demo.js
starting
subscribe
channel:roban:test:channel
hello

C. redis適合什麼場景

1、緩存。 緩存現在幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低資料庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在緩存的場合非常多。(推薦:《 Redis視頻教程 》)
2、排行榜。 很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合數據類構能實現各種復雜的排行榜應用。
3、計數器。 什麼是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。為了保證數據實時效,每次瀏覽都得給+1,並發量高時如果每次都請求資料庫操作無疑是種挑戰和壓力。Redis提供的incr命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。
4、分布式會話。 集群模式下,在應用不多的情況下一般使用容器自帶的session復制功能就能滿足,當應用增多相對復雜的系統中,一般都會搭建以Redis等內存資料庫為中心的session服務,session不再由容器管理,而是由session服務及內存資料庫管理。
5、分布式鎖。 在很多互聯網公司中都使用了分布式技術,分布式技術帶來的技術挑戰是對同一個資源的並發訪問,如全局ID、減庫存、秒殺等場景,並發量不大的場景可以使用資料庫的悲觀鎖、樂觀鎖來實現,但在並發量高的場合中,利用資料庫鎖來控制資源的並發訪問是不太理想的,大大影響了資料庫的性能。可以利用Redis的setnx功能來編寫分布式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。

D. spring-data-redis 怎麼監聽消息隊列有消息來了

pom.xml中添加如下配置 添加版本配置 <properties> <jedis.version>2.8.1</jedis.version> <spring-data-redis.version>1.7.2.RELEASE</spring-data-redis.version> <commons-pool2.version>2.2</commons-pool2.version> </properties> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>${commons-pool2.version}</version> </dependency> <!-- --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${spring-data-redis.version}</version> </dependency> properties文件中添加如下配置 #redis配置 redis.host=192.168.1.150 redis.port=6379 redis.password=redis redis.timeout=2000 redis.max_total=100 redis.max_idle=20 redis.min_idle=5 redis.test_on_borrow=true redis.test_on_return=true applicationContext.xml中添加如下配置: <!-- Jedis 連接池配置--> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.max_idle}" /> <property name="maxTotal" value="${redis.max_total}"/> <property name="minIdle" value="${redis.min_idle}"/> <property name="testOnBorrow" value="${redis.test_on_borrow}" /> <property name="testOnReturn" value="${redis.test_on_return}"/> </bean> <!-- Jedis ConnectionFactory 資料庫連接配置,注意id名稱必須為redisConnectionFactory--> <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}" /> <property name="port" value="${redis.port}" /> <property name="password" value="${redis.password}" /> <property name="poolConfig" ref="jedisPoolConfig" /> </bean> 定義消息發送者(生產者): @Component public class SendMessage { @Autowired private RedisTemplate<String, Object> redisTemplate; public void sendMessage(String channel, Serializable message) { redisTemplate.convertAndSend(channel, message); } } 定義消息處理者(消費者): public class ListenMessage { public void handleMessage(Serializable message){ System.out.println(message); } } 調用:/queue/redis @Controller @RequestMapping(value = "/queue") public class QueueController { @Autowired SendMessage sendMessage; @RequestMapping(value="/redis") public void redis(){ for (int i = 0; i <1000; i++) { sendMessage.sendMessage("java",i); } } }

E. spring-data-redis 怎麼監聽消息隊列有消息來了

pom.xml中添加如下配置
添加版本配置
<properties>
<jedis.version>2.8.1</jedis.version>
<spring-data-redis.version>1.7.2.RELEASE</spring-data-redis.version>
<commons-pool2.version>2.2</commons-pool2.version>
</properties>
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring-data-redis.version}</version>
</dependency>

properties文件中添加如下配置
#redis配置
redis.host=192.168.1.150
redis.port=6379
redis.password=redis
redis.timeout=2000
redis.max_total=100
redis.max_idle=20
redis.min_idle=5
redis.test_on_borrow=true
redis.test_on_return=true

applicationContext.xml中添加如下配置:
<!-- Jedis 連接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.max_idle}" />
<property name="maxTotal" value="${redis.max_total}"/>
<property name="minIdle" value="${redis.min_idle}"/>
<property name="testOnBorrow" value="${redis.test_on_borrow}" />
<property name="testOnReturn" value="${redis.test_on_return}"/>
</bean>

<!-- Jedis ConnectionFactory 資料庫連接配置,注意id名稱必須為redisConnectionFactory-->
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<property name="password" value="${redis.password}" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>

定義消息發送者(生產者):
@Component
public class SendMessage {

@Autowired
private RedisTemplate<String, Object> redisTemplate;

public void sendMessage(String channel, Serializable message) {
redisTemplate.convertAndSend(channel, message);
}
}

定義消息處理者(消費者):
public class ListenMessage {
public void handleMessage(Serializable message){
System.out.println(message);
}
}

調用:/queue/redis
@Controller
@RequestMapping(value = "/queue")
public class QueueController {

@Autowired
SendMessage sendMessage;

@RequestMapping(value="/redis")
public void redis(){
for (int i = 0; i <1000; i++) {
sendMessage.sendMessage("java",i);
}
}
}

F. java面試中redis,mongodb類的,會問哪些問題,怎麼回答

1、可能會問nosql和關系型資料庫的區別:
優點:

1)成本:nosql資料庫簡單易部署,基本都是開源軟體,不需要像使用Oracle那樣花費大量成本購買使用,相比關系型資料庫價格便宜
2)查詢速度:nosql資料庫將數據存儲於緩存之中,關系型資料庫將數據存儲在硬碟中,自然查詢速度遠不及nosql資料庫
3)存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而資料庫則只支持基礎類型
4)擴展性:關系型資料庫有類似join這樣的多表查詢機制的限制導致擴展很艱難
缺點:
1)維護的工具和資料有限,因為nosql是屬於新的技術,不能和關系型資料庫10幾年的技術同日而語。
2)不提供對sql的支持,如果不支持sql這樣的工業標准,將產生一定用戶的學習和使用成本
3)不提供關系型資料庫對事物的處理
2、介紹下redis和mongodb:
自行google。
3、應用場景:
redis:
a.主要是做熱點數據緩存。
b.數據過期處理。
c.消息隊列等功能。

d.計數,例如投票等。
mongodb:
mongodb的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋梁,集兩者的優勢於一身。mongo適用於以下場景:
a.網站數據:mongo非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的復制及高度伸縮性。
b.緩存:由於性能很高,mongo也適合作為信息基礎設施的緩存層。在系統重啟之後,由mongo搭建的持久化緩存可以避免下層的數據源過載。
c.大尺寸、低價值的數據:使用傳統的關系資料庫存儲一些數據時可能會比較貴,在此之前,很多程序員往往會選擇傳統的文件進行存儲。
d.高伸縮性的場景:mongo非常適合由數十或者數百台伺服器組成的資料庫。
e.用於對象及JSON數據的存儲:mongo的BSON數據格式非常適合文檔格式化的存儲及查詢。
4、支持的數據類型:
內容比較多,自行將網上的信息整理一下。

G. redis消息隊列還有其他嗎

基於Redis消息隊列-實現簡訊服務化

1.Redis實現消息隊列原理

常用的消息隊列有RabbitMQ,ActiveMQ,個人覺得這種消息隊列太大太重,本文介紹下基於Redis的輕量級消息隊列服務。
一般來說,消息隊列有兩種模式,一種是發布者訂閱模式,另外一種是生產者和消費者模式。Redis的消息隊列,也是基於這2種原理的實現。
發布者和訂閱者模式:發布者發送消息到隊列,每個訂閱者都能收到一樣的消息。
生產者和消費者模式:生產者將消息放入隊列,多個消費者共同監聽,誰先搶到資源,誰就從隊列中取走消息去處理。注意,每個消息只能最多被一個消費者接收。

2.Redis消息隊列使用場景

在我們的項目中,使用消息隊列來實現簡訊的服務化,任何需要發送簡訊的模塊,都可以直接調用簡訊服務來完成簡訊的發送。比如用戶系統登錄注冊簡訊,訂單系統的下單成功的簡訊等。

3.SpringMVC中實現Redis消息隊列

因為我們簡訊只需要發送一次,所以我們使用的是消息隊列的生產者和消費者模式。

3.1引入Maven依賴

引入Redis相應的maven依賴,這里需要spring-data-redis和jedis

//pom.xml <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.0.RELEASE</version>
</dependency>

<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.1</version>
</dependency>12345678910111213

3.2配置redis生成者消費者模式

//applicationContext-redis.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:redis="http://www.springframework.org/schema/redis"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-34.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis-1.0.xsd">
<description>spring-data-redis配置</description>

<bean id="redisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="usePool" value="true"></property>
</bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory"></property>
</bean>

<bean id="jdkSerializer"
class="org.springframework.data.redis.serializer." />

<bean id="smsMessageListener"
class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
<property name="delegate" ref="smsMessageDelegateListener" />
<property name="serializer" ref="jdkSerializer" />
</bean>

<bean id="sendMessage" class="com.djt.common.cache.redis.queue.SendMessage">
<property name="redisTemplate" ref="redisTemplate"/>
</bean>

<redis:listener-container>
<redis:listener ref="smsMessageListener" method="handleMessage"
serializer="jdkSerializer" topic="sms_queue_web_online" />
</redis:listener-container>

<!-- jedis -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="300" /> <!-- 最大能夠保持idel狀態的對象數 -->
<property name="maxTotal" value="60000" /> <!-- 最大分配的對象數 -->
<property name="testOnBorrow" value="true" /> <!-- 當調用borrow Object方法時,是否進行有效性檢查 -->
</bean>

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1" value="${redis.host}" />
<constructor-arg index="2" value="${redis.port}" type="int" />
</bean></beans>

主要的配置說明:
1.序列化:一般我們向Redis發送一個消息定義的Java對象,這個對象需要序列化。這里使用:

<bean id="jdkSerializer" class="org.springframework.data.redis.serializer." />1

2.發送者:

<bean id="sendMessage" class="com.djt.common.cache.redis.queue.SendMessage">
<property name="redisTemplate" ref="redisTemplate"/>
</bean>123

3.監聽者:

<bean id="smsMessageListener"
class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
<property name="delegate" ref="smsMessageDelegateListener" />
<property name="serializer" ref="jdkSerializer" />
</bean>
<redis:listener-container>
<redis:listener ref="smsMessageListener" method="handleMessage"
serializer="jdkSerializer" topic="sms_queue_web_online" />
</redis:listener-container>123456789

smsMessageListener:消息監聽器
redis:listener-container:定義消息監聽,method:監聽消息執行的方法,serializer:序列化,topic:監聽主題(可以理解為隊列名稱)

3.3代碼實現

1.定義簡訊消息對象SmsMessageVo

public class SmsMessageVo implements Serializable {
//id
private Integer smsId; //手機號
private String mobile; //類型,1:驗證碼 2:訂單通知
private Byte type; //簡訊創建時間
private Date createDate; //簡訊消息處理時間
private Date processTime; //簡訊狀態,1:未發送 2:發送成功 3:發送失敗
private Byte status; //簡訊內容
private String content; //省略setter和getter方法
...

2.定義消息隊列發送對象SendMessage

//SendMessage.javapublic class SendMessage { private RedisTemplate<String, Object> redisTemplate; public RedisTemplate<String, Object> getRedisTemplate() { return redisTemplate;
} public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate;
} public void sendMessage(String channel, Serializable message) {
redisTemplate.convertAndSend(channel, message);
}
}

3.發送消息

String smsContent = templateToContent(template.getContent(),
regMsgCode);
SmsMessageVo smsMessageVo = new SmsMessageVo();
smsMessageVo.setMobile(mobile);
smsMessageVo.setType((byte) SmsType.VERIFICATION.getType());
smsMessageVo.setChannelId(1);
smsMessageVo.setContent(smsContent);
smsMessageVo.setCreateDate(new Date());
smsMessageVo.setStatus((byte) SmsSendStatus.TO_SEND.getType());
smsMessageVo.setTemplateId(1);

//先把待發送的簡訊存入資料庫
SmsQueue smsQueue = new SmsQueue();
BeanUtils.Properties(smsQueue, smsMessageVo);
smsQueueService.addSmsQueue(smsQueue);

//非同步發送簡訊到redis隊列
sendMessage.sendMessage(Constants.REDIS_QUEUE_SMS_WEB, smsMessageVo);
//Constants.REDIS_QUEUE_SMS_WEB = "sms_queue_web_online",和applicationContext-redis中topic配置一樣

4.監聽消息

//SmsMessageDelegateListener.java@Component("smsMessageDelegateListener")public class SmsMessageDelegateListener {

@Autowired
private SmsQueueService smsQueueService; //監聽Redis消息
public void handleMessage(Serializable message){ if(message instanceof SmsMessageVo){
SmsMessageVo messageVo = (SmsMessageVo) message; //發送簡訊
SmsSender smsSender = SmsSenderFactory.buildEMaySender();
smsSender.setMobile(messageVo.getMobile());
smsSender.setContent(messageVo.getContent()); boolean sendSucc = false; //判斷簡訊類型
//驗證碼簡訊
if(messageVo.getType() == (byte)SmsType.VERIFICATION.getType()){
sendSucc = smsSender.send();
} if(!sendSucc){ return;
} // 非同步更新簡訊表狀態為發送成功
final Integer smsId = messageVo.getSmsId();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() { public void run() {
SmsQueue smsQueue = new SmsQueue();
smsQueue.setSmsId(smsId);
smsQueue.setStatus((byte)SmsSendStatus.SEND.getType());
smsQueue.setProcessTime(new Date());
smsQueueService.updateSmsQueue(smsQueue);
}
});

}
}
}04142434445

4.總結

下面使用一張流程圖,來總結Redis消息隊列和簡訊服務。

閱讀全文

H. JAVA開發需要哪些技術

作為一個Java開發人員,最大的挑戰就是不斷更新了解新的技術。在時代的變化中,主流技術的掌握也是一門持久的功課。
1、微服務技術
微服務架構主要有:Spring Cloud、 Dubbo、 Dubbox等,以 Dubbo佔比最高,可達26%,微服務網關技術,使用springcloud-zuul的程序員佔比最高。
2、遠程調用技術
使用RPC框架的程序員中, 使用Dubbo的人數佔比最高,其次為 bbox、gRPC、hessian也具有一定的使用比例。
3、開發技術
多數程序員在工作中使用的開發技術為許可權管理和消息隊列。1/4的程序員在工作中使用的開發技術為報表技術、分布式緩存技術和負載均衡解決方案。
4、許可權管理技術
shiro的使用比例最高,其次為spring security和自定義框架。
5、消息隊列技術
消息隊列技術主要有:ActiveMQ、RabbitMQ和Kafka。RocketMQ的使用人數較少。

I. redis為什麼總是把訂閱/發布和消息隊列聯系在一起

首先redis的發布訂閱模式不會緩存數據,就是我發布了,如果你已經可以接受了,那麼你就能接收到,如果你還沒有準備好那麼就會錯誤准備好之前的數據。至於為啥為啥和消息隊列聯系在一起,是因為redis的發布訂閱模式的實現就是通過消息隊列實現的。比如多個發布端都可以發布消息,而訂閱端都會接收到消息。可見中間必然有一個隊列取集中發布的消息。然後把消息按序發出去

J. 消息隊列為什麼用redis實現

redis只是提供一個高性能的、原子操作的分布式隊列實現。具體的業務還是得需要你自己定製。
你的需求實際上是一個變形的生產者-消費者實現。對於此類需求,主要是將請求和實際的處理過程解耦,一般都是採取非同步的方式來通知請求方,這跟用不用redis其實沒有多大的關系。一般的實現方法是你需要將用戶的請求封裝成一個Task,然後將這個Task再push到redis隊列,然後後端的worker.php完全可以多進程、多線程的並發處理Task並將處理結果回調給請求方。這里唯一麻煩點的就是這個Task的設計,需要能夠包含請求信息(請求內容,請求方標識等等).

閱讀全文

與javaredis消息隊列相關的資料

熱點內容
壓縮因子定義 瀏覽:966
cd命令進不了c盤怎麼辦 瀏覽:212
葯業公司招程序員嗎 瀏覽:972
毛選pdf 瀏覽:659
linuxexecl函數 瀏覽:726
程序員異地戀結果 瀏覽:374
剖切的命令 瀏覽:228
干什麼可以賺錢開我的世界伺服器 瀏覽:290
php備案號 瀏覽:990
php視頻水印 瀏覽:167
怎麼追程序員的女生 瀏覽:487
空調外壓縮機電容 瀏覽:79
怎麼將安卓變成win 瀏覽:459
手機文件管理在哪兒新建文件夾 瀏覽:724
加密ts視頻怎麼合並 瀏覽:775
php如何寫app介面 瀏覽:804
宇宙的琴弦pdf 瀏覽:396
js項目提成計算器程序員 瀏覽:944
pdf光子 瀏覽:834
自拍軟體文件夾名稱大全 瀏覽:328