最近搞这个自动取消置顶的东西,非常之烦

一开始方案是采取读出两次数据 ,一组是置顶不过期数据,一组是所有数据。然后进行数组匹配,第二个数组中不在第一个数组的数据累加到第一个数组后头。当文章数目仅仅就10来篇的时候也就罢了,倘若上百篇,这么大的二维数组循环匹配太消耗资源。

想了想,还是放弃了这种方式,实在不可取。最终去在mysql手册中找了控制流程函数IF,终于解决了这个问题。

函数表达式:IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

举个例子就很好理解

mysql > SELECT IF(1>2,'yes ','no');
          > 'yes'

数据库表结构设计:

id: int(11)  
title: varchar(255)  
istop: tinyint(1) //这个是是否置顶:1表示置顶;0表示非置顶  
topdeadline: int(10) //置顶截止时间,时间戳格式..  
…… //更多的字段

PHP中操作Mysql:

//这里有额外的要求,当置顶截止时间为空时,代表永久置顶。
$timestamp = mktime(); //获取当前时间戳
//置顶为1时,截止时间大于当前时间或者 截止时间为0,定义一个字段为top为其赋值
$sql = "SELECT id, title,
IF(istop=1 AND (topdeadline>" . $timestamp . " OR topdeadline=0), 1, 0) AS top,1
FROM article ORDER BY id DESC";

Nginx 自动禁止爬虫IP采集

### 背景最近我们有一个公开服务提供给客户查询关键词的热度值,由于这个API做在官方网站上,自然没有用户登陆,也没有很高查询成本,所以设计上没有任何鉴权无法进行身份认定,于是就被一个爬虫开了超高并发请求,直接后端的AWS Tomcat CPU被用尽,导致无法响应。爬虫显然...… Continue reading

Redis原子性事务Lua应用

Published on June 28, 2020