一道Redis面试题

Redis · ruyi · 于 2年前发布 · 10253 次阅读

这道面试题是这样子的:

请用Redis和任意语言实现一段恶意登录保护的代码,限制1小时内每用户Id最多只能登录5次。具体登录函数或功能用空函数即可,不用详细写出。

我乍看下觉得像是面试开发的题~

花了一下午了解了下redis,发现这货似乎蛮简单的,而且有哈希和列表数据结构.我一开始想用哈希,每个用户为key,登陆时间为value,统计下now和now-1h之间的key数目是否大于5,类似这样的sql

select count(user) from user_log where access between date_sub(now, interval 1 hour) and now().

但感觉这种范围查找会比较慢.后来觉得用列表是个好方法:列表中每个元素代表登陆时间,只要最后的第5次登陆时间和现在时间差不超过1小时就禁止登陆.用Python写的代码如下,感觉蛮简练的,如果网友有更巧妙的方法,欢迎指教.

#!/usr/bin/env python3
import redis  
import sys  
import time

r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)  
try:  
    id = sys.argv[1]
except:  
    print('input argument error')
    sys.exit(0)


if r.llen(id) >= 5 and time.time() - float(r.lindex(id, 4)) <= 3600:  
    print("you are forbidden logining")
else:  
    print('you are allowed to login')
    r.lpush(id, time.time())
    # login_func()

本帖已经被管理员设置为: 精华帖 !
共收到 10 条回复 Redis 面试题 Python
pottieva#12年前 0 个赞

恩功能锁的实现。这个之前在百姓网的面试也遇到了。

不过我当时考虑的比较复杂,还用到了redis的事务。

pottieva#22年前 1 个赞

我实现的代码是这样的:

include_once('redis.php');

$key = "limit.check"; $limit = $argv[1]; $time = $argv[2];

class test{

protected $_key = '';
protected $_limit = NULL;
protected $_time = NULL;

public function __construct($key='limit.check',$limit,$time){
	$this->_key = $key;
	$this->_limit = $limit;
	$this->_time = $time;

	//清理已存在的键--测试用
	//$redis = new Redis();
	//$redis->delete($this->_key);
}
function getTime(){
	return date("Y-m-d H:i:s");
}

public function run(){
	$rdobj = new Redis();
	$listlen = $rdobj->llen($this->_key);
	if ($listlen < $this->_limit){
		$rdobj->push($this->_key,$this->getTime());
	}else{
		$once = $rdobj->lindex($this->_key,-1);
		if ($this->getTime-$once < $this->_time){
			echo "您的访问太快了!请稍后再试!";
			exit;
		}else{
			$rdobj->push($this->_key,$this->getTime());
			$rdobj->ltrim($this->_key,0,$limit-1);
		}
	}		
}

}

$t = new test($key,$limit,$time); $t->run();

ruyi#32年前 0 个赞

@pottieva #2楼 我也习惯用PHP了。

pottieva#42年前 0 个赞

@ruyi #3楼 是啊。。现在PHP、PYTHON、SHELL都写点。。越写越烂。

light#52年前 0 个赞

@ruyi #3楼 你的代码缺少像@pottieva 那样的限制列表长度的操作~~

mwb578410927#69个月前 0 个赞

你们怎么都这么厉害,都是dba吗?

weishu_yhr#76个月前 0 个赞

谢谢分享

yeats88#85个月前 0 个赞

IT智慧这个APP够吊,IT智慧运维APP(以下简称APP) IT智慧运维APP让你轻松、简单的维护服务器、数据库和网络系统,打造指尖上的IT运维,实现IT系统故障第一时间发现,并且能够自动化解决常见问题,将IT系统掌控于手掌之中。 同时,APP提供了技术社区、知识库,让你快速查找海量技术文档,运维问题快速发帖求助,第一时间解决你的技术疑难。 IT智慧运维APP有效提升运维团队的技术学习和问题处理能力,有效加强IT知识积累和沉淀。

APP适合什么样的场景? 有服务器、有业务系统需要维护的场景,需要实时监测服务器和业务系统,出现问题时紧急解决。 APP适合的人群? IT管理人员、技术维护人员、技术爱好者。 APP适合具有强大运维团队和的单位吗? 适合。将运维团队从繁杂的日常维护工作中解脱。 部署了监控系统,还需要上IT智慧运维APP吗? 需要。电脑版的传统的监控系统功能齐全,操作繁杂,缺乏时效性和及时性。APP特点“移动性和简便性”,使业务系统运行状态能实时提醒,极大提高IT系统的运行保障能力和水平。 “扫一扫”给你的服务器、数据库做个智能体检? 在信息时代,给你的IT设备贴上二维码标签,通过APP扫描轻松实现对服务器和数据库智能体检。 APP能解决复杂的运维故障吗? APP后端具有基于大数据的运维故障分析决策系统,能够快速为运维人员提供问题解决措施。 APP能做哪些监控管理? 各类服务器(小型机)、数据库(Oracle…)、存储(EMC、HDS、IBM…)、中间件、网络、安全设备、虚拟化、云资源监控及调度。 APP支持IT服务管理(ITSM)吗? APP支持ITSM全线管理,包括事件管理、问题管理、变更管理、配置管理、发布管理、请求管理、应急管理及客户服务管理。同时,可谓客户提供定制化的流程和服务。 HACMP集群系统、Oracle RAC集群出问题怎么办? APP具有强大的问题跟踪和诊断能力,可以快速给你解决问题,提供解决措施和建议,让复杂的技术维护,变得更加简单和高效。

admin#95个月前 0 个赞

@yeats88 请勿重复发广告贴,请尊重本社区,否则将做信息清理。

nulan#103个月前 0 个赞

感觉有点牛啊,这工作属于dba范围吗?

回复本帖 (需要登录)