为什么要用到消息队列?
你这个需求貌似只需要队列这个数据结构就行了
使用JDK中自带的就行,LinkedList是实现Queue的
Queue queue = new LinkedList();
queueadd(Object )//尾部添加
queueremove()//头部取出
你只需要将通过JDBC把数据库取出的对象用循环依次add到queue, 然后再通过循环依次remove就行了
双端队列数据类型
typedef struct qnode
{
DataType
data;
struct
qnode
next;
}LQNode;
typedef struct
{
LQNode
front;
LQNode
rear;
}LQueue;
尾出队:首先判断队列是否为空,如为空则提示队列为空,如不为空则将队尾结点
赋给临时结点。将队尾结点的前驱指针赋给队列的队尾指针,再将队尾结
点的后继指针置空。最后返回临时结点或所需要的数据。
不能简单说谁好谁坏,各有适用场景。
数据库在持久化方面比较好,服务宕机,数据还在,但并发性能方面不如缓存。
如果用缓存,最主要是要处理好多线程时线程安全、宕机缓存丢失的问题。如果是分布式部署,同步缓存也要考虑。
//
/ 链式队列 /
//
#include "stdlibh"
#include "stdioh"
/ 定义链式队列类型 /
typedef int ElemType;
typedef struct QNode
{ ElemType data;
struct QNode next;
} QNode, QueuePtr;
typedef struct
{ QueuePtr front;
QueuePtr rear;
} LinkQueue;
/ 1、初始化链式队列 /
void InitQueue(LinkQueue Q)
{ Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if (!(Q->front)) exit(0);
Q->front->next=NULL; }
/ 2、销毁链式队列 /
void DestroyQueue(LinkQueue Q)
{ while (Q->front)
{ Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear; }
}
/ 3、清空链式队列 /
void ClearQueue(LinkQueue Q)
{ QueuePtr p;
p=Q->front->next;
while (p)
{ Q->front->next=p->next;
free(p); }
Q->rear=Q->front;
}
/ 4、判断空队列 /
int QueueEmpty(LinkQueue Q)
{ if (Qfront==Qrear)
return 1;
else
return 0; }
/ 5、求链式队列长度 /
int QueueLength(LinkQueue Q)
{ QueuePtr p; int n=0;
p=Qfront;
while (p!=Qrear)
{ n++; p=p->next; }
return n;
}
/ 6、取队头元素 /
ElemType GetHead(LinkQueue Q)
{ if (Qfront!=Qrear)
return Qfront->next->data;
}
/ 7、入队列 /
void EnQueue(LinkQueue Q, ElemType e)
{ QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if (!p) exit(0);
p->data=e; p->next=NULL;
Q->rear->next=p;
Q->rear=p; }
/ 8、出队列 /
void DeQueue(LinkQueue Q, ElemType e)
{ QueuePtr p;
if (Q->front!=Q->rear)
{ p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if (Q->rear==p) Q->rear=Q->front;
free(p); }
}
/ 9、遍历链式队列并输出元素 /
void QueueTraverse(LinkQueue Q)
{ QueuePtr p;
printf("\nQueue: ");
p=Qfront->next;
while (p)
{ printf("%d\t",p->data);
p=p->next;}
}
/ 约瑟夫问题 /
void Joseffer(int n)
{ LinkQueue Q; int i; ElemType x;
InitQueue(&Q);
for(i=1; i<=n; i++)
EnQueue(&Q,i);
while (!QueueEmpty(Q))
{ for(i=1; i<=3; i++)
{ DeQueue(&Q,&x);
if (i!=3)
EnQueue(&Q,x);
else
printf("%5d",x);
}
}
}
/ 主函数 /
main()
{ LinkQueue Q; int i; ElemType x;
InitQueue(&Q);
for(i=2; i<=5; i++)
EnQueue(&Q,i);
printf("len:%d\n",QueueLength(Q));
while (!QueueEmpty(Q))
{ DeQueue(&Q,&x);
printf("%d\t",x); }
//QueueTraverse(Q);
//Joseffer(6);
}
自己去调试吧,这个是C语言版的链式队列,如果看不懂或者调不出来就去看书吧。否则你这门是白学了。
注:这里是链式队列
//
/ 循环队列 /
//
#include "stdlibh"
#include "stdioh"
#define N 100
/ 定义循环队列类型 /
typedef int ElemType;
typedef struct
{ ElemType base;
int front;
int rear;
} SqQueue;
/ 1、初始化循环队列 /
void InitQueue(SqQueue Q)
{ Q->base=(ElemType)malloc(Nsizeof(ElemType));
Q->front=Q->rear=0; }
/ 2、销毁循环队列 /
void DestroyQueue(SqQueue Q)
{ free(Q->base); }
/ 3、清空循环队列 /
void ClearQueue(SqQueue Q)
{ Q->front=Q->rear=0; }
/ 4、判断空队列 /
int QueueEmpty(SqQueue Q)
{ if (Qfront==Qrear)
return 1;
else
return 0; }
/ 5、求循环队列长度 /
int QueueLength(SqQueue Q)
{ return (Qrear+N-Qfront)%N; }
/ 6、取队头元素 /
void GetHead(SqQueue Q, ElemType e)
{ if (Qfront!=Qrear)
e=Qbase[Qfront];
}
/ 7、入队列 /
int EnQueue(SqQueue Q, ElemType e)
{ if ((Q->rear+1)%N==Q->front)
return 0;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%N;
return 1; }
/ 8、出队列 /
int DeQueue(SqQueue Q, ElemType e)
{ if (Q->front==Q->rear)
return 0;
e=Q->base[Q->front];
Q->front=(Q->front+1)%N;
return 1; }
/ 9、遍历循环队列并输出元素 /
void QueueTraverse(SqQueue Q)
{ int i;
printf("\nQueue: ");
if (Qrear<Qfront) Qrear=Qrear+N;
for(i=Qfront; i<Qrear; i++)
printf("%d\t",Qbase[i%N]); }
/ 主函数 /
main()
{ SqQueue Q; int i; ElemType x;
InitQueue(&Q);
for(i=2; i<=5; i++)
EnQueue(&Q,i);
printf("len:%d\n",QueueLength(Q));
while (!QueueEmpty(Q))
{ DeQueue(&Q,&x);
printf("%d\t",x); }
QueueTraverse(Q);
}
在给你个循环队列吧
sql数据库出现队列问题可以这样解决:文中从 select limit 1 这一点开始,也就是 limit 1这东西出现开始,思路就错了。错就错在worker不应该管理任务的分发(当worker会去回写mysql,就参与了任务的分发),只负责单调领任务即可。分发的事情交给独立的进程配合mq或者redis进行。
以上就是关于java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢全部的内容,包括:java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢、C语言中怎么实现双端队列这个数据结构、java任务队列用缓存还是数据库表实现较好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)