`
powersoft
  • 浏览: 199217 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
53a63413-d61c-321e-8dc6-5008e88923c6
Redis官方文档翻译和源...
浏览量:191951
社区版块
存档分类
最新评论

Redis官方文档(8) ——使用Redis作为LRU缓存

阅读更多
Redis3.0官方文档(8)
——使用Redis作为LRU缓存


    当Redis作为缓存使用时,当你添加新的数据时,有时候很方便使Redis自动回收老的数据。这种行为在开发者社区中众所周知,因为这是流行的memcached 系统的默认行为。
    LRU实际上是被唯一支持的数据移除方法。本文内容将包含Redis的maxmemory指令,用于限制内存使用到一个固定的容量,也包含深入探讨Redis使用的LRU算法,一个近似准确的LRU。

    maxmemory配置指令(configuration directive)
    maxmemory配置指令是用来配置Redis为数据集使用指定的内存容量大小。可以使用redis.conf文件来设置配置指令,或者之后在运行时使用CONFIG SET命令。
    例如,为了配置内存限制为100MB,可以在redis.conf文件中使用以下指令
maxmemory 100mb

    设置maxmemory为0,表示没有内存限制。这是64位系统的默认行为,32位的系统则使用3G大小作为隐式的内存限制。
    当指定的内存容量到达时,需要选择不同的行为,即策略。Redis可以只为命令返回错误,这样将占用更多的内存,或者每次添加新数据时,回收掉一些旧的数据以避免内存限制。

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

    当没有满足前提条件的话,volatile-lru,volatile-random和volatile-ttl策略就表现得和noeviction一样了。
    选择正确的回收策略是很重要的,取决于你的应用程序的访问模式,但是,你可以在程序运行时重新配置策略,使用INFO输出来监控缓存命中和错过的次数,以调优你的设置。
    一般经验规则:
  • 如果你期待你的用户请求呈现幂律分布(power-law distribution),也就是,你期待一部分子集元素被访问得远比其他元素多,可以使用allkeys-lru策略。在你不确定时这是一个好的选择。
  • 如果你是循环周期的访问,所有的键被连续扫描,或者你期待请求正常分布(每个元素以相同的概率被访问),可以使用allkeys-random策略。
  • 如果你想能给Redis提供建议,通过使用你创建缓存对象的时候设置的TTL值,确定哪些对象应该被过期,你可以使用volatile-ttl策略。

    当你想使用单个实例来实现缓存和持久化一些键,allkeys-lru和volatile-random策略会很有用。但是,通常最好是运行两个Redis实例来解决这个问题。
    另外值得注意的是,为键设置过期时间需要消耗内存,所以使用像allkeys-lru这样的策略会更高效,因为在内存压力下没有必要为键的回收设置过期时间。

    回收过程(Eviction process)
    理解回收的过程是这么运作的非常的重要:
  • 一个客户端运行一个新命令,添加了新数据。
  • Redis检查内存使用情况,如果大于maxmemory限制,根据策略来回收键。
  • 一个新的命令被执行,如此等等。

    我们通过检查,然后回收键以返回到限制以下,来连续不断的穿越内存限制的边界。
    如果一个命令导致大量的内存被占用(像一个很大的集合交集保存到一个新的键),一会功夫内存限制就会被这个明显的内存量所超越。

    近似的LRU算法(Approximated LRU algorithm)
    Redis的LRU算法不是一个精确的实现。这意味着Redis不能选择最佳候选键来回收,也就是最久钱被访问的那些键。相反,会尝试运营一个近似的LRU算法,通过采样一小部分键,然后在采样键中回收最适合(拥有最久访问时间)的那个。
    然而,从Redis3.0开始,算法被改进为持有回收候选键的一个池子。这改善了算法的性能,使得更接近于真实的LRU算法的行为
    Redis的LRU算法有一点很重要,你可以调整算法的精度,通过改变每次回收时检查的采样数量。这个参数可以通过如下配置指令:
maxmemory-samples 5

    Redis没有使用真实的LRU实现的原因,是因为这会消耗更多的内存。然而,近似值对使用Redis的应用来说基本上也是等价的。下面的图形对比,为Redis使用的LRU近似值和真实LRU之间的比较。
    用于测试生成上面图像的Redis服务被填充了指定数量的键。键被从头访问到尾,所以第一个键是LRU算法的最佳候选回收键。然后,再新添加50%的键,强制一般的旧键被回收。
    你可以从图中看到三种不同的原点,形成三个不同的带。
  • 浅灰色带是被回收的对象
  • 灰色带是没有被回收的对象
  • 绿色带是被添加的对象

    在理论的LRU实现中,我们期待看到的是,在旧键中第一半会过期。而Redis的LRU算法则只是概率性的过期这些旧键。
    你可以看到,同样采用5个采样,Redis 3.0表现得比Redis 2.8要好,Redis 2.8中最近被访问的对象之间的对象仍然被保留。在Redis 3.0中使用10为采样大小,近似值已经非常接近理论性能。
    注意,LRU只是一个预言指定键在未来如何被访问的模式。另外,如果你的数据访问模式非常接近幂律,大多数的访问都将集中在一个集合中,LRU近似算法将能处理得很好。
    在模拟实验的过程中,我们发现使用幂律访问模式,真实的LRU算法和Redis的近似算法之间的差异非常小,或者根本就没有。
    然而,你可以提高采样大小到10,这会消耗额外的CPU,来更加近似于真实的LRU算法,看看这会不会使你的缓存错失率有差异。
    使用CONFIG SET maxmemory-samples <count>命令在生产环境上试验各种不同的采样大小值是很简单的。
===============================================================================
    大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。欢迎大家收听我的公众账号。
分享到:
评论

相关推荐

    redis-缓存文档

    - **Redis作为缓存**:通常用于存储那些经常被查询但很少被修改的数据,以此来减轻数据库的压力。 - **数据库**:主要用于存储应用程序的核心数据,支持复杂的事务处理、索引等高级功能。 - **操作方式**:Redis中的...

    redis本地缓存与redis缓存

    文件名称“RedisCache-master”可能是一个包含Redis缓存相关项目的源代码仓库,里面可能包括了如何配置、使用Redis作为缓存的示例代码,以及如何与本地缓存结合的实践。 总结来说,本地缓存和Redis缓存各有优势,...

    springMybatis+redis三级缓存框架

    在"springMybatis+redis三级缓存框架"中,MyBatis的二级缓存作为第一级,Redis作为第二级,而Redis中的缓存失效策略(例如LRU,TTL)则可以进一步优化数据的读取。如果一级缓存中未找到所需数据,系统会查询二级缓存...

    redis缓存分享,包含redis和redis测试的项目test

    使用Redis缓存时,我们需要注意缓存策略的选择,比如LRU(最近最少使用)或LFU(最不经常使用)算法来决定何时淘汰旧数据。此外,还可能涉及到缓存穿透、缓存雪崩和缓存击穿等问题及其解决方案。 "redis_test"可能...

    Redis用作二级缓存

    3. 编写Mybatis的配置:在mybatis-config.xml文件中,启用全局的二级缓存并指定使用Redis作为缓存实现。 ```xml &lt;!-- Redis相关配置 --&gt; ``` 4. 定义Mapper缓存:在每个Mapper接口或XML配置文件...

    使用Redis作为一个LRU缓存的时候,怎么做才能更高效.docx

    在使用Redis作为LRU缓存时,为了实现高效性能,我们需要了解如何配置和管理Redis的内存限制以及选择合适的驱逐策略。以下是一些关键知识点: 1. **Maxmemory设置**: - `Maxmemory`指令用于限制Redis实例的内存...

    Go-Go业务层缓存自带内存LRU存储支持自定义Redis存储实现

    在使用这个缓存库时,开发者可以首先配置内存LRU缓存,用于处理快速响应的短期数据存储。当需要存储更大量的数据或需要跨服务器共享时,可以无缝切换到自定义的Redis存储。这为应用程序提供了一种灵活的缓存策略,...

    spring + ehcache + redis两级缓存

    在Spring中,可以通过`RedisTemplate`或`StringRedisTemplate`来操作Redis,并配置`@EnableCaching`中的`CacheResolver`和`CacheManager`以使用Redis作为二级缓存。 3. **实现缓存策略**: 缓存策略决定了何时从...

    Node.js-基于Redis的Node.jsLRU缓存

    **Node.js中的LRU缓存与Redis的结合** 在现代Web开发中,高效的缓存管理是提高应用程序性能的关键。LRU(Least Recently Used)是最常用的缓存淘汰策略,它将最近最少使用的数据优先移出缓存,以腾出空间给新数据。...

    Redis_Redis分布式缓存_

    2. **LRU(Least Recently Used)淘汰策略**: 当内存达到预设限制时,Redis会根据LRU原则淘汰最近最少使用的键,保持缓存容量在合理范围内。 3. **LFU(Least Frequently Used)淘汰策略**: 另一种策略是LFU,淘汰...

    如何高效使用Redis作为LRU缓存

    在使用Redis作为LRU缓存之前,首先要设定`maxmemory`配置,以限制Redis实例所能使用的内存总量。这可以通过修改`redis.conf`文件或在运行时使用`config set`命令完成。例如,要将最大内存限制设置为100MB,可以在...

    REDIS缓存数据库在JAVA中的使用ppt

    在Java应用中,Redis常作为二级缓存使用。常见的缓存策略有LRU(Least Recently Used)、LFU(Least Frequently Used)等,可根据业务场景选择合适的策略。 10. **性能优化** 为了最大化Redis性能,需要注意以下...

    redis缓存的使用

    3. **Redis作为缓存** - **缓存策略**:可采用LRU(Least Recently Used)或LFU(Least Frequently Used)策略,自动淘汰过期或不常用的缓存。 - **缓存失效**:设置键的过期时间,或使用TTL(Time To Live)命令...

    redis缓存实例

    - **淘汰策略**: 当Redis内存达到预设上限时,可以通过LRU(最近最少使用)、LFU(最不经常使用)等策略自动淘汰旧的缓存。 5. **最佳实践** - **数据类型选择**: 根据需求选择适合的Redis数据类型,如字符串、...

    redis配置的文档

    15. **最大内存使用 (maxmemory)**: `maxmemory &lt;bytes&gt;` 设置 Redis 可用的最大内存,超过这个值将触发 LRU (Least Recently Used) 或 LFU (Least Frequently Used) 策略来淘汰旧数据。 16. **AOF 模式 (APPEND ...

    基于redis的缓存框架

    对比Spring Cache,自定义的Redis缓存框架可能更专注于Redis特性的利用,例如使用Sorted Set进行范围查询,或者使用Hashes存储复杂对象,从而提高数据访问效率。此外,自定义框架可以根据项目需求进行更精细化的定制...

    SSM整合Redis缓存Demo

    5. **缓存策略**:在项目中,Redis可能采用了不同的缓存策略,如LRU(最近最少使用)、LFU(最不经常使用)或者TTL(时间到活)等,以优化数据的存取。这些策略可以帮助确定何时将数据从内存移除,以便为新数据腾出...

    redis缓存demo

    本示例“redis缓存demo”旨在介绍如何在实际应用中使用Redis作为缓存。 首先,我们需要了解Redis的基本概念。Redis支持的数据类型包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted ...

    【redis】– 缓存(redis作为缓存使用)

    redis有两种使用方式一是作为数据库使用,二是作为缓存使用。 将redis作为缓存,当你新增数据时,让它自动地回收旧数据是件很方便的事情。这个行为在开发者社区非常有名,因为它是流行的memcached系统的默认行为。而...

    Redis缓存数据库

    描述虽然简短,但暗示了Redis的基本功能——作为一个数据库,它能够存储和管理数据;而作为缓存,它可以加速数据的访问速度。这通常是通过设置数据过期时间、LRU(最近最少使用)策略或者TTL(生存时间)来实现的,...

Global site tag (gtag.js) - Google Analytics