zoukankan      html  css  js  c++  java
  • Redis

    一、简介

    LRU 实际上是被唯一支持的数据移除方法,同时也是 memcached 默认支持的缓存算法。

     

    二、配置内存大小

    在 redis.conf 文件中使用 maxmemory 指令能够配置内存大小。例子如下:

    // 配置内存限制为 100M
    maxmemory 100mb

    设置 maxmemory 为 0,表示没有内存限制。这是 64 位系统的默认行为,32 位的系统则使用 3G 大小作为隐式的内存限制。

    当指定的内存容量到达时,需要选择不同的策略。

     

    三、回收策略

    当 maxmemory 限制到达的时候,Redis 将采取的准确行为是由 maxmemory-policy 配置指令配置的。

    可用的策略如下

    • noeviction:当到达内存限制时返回错误。当客户端尝试执行命令时会导致更多内存占用(大多数写命令,除了 DEL 和一些例外)。
    • allkeys-lru:回收最近最少使用(LRU)的键,为新数据腾出空间。
    • volatile-lru:回收最近最少使用(LRU)的键,但是只回收有设置过期的键,为新数据腾出空间。
    • allkeys-random:回收随机的键,为新数据腾出空间。
    • volatile-random:回收随机的键,但是只回收有设置过期的键,为新数据腾出空间。
    • volatile-ttl:回收有设置过期的键,尝试先回收离 TTL 最短时间的键,为新数据腾出空间。

    一般经验规则:

    • 如果你期待一部分子集元素被访问得远比其他元素多,可以使用 allkeys-lru 策略。在你不确定时这是一个好的选择。
    • 如果你是循环周期的访问,所有的键被连续扫描,或者你期待请求正常分布(每个元素以相同的概率被访问),可以使用 allkeys-random 策略。
    • 如果你想能给 Redis 提供建议,通过使用你创建缓存对象的时候设置的 TTL 值,确定哪些对象应该被过期,你可以使用 volatile-ttl 策略。

    当你想使用单个实例来实现缓存和持久化一些键,allkeys-lru 和 volatile-random 策略会很有用。但是,通常最好是运行两个 Redis 实例来解决这个问题。

    另外值得注意的是,为键设置过期时间需要消耗内存,所以使用像 allkeys-lru 这样的策略会更高效,因为在内存压力下没有必要为键的回收设置过期时间。

    四、回收过程

    理解回收的过程是这么运作的非常的重要:

    • 一个客户端运行一个新命令,添加了新数据。
    • Redis 检查内存使用情况,如果大于 maxmemory 限制,根据策略来回收键。
    • 一个新的命令被执行,如此等等。

    五、近似的 LRU 算法

    Redis 的 LRU 算法并非完整的实现。这意味着 Redis 不能选择最佳候选键来回收,也就是最久前被访问的那些键。相反,会尝试运营一个近似的 LRU 算法,通过采样一小部分键,然后在采样键中回收最适合(拥有最久访问时间)的那个。

    Redis 的 LRU 算法有一点很重要,你可以调整算法的精度,通过改变每次回收时检查的采样数量。这个参数可以通过如下配置指令:

    maxmemory-samples 5

    Redis 没有使用真实的 LRU 实现的原因,是因为这会消耗更多的内存。然而,近似值对使用 Redis 的应用来说基本上也是等价的。

     

     

  • 相关阅读:
    sqlite数据库如何远程连接?
    redis的两种持久化方案
    Netty入门系列(1) --使用Netty搭建服务端和客户端
    使用MQ消息队列的优缺点
    Netty基础系列(3) --彻底理解NIO
    Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别
    Netty基础系列(1) --linux网路I/O模型
    Jedis异常解决:NOAUTH Authentication required
    java并发编程(2) --Synchronized与Volatile区别
    java并发编程(1) --并发基础及其锁的原理
  • 原文地址:https://www.cnblogs.com/xmsx/p/5391564.html
Copyright © 2011-2022 走看看