共计 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