redis设置过期时间

1为什么要设置redis过期时间

Redis 设置过期时间的意思是为一个 key 设置一个时间窗口,在这个时间窗口内,该 key 可以被访问和使用,到达时间窗口后,Redis 会自动删除过期的 key。可以使用 Redis 的 expire 命令或其他相关命令来设置一个 key 的过期时间。设置过期时间可以有效控制 Redis 中存储的数据量,避免占用过多的内存资源。同时,也可以通过过期时间来实现 Redis 中一些常见的应用场景,例如缓存、限流、分布式锁等。
补充
在 Redis 中,过期时间一到并不意味着键就会立即被删除。Redis 会以惰性删除的方式删除过期键,即在读取键的时候判断该键是否过期,如果过期则删除该键。这种删除方式虽然会导致过期键在一段时间内仍然占用内存空间,但是可以避免在非常频繁的情况下进行键的删除操作,从而提高 Redis 的性能。但是,如果 Redis 中的键长期没有被访问,过期时间也过了,而且内存空间也非常紧张,这时 Redis 可能会采用主动清理过期键的方式来释放内存空间。因此,如果对于 Redis 中的过期键需要立即删除,则可以使用 DEL 命令手动删除该键stringRedisTemplate.delete(key);或者使用 EXPIRE 命令将该键的过期时间重置为一个小于当前时间的值,以达到立即删除的效果。
Redis 的过期删除是异步的。当一个键过期时,Redis 并不会立即将其删除,而是将过期键添加到一个专门的待删除列表中,然后由单独的线程在后台异步删除这些过期键。这种异步删除的方式可以避免 Redis 在处理大量过期键时的性能瓶颈,并且在并发访问的情况下也能保证数据的一致性。同时,Redis 也提供了主动清理过期键的机制,当访问 Redis 中的键时,如果发现某个键已经过期,则 Redis 会立即删除该键。这种惰性删除的方式也是 Redis 提高性能的一种方式。需要注意的是,在 Redis 中,即使某个键已经过期,也不一定会立即被删除,因为 Redis 会定期地检查待删除列表,并删除那些过期时间已到的键。

2设置过期时间的分布式锁应用场景

可以通过 Redis 设置过期时间的特性来实现分布式锁。具体实现方法如下:

  1. 获取锁:使用 Redis 的 SETNX 命令来设置一个 key,如果该 key 不存在,则设置成功并获取到了锁,可以执行后续的业务逻辑。 Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "true");
  2. 设置过期时间:对于获取到锁的客户端,设置一个过期时间,这个过期时间要比业务执行时间长,保证在业务执行完成之前,锁不会过期。
  3. 释放锁:在业务执行完成之后,需要通过 DEL 命令来删除该 key,释放锁。
  4. 防止误释放:为了防止该客户端因为某种原因未能及时释放锁,导致锁过期后被其他客户端获取,可以使用 Redis 的 GETSET 命令来判断该 key 在删除的同时是否被修改,如果被修改,则说明有其他客户端已经更新了该 key,并获取到了锁。
    分布式锁是一个常见的分布式系统问题,使用 Redis 设置过期时间能够简单高效地实现分布式锁。需要注意的是,在使用 Redis 分布式锁时,应该考虑锁的粒度、过期时间、可重入性等问题,防止锁的误用或滥用导致系统性能下降或出现死锁等问题。
    补充
    SETNX 是 Redis 中的一个命令。用于设置一个值,并在该 key 不存在时设置该 key 的值。如果该 key 不存在,则设置成功并返回 1;如果该 key 已经存在,则不做任何操作,返回 0。SETNX 命令是一个原子操作,可以保证在高并发情况下多个客户端同时请求 SETNX 命令时,只有一个客户端能够成功获取到锁。因此,SETNX 命令常被应用于实现分布式锁的场景中。在分布式锁的实现中,SETNX 命令可以用来判断当前是否已有其他客户端获取到了锁,如果已经获取到了锁,则本次请求应该等待或者放弃获取锁的操作,避免出现脏数据。

3应用分布式锁的时候

redis应用到分布式锁的时候过期时间是一定要要设置的吗?
当 Redis 应用到分布式锁的时候,过期时间并不是一定要设置的,但是设置过期时间可以有效避免因为某个客户端异常导致锁一直被占用而无法被其他客户端获取的情况,从而避免出现死锁或者长时间的等待。在分布式系统中,很难保证所有客户端都按照正常的流程执行,因此为分布式锁设置过期时间可以更加安全地保护共享资源。同时,在设置过期时间的时候,应该根据业务的实际情况和系统的负载来调整过期时间,以达到既能保证并发安全,又能尽量避免因为过期时间过短而频繁获取锁、因为过期时间过长而导致资源被长时间占用的效果。

在Spring Cache中,你可以利用Redis作为缓存存储,并通过Redis的TTL(Time To Live,生存时间)特性来设置缓存数据的过期时间。首先,你需要在Spring Boot中配置Redis支持,然后在Spring Cache中创建一个`CacheManager`实例,指定Redis缓存。 以下是一个简单的步骤: 1. 添加依赖:在你的`pom.xml`文件中添加Spring Data Redis和Spring Boot Actuator的依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` 2. 配置Redis:在`application.properties`或`application.yml`中设置Redis的相关连接信息: ```properties spring.redis.host=your-redis-host spring.redis.port=6379 spring.redis.database=0 ``` 3. 创建`CacheManager`:在Spring Boot的主类上添加`@EnableCaching`注解,然后注入`RedisCacheManager`: ```java @EnableCaching public class Application { private static final String DEFAULT_CACHE_NAME = "myCache"; @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { SimpleCacheConfig config = new SimpleCacheConfig(); config.setExpireAfterWriteSeconds(30); // 设置默认的过期时间为30秒 return new RedisCacheManager(factory, DEFAULT_CACHE_NAME, config); } } ``` 4. 使用Cache:在需要缓存的service或repository中,直接使用`@Cacheable`或`@CacheEvict`注解操作缓存,如: ```java @Service @Cacheable(value = DEFAULT_CACHE_NAME, key = "#id") public MyEntity loadFromDatabase(Long id) { // 从数据库加载实体 } @CacheEvict(value = DEFAULT_CACHE_NAME, key = "#id") public void updateMyEntity(MyEntity entity) { // 更新数据库并移除对应缓存 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耳东哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值