redis 实现限制网站访客访问频率,超过限制24小时后重试(例如:1分钟最多访问10次)

限制网站访客访问频率,超过限制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;
	    }
	}
}
发布了7 篇原创文章 · 获赞 0 · 访问量 67

猜你喜欢

转载自blog.csdn.net/weixin_44570041/article/details/104551745