“
08北京车展参展美女投票活动”是我进入太平洋后的第一个project,代号为auto080228
投票规则描述如下:
1.每个IP每天最多可以投出10票
2.每个IP每天可以对同一个参展美女投多次票
3.每个IP连续对同一个参展美女投票时,投票的时间间隔不得少于10秒
其中,参展美女图片(分大图和小图两种格式)由编辑从后台上传,并设置与之相关的论坛地址
接到任务后,我迫不及待的把表设计出来了:Beauty(beauty_id,name,pic_url_big,pic_url_small,bbs_url,vote_count),其中vote_count即标识参展美女所得票数
后来team leader康哥指出这种设计不合理,“试考虑一下,用户每投一次票,vote_count就要加1,就要更新一次数据库!如果采用(JDO)缓存的话,由于数据更新了,缓存就会清除;每次读取数据的时候都要重新加载,缓存实际上不起作用了。”
针对上面的问题,我乖乖的把Beauty拆分成了两个表
Beauty(beauty_id,name,pic_url_big,pic_url_small,bbs_url,vote_counter_id)---更新少
VoteCounter(vote_counter_id,vote_count) ---用户每投一票更新一次
Beauty表与VoteCounter表是一一对应的关系,在增加投票次数的时候只要更新VoteCounter表即可,不会影响到Beauty表,Beauty的缓存也就不会清除了 。
但回过头来,问题依旧存在,就是写数据库的次数并没有降下来,每投一次票都要更新一次数据库。于是,我采用了缓存投票次数的方法,也就是等到一定的次数(如5次)才更新一次数据库,实现如下:
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.jdo.JDOHelper;
public class VoteCounter extends Sys.DataObject {
private int cnt;// 票数
private static final Map CNT_BUFFER = Collections
.synchronizedMap(new LinkedHashMap(16, 0.75f, false));// 缓存票数
public int getCnt() {
return cnt + getBufferedCount();
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
/** 获取缓存中的票数 */
public int getBufferedCount() {
Object id = JDOHelper.getObjectId(this);
Integer count = (Integer) CNT_BUFFER.get(id);
return count != null ? count.intValue() : 0;
}
/** 缓存票值,每bufferSize票写一次数据库 */
public int inc(int bufferSize) {
int n = 1;// 点击1次加1票
Object id = JDOHelper.getObjectId(this);
int bufferedCount = getBufferedCount();
bufferedCount += n;
if (bufferedCount >= bufferSize) {
Object tx = Sys.requireTx();
cnt += bufferedCount;
Sys.commit(tx);
CNT_BUFFER.remove(id);
return cnt;
} else {
CNT_BUFFER.put(id, new Integer(bufferedCount));
return getCnt();
}
}
/** 保存缓存票值计时任务 */
static class SaveData extends java.util.TimerTask {
public void run() {
Env.log.debug("Running VoteCounter timer task.");
if (!CNT_BUFFER.isEmpty()) {
Object tx = Sys.requireTx();
VoteCounter cnt = null;
for (Iterator it = CNT_BUFFER.entrySet().iterator(); it
.hasNext();) {
Map.Entry me = (Map.Entry) it.next();
cnt = (VoteCounter) Sys.pm().getObjectById(me.getKey(),
true);
cnt.setCnt(cnt.getCnt());
}
Sys.commit(tx);
CNT_BUFFER.clear();
}
}
}
}
这样一来,极大的缓解了数据库的压力。但缺点就是容易丢失投票次数,也会占用一些内存。
为了避免一些冷门的投票长时间占用缓存,后来我也加上了定时器,每隔一段时间把缓存的数据写入数据库...
分享到:
相关推荐
在2020北京车展上,智能电动汽车的发展态势和各大品牌的新产品动态是业界关注的焦点。从展览的情况来看,智能电动汽车的形态和功能已初步定型,但暂未见到重大技术突破。尽管受到疫情的影响,多家企业未能按原计划...
### 2019年上海车展访客研究报告关键知识点总结 #### 一、中国汽车市场概况 - **2019年4月中国汽车市场概况**: - 2019年4月,中国汽车产量为205.2万辆,销量为198.05万辆。 - 与上个月相比(环比),产量下降了...
这份报告很可能包含了对即将举行的上海车展的深入分析、预期趋势、参展品牌介绍以及市场预测等重要内容。 在描述部分,同样只提到了“2021上海车展展前报告-CAM 20210412.zip”,这意味着报告的内容和格式与标题...
2023上海车展展前报告-.pdf
【标题】:“极光大数据-上海车展访客研究报告-5-30页.pdf”揭示了在经济领域中,大数据分析如何影响汽车展览行业的营销策略和消费者洞察。 【报告概述】: 该报告基于极光大数据平台的分析结果,深入探讨了2019年...
【2023】2023上海国际车展展前报告-盖世汽车_85页.pdf
汽车车展参展方案.pptx
【汽车行业报告】—— 成都车展20230828 汽车行业在2023年8月28日的成都车展上展示了丰富的车型,彰显了行业的发展趋势和各品牌的竞争态势。此次车展以“智享蓉城,驭见未来”为主题,聚集了129个汽车品牌,包括德...
2019年上海车展作为亚洲乃至全球汽车行业的重大盛事,不仅吸引了大量参展品牌和车型,更成为了社会化媒体关注的焦点。《2019上海车展社会化聆听》这份报告,由明略科技与AdMaster联合发布,为行业提供了一份深入的...
2021上海车展展前报告
【汽车行业报告】——“金九银十”旺季将至,车展新车提振销量 汽车行业作为中国经济的重要支柱,2023年8月28日的报告显示,尽管7月车市处于传统淡季,销量表现平稳,但新能源车的渗透率持续上升,展现出强大的增长...
吉利汽车在2012年北京车展上的参展阵容,充分展现了其“高标准、超豪华、创新突破”的参展理念和“品质吉利”的参展主题。通过展示一系列高品质、高性能的车型,吉利不仅诠释了其战略转型的新方向,还成功塑造了新...
在当前的市场环境中,车展行业面临激烈的竞争,各企业都在寻求独特的发展路径以实现市场突围。本报告聚焦2021年至2026年的五年期间,深入分析了车展行业的企业市场突围战略,并提出了一系列有针对性的建议。 首先,...
【上海车展参展执行方案】 上海车展作为全球知名的汽车行业盛事,是各大汽车品牌展示新品、技术及品牌形象的重要舞台。在2019年的国际汽车工业展览会上,参展品牌需精心策划,确保活动的成功执行。本方案旨在详述...
随着20页的报告《汽车行业金九银十旺季将至车展新车提振销量》的发布,我们可以深入探讨这一现象背后的原因以及汽车行业如何利用这一时期提振销量。 首先,金九银十的销售旺季与消费者的购车需求密切相关。在这个...
- **北京车展中北京市本地访客超过8成**,这表明北京车展对本地居民有着较强的吸引力。 - **上海车展访客更偏爱地铁WiFi**,北京车展访客则更倾向于使用ofo共享单车,广州车展访客偏好汽车之家应用。 - **上海车展的...
汽车及零部件行业:光束汽车获审批通过;广州车展拉开帷幕-1125-中金公司-14页.pdf
北京车展数据集中的信息可用于挖掘参展品牌的表现、媒体关注度、用户兴趣变化等关键指标。 4. **Excel格式**:Excel是Microsoft Office套件中的电子表格程序,广泛用于数据管理和分析。数据以Excel格式提供,意味着...