当前位置: 首页 > 知识库问答 >
问题:

RedisTemplate过期不起作用

佴淮晨
2023-03-14

我试图在redistemplate中测试expire方法。例如,我在redis中存储session,并尝试检索session,检查值是否相同。对于过期会话,我使用redisTemplate的expire()方法,对于获取过期会话,我使用getExpire()方法。但不管用。如何测试存储在Redis中的值?

//without import and fields
public class Cache() {     

    private StringRedisTemplate redisTemplate;

    public boolean expireSession(String session, int duration) {
      return redisTemplate.expire(session, duration, TimeUnit.MINUTES);    
    } 
}

//Test class without imports and fields 
public class TestCache() {  

    private Cache cache = new Cache(); 
    @Test
    public void testExpireSession() {
        Integer duration = 16;
        String session = "SESSION_123";
        cache.expireSession(session, duration);
        assertEquals(redisTemplate.getExpire(session, TimeUnit.MINUTES), Long.valueOf(duration));    
    }    
}

但是测试失败,导致AssertionError:

Update:我以为getExpire()方法不起作用,但实际上expire()方法也不起作用。它返回false。redisTemplate是一个用于测试类的SpringBean。TestCache类中还有许多其他测试方法可以正常工作。

共有1个答案

薛宇
2023-03-14

我设置了以下代码来在getExpire()(jedis 2.5.2,spring-data-redis 1.4.2.release)上执行测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {

    @Autowired
    private RedisTemplate<String, String> template;

    @Test
    public void contextLoads() {

        template.getConnectionFactory().getConnection().flushAll();

        assertFalse(template.hasKey("key"));
        assertFalse(template.expire("key", 10, TimeUnit.MINUTES));
        assertEquals(0, template.getExpire("key", TimeUnit.MINUTES).longValue());

        template.opsForHash().put("key", "hashkey", "hashvalue");

        assertTrue(template.hasKey("key"));
        assertTrue(template.expire("key", 10, TimeUnit.MINUTES));
        assertTrue(template.getExpire("key", TimeUnit.MINUTES) > 8);
    }

}

根据您的Redis配置,如果重新启动Redis实例,所有Redis数据都将消失。

您还应该向expiresession(asserttrue(cache.expiresession(session,duration));)添加一个断言,以确保过期有效。

 类似资料:
  • https://www.googleapis.com/calendar/v3/calendars/email/events?key=key&timemin=2021-07-15t00:00.000z&timemax=2021-07-17t00:00.000z&timezone=asia/calcutta 提前感谢!

  • 我正在尝试将字符串转换为日期,我希望该日期的格式为“yyyy-MM-d HH:MM:ss”,我不知道如何将该格式转换为字符串。我的问题是,我希望以上述格式获取日期,而不是字符串,而是“date”? 我是这样做的 通过使用上述代码,我以以下格式获取日期 但我希望日期格式为 注意:我希望此结果作为日期而不是字符串 请给我解决方案谢谢......

  • 问题内容: 以下HTML,Javascript和JSON可以正确呈现,但该过滤器根本不起作用。我们做错了什么? Javascript: 这两个JSON: api / distributors / my: api /仪表板/目录 问题答案: 角度过滤器无法将对象的对象作为输入。ng- repeat可以渲染它们,但是过滤器需要一个对象数组。解决此问题的最简单方法是让服务器返回没​​有命名键的数组。您还

  • 所以,基本上,前端使用reactJS,后端Spring Boot(微服务,zuul充当网关),当然,如果没有CORS的东西,他们什么也做不了。 我们使用了这段代码 它起作用了,但不再起作用了。我正在使用Postman检查发送回来的标头,但这些都不在那里。 我该怎么办?我可以在每个微服务中使用一个简单的CORS过滤器,但让Zuul处理这一切会容易得多。因为无论如何所有请求都会通过它。 有什么建议吗?

  • 我的pom.xml 招摇过市配置 服务器日志 它说映射: 但这些都不起作用(404): 如果我使用sping-fox较低版本,那么我将在我的日志中得到它已映射{[/v2/api-docs}],方法=[GET]。但是,我看不到在那里生成的任何json。

  • 问题内容: 我有以下测试: 但是JUnit报告说,测试失败了,尽管它按预期方式抛出。 我是否需要配置其他东西才能运行此程序? 我现在用 当我删除前缀时,仍然出现错误。 我得说我是在Eclipse上运行这些测试,但它配置为使用JUnit 4 Runner。 问题答案: 问题是,嵌套测试的类是的扩展。由于这是JUnit 3样式,因此注释不起作用。 现在,我的测试班是一个单独的班。