限制网站访客访问频率,超过限制24小时后重试
redis中键的生存时间(expire)
package cn.redis.demo;
import static org.junit.Assert.*;
import java.util.List;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Transaction;
public class RedisDemo {
String ip = "127.0.0.1";
int port = 6379;
Jedis jedis = new Jedis(ip, port);
/**
* 仅供测试使用,单机无连接池方式
* @throws Exception
*/
@Test
public void test1() throws Exception {
//获取到redis服务器的链接
jedis.set("guoxiaocha", "guoxiaocha");
String value = jedis.get("guoxiaocha");
System.out.println(value);// guoxiaocha
}
/**
* 单机连接池方式
* @throws Exception
*/
@Test
public void test2() throws Exception {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//指定连接池中最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//链接池中创建的最大连接数
jedisPoolConfig.setMaxTotal(100);
//设置创建链接的超时时间
jedisPoolConfig.setMaxWaitMillis(2000);
//表示连接池在创建链接的时候会先测试一下链接是否可用,这样可以保证连接池中的链接都可用的。
jedisPoolConfig.setTestOnBorrow(true);
//创建一个jedis连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, ip, port);
//从连接池中获取一个链接
Jedis jedis = jedisPool.getResource();
String value = jedis.get("guoxiaocha");
System.out.println(value);
//把连接返回给连接池
jedisPool.returnResource(jedis);
}
/**
* 限制网站访客的访问频率
* 一分钟之内最多访问10次
*/
@Test
public void test3() throws Exception {
String ip = "192.168.0.1";
for(int i=1;i<20;i++){
boolean flag = testLogin(ip);
if(flag){
System.out.println("正常访问"+i);
}else{
System.out.println("访问频繁,24小时后重试");
}
}
}
//根据用户的ip校验用户是否可以继续访问
private boolean testLogin(String ip) {
if(null!=jedis.get("date")){
logger.info("所需锁定还剩: "+jedis.ttl("date")+"秒");
return false;
}else{
String value = jedis.get(ip);
if(value==null){
jedis.incr(ip);
//设置ip的生存时间
jedis.expire(ip, 60);
}else{
int parseInt = Integer.parseInt(value);
if(parseInt>=10){
jedis.incr("date");
jedis.expire("date", 60*60*24);
return false;
}
jedis.incr(ip);
}
return true;
}
}
}