缓存
对于redis来说,既可以作为数据库又可以作为缓存,在大型分布式场景中,redis主要被用来作为缓存。所谓缓存其实指的是缓存数据,它不是一个全量数据,它应该随着数据的访问而变化,也就是所谓的热数据。
redis场景
redis中的数据怎么能随着业务的变化而只保留热数据,这是redis作为缓存的重要意义。为什么只保留热数据,究其原因内存大小是有限的,也就是瓶颈。当然如果内存无限大,自然没有这个问题,直接当数据库用好了。
在这种场景下,一般会有两个问题:
第一个自然是因为业务逻辑引发的过期时间问题
- 当从redis中读数据时,key的有效时间是不会延长的
- 当从redis中写数据时,key的过期时间会被剔除掉
- 在倒计时情况下,redis是不能延长的
- 定时
第二个是因为业务运转带来的缓存问题:因为内存是有限的,随着访问的变化,应该淘汰掉冷数据。
当达到maxmemory时,redis提供了两种缓存算法来回收内存:
- LRU(allkeys-lru):官方的解释是尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。大白话理解就是多久没碰他。
- LFU(volatile-lru):官方的解释是尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。大白话的理解就是碰了多少次。
过期判定原理
官方文档对什么时候过期做了大量篇幅的叙述,总的来说就两点:
- 被动访问时判定
- 周期轮循时判定(增量)
这样做的最终的目的是稍微牺牲下内存,保住了redis性能为王!