Redis内存消除是指Redis可以主动从实例中删除用户存储的某些键,从而导致读取未命中的事实。那么,Redis为什么具有此功能?这是我们需要探索的设计的初衷。Redis的两种最常见的应用场景是缓存和持久性存储。首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?
内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。
作为Redis用户,我如何使用Redis提供的这个特性呢?看看下面配置
#maxmemory
我们可以通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能,至于这个值有什么意义,我们可以通过了解内存淘汰的过程来理解它的意义:
1.客户端发起了需要申请更多内存的命令(如set)。
2.Redis检查内存使用情况,如果已使用的内存大于maxmemory则开始根据用户配置的不同淘汰策略来淘汰内存(key),从而换取一定的内存。
3.如果上面都没问题,则这个命令执行成功。
maxmemory为0的时候表示我们对Redis的内存使用没有限制。
Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:
·noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
·allkeys-lru:在主键空间中,优先移除最近未使用的key。
·volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
·allkeys-random:在主键空间中,随机移除某个key。
·volatile-random:在设置了过期时间的键空间中,随机移除某个key。
·volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
这是对主密钥空间和具有到期时间设置的密钥空间的补充。例如,假设我们在Redis中存储了一批密钥,那么有一个哈希表用于存储这批密钥及其值,如果这批密钥是某些密钥设置了过期时间,那么这批密钥的键也将存储在另一个哈希表中。该哈希表中的值对应于密钥集的到期时间。为其设置了到期时间的密钥空间是主密钥空间的子集。
我们了解了Redis大概提供了这么几种淘汰策略,那么如何选择呢?淘汰策略的选择可以通过下面的配置指定:
#maxmemory-policynoeviction
但是这个值填什么呢?为了解决这个问题,我们需要了解我们的应用程序如何请求访问Redis中存储的数据集以及我们的吸引力。同时,Redis还支持运行时来修改消除策略,这使我们能够实时调整内存消除策略,而无需重新启动Redis实例。
下面看看几种策略的适用场景:
·allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
·allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
·volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。
另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。
推荐阅读:java架构师培训:java最佳测试框架JBehave的基本介绍
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1160405674,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!