1.key过期删除策略
定时删除
它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。
但是有得必有失。 Redis的操作频率是非常高的。绝大多数的键都是携带过期时间的,这样就会造成出现大量定时器执行,严重降低系统性能。
总的来说:该策略对内存空间足够友好, 但对CPU非常不友好,会拉低系统性能,因此不建议使用。
惰性删除
为了解决定时删除会占用大量CPU资源的问题, 因此产生了惰性删除。
它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。
定期删除
Redis为了平衡定时删除和惰性删除,采用了定期删除。
- 默认每秒运行10次会对具有过期时间的key进行一次扫描,但是并不会扫描全部的key,因为这样会大大延长扫描时间。
- 每次默认只会随机扫描20个key,同时删除这20个key中,已经过期的key。
- 如果这20个key中过期key的比例达超过25%,则继续扫描。
通过在配置文件中配置 hz 10,来设置每秒的扫描次数。
2.内存淘汰策略
为什么需要内存淘汰策略:有一些已经过期的key,定期扫描一直都没有扫描到它,而且这些key也一直没有被使用。 那么它们就会一直在内存中存在。同时继续向Redis不断插入新数据,最终会造成内存空间不足的问题。
最大内存参数配置:通过修改配置文件maxmemory 参数,在64位操作系统中,如果未设置或设置0,代表无限制。而在32位系统中,默认内存大小为3GB。但是实际生产环境下,一般会设置物理内存的四分之三左右。
2.1 策略详解
当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略。
在Redis中默认提供了三类八种淘汰策略。
对于这些策略各自的含义,我们还需要一点前置知识的铺垫,这里我们可以看到两个名称:lru、lfu,他俩是什么意思呢?
他们的学名叫做:数据驱逐策略。 其实所谓的驱逐就是将数据从内存中删除掉。
- lru:Least Recently Used,它是以时间为基准,删除最近最久未被使用的key。
- lfu:Least Frequently Used,它是以频次为基准,删除最近最少未被使用的key。
那理解了lru和lfu之后,我们再回来看这三类八种内存淘汰策略各自的机制。
对于LRU和TTL相关策略,每次触发时,redis会默认从5个key中一个key符合条件的key进行删除。如果要修改的话,可以修改redis.conf中maxmemory-samples属性值
2.2 策略设置
redis默认使用noeviction,我们可以通过修改redis.conf中maxmemory-policy属性值设置不同的内存淘汰策略。
2.3 不同策略的使用场景
1、Redis只做缓存,不做DB持久化,使用allkeys。如状态性信息,经常被访问,但数据库不会修改。
2、同时用于缓存和DB持久化,使用volatile。如商品详情页。
3、存在冷热数据区分,则选择LRU或LFU。如热点新闻,热搜话题等。
4、每个key被访问概率基本相同,选择使用random。如企业内部系统,访问量不大,删除谁对数据库也不造成太大压力。
5、根据超时时间长久淘汰数据,选择选用ttl。如微信过期好友请求。
3.Redis 的全称
Remote Dictionary Server。
4.Redis中一个字符串类型的值能存储最大容量是多少
Redis 中的字符串类型可以存储的最大字节数为 512 MB.
5.Redis 集群方案什么情况下会导致整个集群不可用
有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就
会以为缺少 5501-11000 这个范围的槽而不可用。
6.MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
1. 热点数据识别
- 访问频率分析:通过分析 MySQL 中的数据访问频率,识别出最常被访问的数据。可以使用日志分析工具或数据库查询来统计每个数据的访问次数。
- 使用缓存统计:在应用层面,记录每个数据的访问次数,定期将访问频率高的数据存入 Redis。
2. 数据预热
- 预加载热点数据:在应用启动时,预先将识别出的热点数据加载到 Redis 中。可以通过定时任务或在用户访问时动态加载。
- 使用 LRU 策略:Redis 支持 LRU(Least Recently Used)缓存淘汰策略,可以配置 Redis 以自动淘汰不常用的数据,确保热点数据在内存中。
7.Redis key 的过期时间和永久有效分别怎么设置
- 使用 EXPIRE、SET ... EX 或 PEXPIRE 命令可以设置键的过期时间。
SET mykey "Hello, Redis!"
EXPIRE mykey 60 # 设置 mykey 在 60 秒后过期
SET mykey "Hello, Redis!" EX 60 # 设置 mykey 的值为 "Hello, Redis!",并在 60 秒后过期
SET mykey "Hello, Redis!"
PEXPIRE mykey 1500 # 设置 mykey 在 1500 毫秒后过期
- 使用 PERSIST 命令可以取消键的过期时间,使其永久有效。
SET mykey "Hello, Redis!" EX 60 # 设置 mykey 在 60 秒后过期
PERSIST mykey # 取消 mykey 的过期时间,使其永久有效
- 如果在设置键时不指定过期时间,键将默认是永久有效的。
8.Redis 如何做内存优化?
尽可能使用散列表(hash),散列表(是说散列表里面存储的数少)使用的内存非常小,
所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个
用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户
的所有信息存储到一张散列表里面.