详解Redis的LRU算法


当前第2页 返回上一页

至此,基于LRU的移除策略就分析完了。Redis里面还有一种基于LFU(访问频率)的移除策略,后面有时间再说。

JAVA 里面的LRU实现

JDK中的LinkedHashMap实现了LRU算法,使用如下构造方法,accessOrder 表示"最近最少未使用"的衡量标准。比如accessOrder=true,当执行java.util.LinkedHashMap#get元素时,就表示这个元素最近被访问了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

     * Constructs an empty <tt>LinkedHashMap</tt> instance with the

     * specified initial capacity, load factor and ordering mode.

     *

     * @param  initialCapacity the initial capacity

     * @param  loadFactor      the load factor

     * @param  accessOrder     the ordering mode - <tt>true</tt> for

     *         access-order, <tt>false</tt> for insertion-order

     * @throws IllegalArgumentException if the initial capacity is negative

     *         or the load factor is nonpositive

     */

    public LinkedHashMap(int initialCapacity,

                         float loadFactor,

                         boolean accessOrder) {

        super(initialCapacity, loadFactor);

        this.accessOrder = accessOrder;

    }

再重写:java.util.LinkedHashMap#removeEldestEntry方法即可。

The {@link #removeEldestEntry(Map.Entry)} method may be overridden to impose a policy for removing stale mappings automatically when new mappings are added to the map.

为了保证线程安全,用Collections.synchronizedMap将LinkedHashMap对象包装起来:

Note that this implementation is not synchronized. If multiple threads access a linked hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. This is typically accomplished by synchronizing on some object that naturally encapsulates the map.

实现如下:(org.elasticsearch.transport.TransportService)

1

2

3

4

5

6

7

final Map<Long, TimeoutInfoHolder> timeoutInfoHandlers =

        Collections.synchronizedMap(new LinkedHashMap<Long, TimeoutInfoHolder>(100, .75F, true) {

            @Override

            protected boolean removeEldestEntry(Map.Entry eldest) {

                return size() > 100;

            }

        });

当容量超过100时,开始执行LRU策略:将最近最少未使用的 TimeoutInfoHolder 对象 evict 掉。

参考链接:

  • Random notes on improving the Redis LRU algorithm
  • Using Redis as an LRU cache

最后,再扯一点与本文不相关的东西:关于数据处理的一些思考:
5G有能力让各种各样的节点都接入网络,就会产生大量的数据,如何高效地处理这些数据、挖掘数据(机器学习、深度学习)背后的隐藏的模式是一件非常有趣的事情,因为这些数据其实是人类行为的客观反映。举个例子,微信运动的计步功能,会让你发现:哎,原来每天我的活动量大概保持在1万步左右。再深入一步,以后各种工业设备、家用电器,都会产生各种各样的数据,这些数据是社会商业活动的体现,也是人类活动的体现。如何合理地利用这些数据呢?现有的存储系统能支撑这些数据的存储吗?有没有一套高效的计算系统(spark or tensorflow...)分析出数据中隐藏的价值?另外,基于这些数据训练出来的算法模型应用之后会不会带来偏见?有没有滥用数据?网上买东西有算法给你推荐,刷朋友圈会给你投针对性的广告,你需要借多少钱,贷多少款也会有模型评估,看新闻、看娱乐八卦也有算法推荐。你每天看到的东西、接触的东西,有很多很多都是这些"数据系统"做的决策,它们真的公平吗?在现实中如果你犯了错,有老师、朋友、家人给你反馈、纠正,你改了,一切还可以从头开始。可在这些数据系统之下呢?有纠错反馈机制吗?会不会刺激人越陷越深?就算你很正直、有良好的信用,算法模型也可能存在概率偏差,这是不是影响人类"公平竞争"的机会?这些都是数据开发人员值得思考的问题。

原文:https://www.cnblogs.com/hapjin/p/10933405.html

以上就是详解Redis的LRU算法的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

Redis集群和分布式区别

基于Redis无序集合实现禁止多端登录的方法

Redis实现批量删除的命令介绍

Redis 6.0版本新特性介绍

Redis怎么安装

Redis用在什么地方

Redis缓存满了怎么办

解决Redis存入数据出现乱码的问题

Redis 模糊匹配 searchkeys

Redis的分区实现

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...