Redis是一种基于内存的高性能键值数据库,它可以存储各种类型的数据,如字符串、列表、集合、散列、有序集合等。Redis支持为数据设置过期时间,当数据过期后,它就不会再被访问或者返回给客户端。这样可以有效地管理内存空间,避免数据过多导致内存溢出或者性能下降。
但是,Redis并不会立即删除过期的数据,而是采用了一种惰性删除和定期删除的混合策略来清理过期数据。这种策略既可以保证内存的及时回收,又可以避免对Redis的正常服务造成太大的影响。
惰性删除是指当客户端访问一个键时,Redis会先检查这个键是否已经过期,如果已经过期,就会删除这个键,并返回空值给客户端。这种方式可以保证过期数据不会被返回给客户端,但是它有一个缺点,就是如果有很多过期数据没有被访问,那么它们就会一直占用内存,直到被访问或者被定期删除。
定期删除是指Redis每隔一段时间会执行一个后台任务,从数据库中随机抽取一些键,检查它们是否已经过期,如果已经过期,就会删除这些键。这种方式可以主动地清理过期数据,释放内存空间,但是它也有一个缺点,就是如果抽取的键中有很多没有过期的键,那么它就会浪费很多时间和资源去检查这些键,而且可能会对Redis的性能造成影响。
为了平衡惰性删除和定期删除的优缺点,Redis提供了一些参数来调整这两种策略的执行频率和范围。例如:
1.maxmemory参数用来设置Redis可以使用的最大内存大小,当内存达到这个限制时,Redis会根据maxmemory-policy参数来决定如何处理新写入的数据。
2.maxmemory-policy参数用来设置当内存达到maxmemory限制时的淘汰策略,有以下几种可选值:
3.noeviction:不淘汰任何数据,只是返回错误给写入操作。
4.allkeys-lru:从所有键中按照最近最少使用(LRU)算法淘汰一部分键。
5.volatile-lru:从设置了过期时间的键中按照LRU算法淘汰一部分键。
6.allkeys-random:从所有键中随机淘汰一部分键。
7.volatile-random:从设置了过期时间的键中随机淘汰一部分键。
8.volatile-ttl:从设置了过期时间的键中按照剩余生存时间(TTL)淘汰一部分键。
9.maxmemory-samples参数用来设置在执行LRU或者TTL淘汰策略时每次抽取的样本数量,默认值为5。
10.hz参数用来设置后台任务执行的频率,默认值为10,表示每秒执行10次后台任务。后台任务包括定期删除过期数据,以及检查客户端的超时和缓冲区的大小等。