关于第二题,我特地试验了一下。create table email(id int unsigned primary key auto_increment, e_mail varchar(64)) engine=myisam;insert into email(e_mail) values('[email protected]'),('[email protected]'), ('[email protected]'), ('[email protected]'), ( '[email protected]'), ('[email protected]'); 上面假设有五千万条,通过分表的技术,把126和163的记录分开,因为现实情况肯定是这样做,不可能每次都对五千万条记录进行一次索引查找。。 create table email_163 like email;insert into email_163 select id, temp.e_mail_163 from ( select id, case e_mail when substr(e_mail,-7,3)=163 then e_mail when substr(e_mail,-10,3)=163 then e_mail when substr(e_mail,-6, 3)=163 then e_mail else 0 end as e_mail_163 from email order by length(e_mail_163) desc )as temp where temp.e_mail_163 <> '0';因为126或者163,域名的部分都只存在三种固定的模式,,,163.com,163.cn,163.com.cn。。显然域名这部分的长度是相同的,,所以通过字段比对,将163的提取到另外一个表。提取126的同样如此。 这样就不用每次都对五千万条记录查询了,而且速度更快
这里有两个方法。
第一,把email字段反转一次另存,并创建索引,
然后通过where email like 'moc.361%' 来处理,但这个需要多一组字段,存储和更新成本太高。
第二,自己做分词fulltext3.登入后会写session,那么可以记录用户登入时的session_id,另一个用户再用相同的帐号密码登入。session_id必然不同(因为浏览器变了),只要判断用户uid是否存在两个session_id,就知道是否多人使用此帐号登入了。
例如 建立一个login_log的表,相同session_id的只做update addtime处理。
id, uid, session_id, addtime然后在指定的某个时间段内(addtime),uid=xx 的记录有多条的话,就表示多人使用此帐号登入了。
腾讯的黄色图片鉴定方法非常准确,我上传了几张,一张都上传不了
第一点算基础吗,你应该反问请教下那个面试的,看他怎么教你做出来,这都是拿高薪的岗位
后2点不难,一个索引加分段处理,一个就是简单的SESSION
因为你经常做那种CMS的标签调用,所以很少写到后面2个,因为别人做好了,其实这也没什么,不要被打击了,
楼主当时没有反应过来,但是实际做项目的时候应该能做出来
2、可以使用全文检索索引
3、http 会话结束后,无法检测到用户关闭了浏览器,只能在响应会话是被动检查
2、其实大多数DBMS也是可以用正则表达式的
3、楼主的思路是对的,其实就是判断用户是否在线,由于http协议是无连接、无状态的,因此无法实现准确判断用户是否在线
不准确判断的话方法有很多,比如
i、记录用户最后一次活动时间,超过多长时间不活动就判断不在线
ii、记录用户登录的session文件名,判断该文件是否被清除
iii、浏览器发心跳包
iv、浏览器关闭是是会触发Onunload与Onbeforeunload事件的
还要其他,以上方法是可以结合或分开使用
如果like + 所要查的行数限制比如用between,5000w数据查询不会很慢。
至于检测用户时候关闭了浏览器也可以用会话级别的seesion,当用户关闭浏览器时,session文件会被从服务器删除,或者从memcache中删除。 当浏览器关闭的时候根据session_id去获取对应的session文件肯定是不存在的,这时可以判断用户肯定是关闭了浏览器,所以这时候需要建一个表保存session_id,服务器每隔一段时间去检索一边对应的session_id对应的session文件是否存在,如果不存在表示用户肯定是关闭了浏览器,当session_id对应的session不存在时,顺便删除这一行记录。
2.email可以用@分隔存储到两个字段中
3.用户关掉浏览器这个是没办法通知到后台的
('[email protected]'),
('[email protected]'),
( '[email protected]'),
('[email protected]');
上面假设有五千万条,通过分表的技术,把126和163的记录分开,因为现实情况肯定是这样做,不可能每次都对五千万条记录进行一次索引查找。。
create table email_163 like email;insert into email_163
select id, temp.e_mail_163
from
(
select id,
case e_mail
when substr(e_mail,-7,3)=163 then e_mail
when substr(e_mail,-10,3)=163 then e_mail
when substr(e_mail,-6, 3)=163 then e_mail
else 0
end as e_mail_163
from email order by length(e_mail_163) desc
)as temp
where temp.e_mail_163 <> '0';因为126或者163,域名的部分都只存在三种固定的模式,,,163.com,163.cn,163.com.cn。。显然域名这部分的长度是相同的,,所以通过字段比对,将163的提取到另外一个表。提取126的同样如此。
这样就不用每次都对五千万条记录查询了,而且速度更快
1个状态表 (配置一个定时器,sleep(3600)秒后检查一下这个状态表,状态表3个字段,id,uid sess_id,)相当于每一个小时(时间间隔可以自由配置)去查询一下这个状态表,当sess_id对应的session文件不存在时(会话级别的session在用户关闭浏览器时会被自动删除),就根据对应的uid去用户表将status赋值为0,并根据id删除对应的这一条记录,同时通过用户表和状态表相关联的方式,当多次登陆时,session_id是不同的,这时在状态表中,uid对应的sess_id会有多条记录
第一题,用php来判断是否是黄色图片本身就是很愚蠢的方法,网上有类似的库,但准确率值得商榷,这是个很复杂的东西,怎么可以说是php的基础呢
第二题,like也是可以使用索引的,查找126,你直接 LIKE '126.com%'不就可以使用索引了吗,当然,全文索引也是个办法
第三题,php要实现这个确实是很困难,楼主前部分说得没错,一般要达到这个目的,其一是定时update相关字段,来确认其在线,超过一段时间后如果查询不到用户状态就表示他不在线。还有就是使用socket,这个最直接,但相当消耗服务器资源
总的来说,感觉这面试的是在刁难你吧,你自己肯定不止2500元的,都什么年代了,这种找苦力的公司不做也罢
高手就一定用过nginx吗?我觉得楼主一个是技术确实一般,一个是气势略弱,感觉面试管都有为了压低待遇来问的, 从心理上分析啊,第一个问题是下马威,多数都不知道,杀杀威风,不过实力强大的人还是能知道借助第三方类库之类的,虽然不知道有什么库能用。
30岁还这水平,有点学艺不精, 不过完全没必要灰心和气馁,知耻而后勇嘛。