Redis key的过期时间和永久有效分别怎么设置?
expire | pexpire | persist | |
---|---|---|---|
接口定义 | expire key "seconds" | pexpire key "milliseconds" | persist key |
接口描述 | 设置一个key在当前时间"seconds"(秒)之后过期;返回1代表设置成功,返回0代表key不存在或者无法设置过期时间 | 设置一个key在当前时间"milliseconds"(毫秒)之后过期;返回1代表设置成功,返回0代表key不存在或者无法设置过期时间 | 移除key的过期时间,将其转换为永久状态;如果返回1,代表转换成功;如果返回0,代表key不存在或者之前就已经是永久状态 |
如何保证redis中的数据都是热点数据?
对于保留 Redis 热点数据来说,我们可以使用 Redis 的内存淘汰策略来实现,可以使用allkeys-lru内存淘汰策略,该淘汰策略是淘汰Redis 的数据中最近最少使用的数据,这样频繁被访问的数据就可以保留下来了
redis过期数据的处理(过期策略)/Redis回收进程如何工作的?
在 redis 中,对于已经过期的数据,Redis 采用两种策略来处理这些数据,分别是惰性删除和定期删除
- 定时删除:Redis会在设置键的过期时间时,同时创建一个定时器,当键过期时,定时器会立即删除该键
- 惰性删除:在访问一个键时,Redis会先检查该键是否过期,如果过期则删除,否则返回数据;这种策略可以减少删除操作对性能的影响,但可能会导致过期键在一段时间内仍然存在
- 定期删除:Redis会每隔一段时间,对数据库中的一部分过期键进行删除操作;通过控制每次删除的数量和频率,可以平衡删除操作对性能的影响
Redis回收使用的是什么算法?
Redis回收使用采用的是近似LRU算法(least recently used )也就是跟LRU算法(淘汰最近最少使用的数据)很像,但是不是LRU算法,适合于热点数据的处理上
首先,针对问题本身,我们需要淘汰的是最近未使用的相对比较旧的数据淘汰掉,那么,我们是否一定得非常精确地淘汰掉最旧的数据还是只需要淘汰掉比较旧的数据?
咱们来看下Redis是如何实现的;Redis做法很简单:随机取若干个key,然后按照访问时间排序,淘汰掉最不经常使用的数据;为此,Redis给每个key额外增加了一个24bit长度的字段,用于保存最后一次被访问的时钟(Redis维护了一个全局LRU时钟lruclock:REDIS_LUR_BITS,时钟分辨率默认1
Redis的内存淘汰策略
定期没有删除掉,又很久没有访问这个 key,因此不会引起惰性删除,当这样的数据越来越多的时候,会占用很大的内存;当redis的内存超过最大允许的内存之后,Redis会触发内存淘汰策略,删除一些不常用的数据,以保证redis服务器的正常运行
Redis的内存淘汰策略用于在内存不足时选择要淘汰的键(key),以释放内存空间
过期策略有哪些?
- `noeviction`:禁止淘汰策略,当内存不足时,Redis会返回错误,不允许写入操作。这种策略适用于需要确保数据完整性的场景
- `allkeys-lru`:Least Recently Used(LRU)算法;在所有键中,选择最近最少使用的键进行淘汰。这是Redis默认的内存淘汰策略
- `allkeys-lfu`:Least Frequently Used(LFU)算法;在所有键中,选择最不经常使用的键进行淘汰。根据键的访问频率进行淘汰,使用频率低的键更容易被淘汰
- `volatile-lru`:在设置了过期时间的键中,选择最近最少使用的键进行淘汰;这种策略适用于缓存场景,可以优先淘汰很少访问的过期键
- `volatile-lfu`:在设置了过期时间的键中,选择最不经常使用的键进行淘汰;根据键的访问频率进行淘汰,使用频率低的过期键更容易被淘汰
- `volatile-ttl`:在设置了过期时间的键中,选择剩余过期时间最短的键进行淘汰;这种策略适用于需要尽量保留剩余有效期较长的键的场景
可以通过配置Redis的maxmemory-policy参数来选择使用哪种过期策略或者使用CONFIG SET命令来设置过期策略。例如,使用Java代码设置过期策略为volatile-lru:
Jedis jedis = new Jedis("localhost");
jedis.configSet("maxmemory-policy", "volatile-lru");
Redis主要消耗什么物理资源?
- 内存(Memory):Redis主要将数据存储在内存中,因此内存是最重要的物理资源;Redis使用高效的数据结构和算法来最大程度地减少内存占用,但仍需足够的内存来存储数据和执行操作
- CPU(Central Processing Unit):Redis是单线程的,使用事件驱动模型来处理客户端请求和其他操作;因此,Redis对CPU的需求相对较低,但在高并发情况下,CPU的性能仍然会对Redis的响应能力产生影响
- 磁盘(Disk):Redis可以使用持久化机制将数据写入磁盘,以便在重启后恢复数据;磁盘主要用于存储持久化文件(如RDB和AOF文件),以及用于操作系统的虚拟内存交换
- 网络带宽(Network Bandwidth):Redis作为一个服务器,需要与客户端进行通信。网络带宽用于传输客户端请求和响应数据;在高并发的情况下,网络带宽可能成为Redis的瓶颈
Redis的内存用完了会发生什么?
- 写入操作失败:当Redis无法分配更多内存时,写入操作(如SET、HSET等)将失败,并返回错误;这是因为Redis需要将数据存储在内存中,如果没有足够的内存可用,无法继续写入新的数据
- 读取操作正常:尽管内存用完,但Redis仍然可以处理读取操作(如GET、HGET等),因为读取操作不会修改数据,只是从内存中读取数据并返回给客户端
- 内存淘汰策略生效:当内存用完时,Redis会根据配置的内存淘汰策略选择要淘汰的键,以释放部分内存空间;这样可以为新的写入操作腾出一些内存空间
- 持久化操作受影响:如果使用了持久化机制(如RDB或AOF),当内存用完时,Redis可能无法执行持久化操作;这可能导致数据在内存中修改后未及时持久化到磁盘上,存在数据丢失的风险
为了避免内存用完的情况,可以采取以下措施:
- 监控内存使用情况:定期监控Redis的内存使用情况,及时发现内存占用过高的情况
- 合理配置内存:根据业务需求和数据量大小,合理配置Redis的最大内存限制,避免过度使用内存
- 优化数据结构和算法:使用合适的数据结构和算法,减少内存占用
- 使用分片或集群:将数据分片到多个Redis实例或使用Redis Cluster,以扩展内存容量
- 考虑使用内存淘汰策略:根据业务需求和数据访问模式,选择合适的内存淘汰策略,以平衡内存使用和数据访问性能
Redis如何做内存优化?
- 使用合适的数据结构:选择合适的数据结构可以减少内存占用。例如,使用Hash数据结构来存储具有相同字段的对象,可以减少重复的字段占用的内存。另外,使用BitSet来存储布尔类型的数据,可以大大减少内存占用
- 压缩存储:Redis提供了对字符串类型的压缩存储支持;通过使用压缩算法,可以减少字符串类型数据的内存占用;可以使用`setbit`命令将字符串类型的值压缩为位图,从而减少内存占用
- 设置合理的过期时间:对于不再使用的数据,可以设置合理的过期时间,让Redis自动淘汰这些数据;通过设置适当的过期时间,可以避免存储过期或无用的数据,从而节省内存空间
- 使用内存淘汰策略:选择适合业务需求的内存淘汰策略,可以在内存不足时合理地淘汰一些键,释放内存空间。例如,可以使用LRU(Least Recently Used)策略淘汰最近最少使用的键,或者使用LFU(Least Frequently Used)策略淘汰最不经常使用的键
- 分片或集群:将数据分片到多个Redis实例或使用Redis Cluster,可以扩展内存容量。通过将数据分布在多个节点上,可以将数据分散存储,减少单个节点的内存压力
- 合理配置内存参数:根据实际需求,合理配置Redis的最大内存限制。可以使用`maxmemory`参数来限制Redis使用的最大内存量,避免过度使用内存
通过以上方法,可以有效地进行Redis的内存优化,减少内存占用并提升性能;需要根据具体的业务需求和数据特点来选择和实施适合的优化策略