java操作redis中如何使用expire模拟指定时间段内限制ip访问的次数

71次阅读
没有评论

共计 2369 个字符,预计需要花费 6 分钟才能阅读完成。

行业资讯    
服务器    
云计算    
java 操作 redis 中如何使用 expire 模拟指定时间段内限制 ip 访问的次数

java 操作 redis 中如何使用 expire 模拟指定时间段内限制 ip 访问的次数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

    首先加入 maven 依赖,使用 JUinit 做单元测试。

dependency   
  groupId redis.clients /groupId 
 artifactId jedis /artifactId 
 version 2.7.0 /version 
  /dependency 
  
  dependency 
  groupId junit /groupId 
  artifactId junit /artifactId 
  version 3.8.1 /version 
  scope test /scope 
  /dependency

    redisutil 类,创建一个线程池,可以返回 redis 连接资源以及释放资源

/**
 * redis 工具类,从 redis 链接池中获取一个链接资源
 * @author Hades
 * time:2015 年 12 月 14 日
 */
public class RedisUtils {
 // 定义连接池
 public static JedisPool pool = null;
  *  获取链接资源
  * @return
  */
 public static synchronized Jedis getJedis() {if(pool==null){JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
 jedisPoolConfig.setMaxTotal(100);// 最大连接数
 jedisPoolConfig.setMaxIdle(10);
 jedisPoolConfig.setMaxWaitMillis(1000);// 类似于超时时间
 jedisPoolConfig.setTestOnBorrow(true);
 pool = new JedisPool(jedisPoolConfig, 192.168.57.133 ,6379);// 创建连接池
 Jedis jedis = pool.getResource();
 return jedis;
  *  释放链接资源
  * @param jedis
  */
 public static void returnJedis(Jedis jedis) {pool.returnResourceObject(jedis);
 }

    redis 客户端类,使用的是 juinit 做单元测试哈

/**
 * redis 测试类
 * @author Hades
 *
 */
public class RedisTest {static Jedis jedis =RedisUtils.getJedis();
 @Test
 public void test3() throws Exception {
 String ip = 192.168.57.2 // 访问的 ip
 // 测试
 for (int i = 0; i   20; i++) {boolean flag = testLogin(ip);
 System.out.println(flag);
  *  模拟限制 ip 指定时间段内访问次数
  * @param ip
  * @return
  */
 public boolean testLogin(String ip) {String value = jedis.get(ip);
 if(value==null){
 jedis.set(ip,  1 
 jedis.expire(ip, 60);// 设置过期时间 60 秒
 return true;
 }else{int parseInt = Integer.parseInt(value);
 //60 秒内访问超过 10 次,就禁止访问
 if(parseInt 10){
 System.out.println( 访问受限!!!!return false;
 jedis.incr(ip);
 return true;
 } 
  *  不使用管道   向 jedis 插入一万条数据消耗时间:3184
  */
 @Test
 public void test2() throws Exception{
 // TODO Auto-generated method stub
 long start = System.currentTimeMillis();
 for (int i = 0; i   10000; i++) {
 jedis.set( a +i, i+ 
 jedis.expire(a +i, 60);
 System.out.println(System.currentTimeMillis()-start);
  *  使用管道命令批量导入数据   所需时间:204
  * @throws Exception
  */
 @Test
 public void test4() throws Exception {long start = System.currentTimeMillis();
 Pipeline pipelined = jedis.pipelined();
 for (int i = 0; i   10000; i++) {
 pipelined.set( a +i, i+ 
 pipelined.expire(a +i, 60);
 pipelined.sync();
 System.out.println(System.currentTimeMillis()-start);
}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2369字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)