实战--积分投票系统血泪教训

好几天没有写博客了,一直忙这写这个积分投票-兑换礼包系统.有非常多血泪的教训来分享下:?
之前,我一直是写手机接口的,跟前端基本上没有交集,即使有也是给内部提供管理平台:?
1.实时性:大量的操作是建立在memcache缓存的基础上的,mysql数据库是为了提供数据持久性和记录日志的.因此查询之前会先訪问缓存,假设缓存不存在或者失效,去訪问数据库.?

2.数据量比較大:数据库的索引没有建立到最好.?

3.权限的问题,不是全部人都拥有权限能够投票,于是我把拥有权限的用户id放入了一个数组中并放在缓存,同步到数据库里面,最后发现这次投票人数特别多,每次查询一个用户的权限,须要把全部人的权限都拿出来,使用in_array(),来推断,主管发现后,果断改啊,每一个用户使用独立的key来保存是否拥有权限.?

4.安全性:从前端传递过来的參数要假设是不可靠的,在兑换礼包的时候,我从前端传递过来了礼包的类型和要扣除的积分,放入数据库中,哎!首先悲剧的就是要扣除的积分不能是传递过来的,而是依据礼包的类型来推断.而且要把礼包的类型做出范围配置来检查是否合法.刚写完程序的时候,主管看了看然后请求了一个url: www.example.com/?type=6&score=1,本来第六个礼包要扣除积分80个,结果如今仅仅扣除1个积分用户就领取到了第六个礼包.然后要推断礼包仅仅有六中type应该大于1,小于7.写成配置文件来推断例如以下:

/**
 * @brief 将礼包相应扣除的积分写成配置。不要相信用户提交的数据,
 * @return array();
 */
public function getTypes() {
    return array(
            11 => 5,    //礼包1相应扣除的积分5,同下
            12 => 10,
            13 => 20,
            14 => 30,
            15 => 50,
            16 => 80
    );
}

5.防止刷积分的处理:假设用机器大量高速请求,有可能出现server挂掉,且出现一个人领取多个礼包,因此将用户id:uid和礼包类型:type做唯一索引:?
UNIQUE KEY?unique_uid_type?(uid,type),?
在memcache中存入一个1s过期的key,保证一个uid每秒仅仅能领取一次礼包.

6.一些非实时的数据,採用数据查询时从缓存中读取,不存在再从数据库读取;增删改时清除该key的缓存.下次从数据库读取.结果因为仅仅改变了查询的时候的缓存的key,没有改 增删改 数据时缓存的key,导致数据全部从数据库中读取..因此一定要保证,写入缓存和读取缓存的key保持一致.否则...

7.因为有非常多页面,须要共享用户的信息,而用户信息须要经过处理,就把用户的信息放到了__construct()里面,也就是说全部的页面都会处理用户信息,结果有几个页面是不使用用户信息的...

8.命名的规范:对缓存命名时必须遵循团队规范,否则可能会和其它开发者发生缓存key冲突.

9.特殊字符的编码处理:username是utf-8编码的,而程序中是gbk编码的,结果转码后发现,username凌乱了.处理办法:copy到txt文档中使用记事本打开,又一次复制一遍,非常多的username中会出现特殊字符比方双引號等,使用:htmlspecialchars();

10.数据表中添加一个create_time,用来记录时间排除bug

11.缓存设置的时间要依据详细的业务逻辑来设计,比方以下的场景:用户投票和兑换积分一般时间不会超过十分钟,因此,一些非实时的缓存的过期时间设置成10分钟就够了

12.将全部权限的检測封装到一个函数中统一处理,是代码更简洁方便

13.jsonencode()不能处理gbk编码:jsonencode(‘gbk‘,‘utf-8‘,$array);

这次的任务做的太失败了,太凌乱了,写出来的总结感觉也非常凌乱,心情不爽,以后慢慢改吧!记录下来做日志,防止再犯相同的错误

原文地址:https://www.cnblogs.com/ldxsuanfa/p/10848260.html

时间: 2024-10-23 16:40:37

实战--积分投票系统血泪教训的相关文章

以太坊 DApp 开发入门实战! 用Node.js和truffle框架搭建——区块链投票系统!

第一节 概述 面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ru

微信送礼物投票系统的详细解答

就目前来说,市场上的第三方微信投票系统种类很多,功能不一鱼龙混杂,功能很多的情况下有一些细微的区别,对于用户来说选择有一定的难度,下面我就来简单介绍一下微信投票活动大家经常关注的16个问题,对此进行详细的解答:只要能同时包括这个些功能的系统,通常都能够很好的满足活动举办方的要求,活动良好的用户体验! Q1.该投票系统可以设置每个微信用户投票次数吗? A3:可以的,可以设置一次活动每个微信用户的投票数,可设置每个微信用户每天的投票数!并且取消关注自动减掉此用户投票的所有记录,做到了自动减票的功能.

关于投票系统刷票方式原理(突破ip限制刷票PHP版)

先说一点:其实不算是突破ip限制,因为事实上,这个限制是在服务器端的,客户端在牛逼,也突破不了..只是可以一直刷多次票罢了 一个朋友突然发了一个网站,让我帮她投投票..我这人一项比较好说话,就帮她投了.顺便分析了这个网站,发现这个网站的投票系统有ip限制,但是投票是一个ajax请求.那么办法就出来了. 很多投票PC网站都是依靠限制ip,来限制投票人数.那么我用curl伪造IP,那么就可以轻易制造多个IP进行投票. 下面贴上PHP代码: 由于对方是GET AJAX请求,我这里就贴上GET方法,PO

java web 程序---投票系统

1.这里会连接数据库--JDBC的学习实例 一共有3个页面. 2.第一个页面是一个form表单,第二个页面是处理数据,第三个页面是显示页面 vote.jsp ? 1 2 3 4 5 6 7 8 9 10 11 12 <body bgcolor="green">    选择你要投票的人:    <form action="vote_end.jsp">        <input type="radio" name=&q

投票系统——爬虫+容器克隆技术

序:昨天是所谓的单身狗节,作为一名不折不扣的程序员,高级程序员,怎么能有女票呢是吧,所以我苦逼的去了公司开发我的项目 大概到下午,我当天的开发到了尾声,仔细想想别人都去逛街约炮去了,我堂堂一名程序员弄啥雷,于是我想找点乐子,我找了实验室的好基友(单身狗程序员一只)准备商讨出去浪的想法,刚想发信息,一想最近工资没发,钱不够不能出去浪啊,寻思着找啥乐子,突然一个灵感划过脑海,要不做个校花评选系统找理工的校花吧,但是照片哪来呢,大一时天真的认为让他们自己交出照片,想想这么逗比的行为不现实了,那么只能做

Java Web总结二十二投票系统

投票系统需求: (1)查询所有候选人基本信息 (2)查询某位候选人详细信息 (3)投票人登录和退出 (4)投票人限制1分钟之内重复投票 (5)投票人IP和最后投票时间查询 (6)阻止相同用户名二次在线登录 (7)票数条形显示和候选人头像处理 (8)显示投票人归属地 (9)热门候选人,即投票数最多 (10)后台管理员登录 可选需求: (11)查询.删除.更新.增加候选人详细信息 (12)与一个Listener,创建所有表格式和初始化数据 代码参见:day19/vote(此处不上传) Java We

刷票的在线投票系统代码

投票是非常多的网站是基于ip住址.不同ip地址每天一次投票 以下代码是使用curl扩展伪造ip住址 实现无限制投票. $times = $_POST['times']; //投票次数 $url = $_POST['url']; //投票地址[某个选手下方投票button的链接] while ($times) { $ip1 = 'X-FORWARDED-FOR:'.rand(115,225).'.'.rand(115,225).'.'.rand(115,225).'.'.rand(115,225)

【php】使用jpgraph完成投票系统的普通用户部分

本文接上一篇<[php]投票系统管理员部分,增加投票与删除投票>(点击打开链接) 上次三个链接只完成了管理员部分的两个 现在完成最后的一个普通用户这一个,同样是没有登录系统部分,请自行补充 一.基本目标 投票系统的普通用户部分如下图所示: 首先显示现存的投票列表给用户,之后,点击进入其中一个投票,能够投票 投票皆为单选,不设定为多选,当然,你设置为多选也行,反正每一页都是一个表单, 点击"投票"按钮则,询问用户是否确定,是则投票成功哦,否则不发生任何事 当投票的任何一项都大

360JSP015在线投票系统

程序测试环境:MyEclipse5.5以上版本  数据库:Sqlserver2005以上版本 程序设计语言:JSP(Java) 程序功能介绍: 在线投票系统总体功能模块包括普通用户登录模块和管理员登录模块:  普通用户模块   用户注册:普通投票用户须通过账号注册方可以进行投票:   登录:注册成功后,可输入用户名和密码登录系统:   重选:用户可以进行重新投票:  管理员模块   发布新问题:   用户管理,管理员可以增加和删除普通用户(超级用户不能删除),或者更改普通用户密码:   查看所有