那么具体设置成哪种淘汰策略呢?
这就是要看在使用Redis时的具体场景了,如果只是用Redis做缓存的话,那么可以配置allkeys-lru或allkey-random,客户端在写缓存的时候并不用携带着过期时间。若是还想要用持久化的功能,那么就应该使用volatile-开头的策略,这样可以保证每月设置过期时间的key不会被淘汰。
内存淘汰策略的配置如下:
# 最大使用内存 maxmemory 5m # 内存淘汰策略 The default is:noeviction maxmemory-policy allkeys-lru LRU算法LRU算法的实现,其实可以靠一个链表。链表按照使用情况来进行排序,当空间不足时,会剔除掉尾部的数据。当某个元素被访问时它会被移动到链表头。
在真实的面试中,若是让写出LRU算法,我认为可以使用Java中的LikedHashMap来实现,因为LikedHashMap已经实现了基本的LRU功能,我只需要封装一下就改造成了自己的了。
/** * @author Jimoer * @description */ public class MyLRUCache<K,V> { // lru容量 private int lruCapacity; // 数据容器(内存) private Map<K,V> dataMap; public MyLRUCache(int capacity){ this.lruCapacity = capacity; // 设置LinkedHashMap的初始容量为LRU的最大容量, // 扩容因子为默认的0.75,第三个参数是否将数据按照访问顺序排序。 dataMap = new LinkedHashMap<K, V>(capacity, 0.75f, true){ @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { // 当数据量大于lruCapacity时,移除掉最老使用的数据。 return super.size()>lruCapacity; } }; } public V get(K k){ return dataMap.get(k); } public void put(K key, V value){ dataMap.put(key,value); } public int getLruCapacity() { return lruCapacity; } public Map<K, V> getDataMap() { return dataMap; } }测试代码:
@Test public void lruTest(){ // 内存容量为3,即存储3条数据后,再放入数据,就会将最老使用的数据删除 MyLRUCache myLRUCache = new MyLRUCache(3); myLRUCache.put("1k","张三"); myLRUCache.put("2k","李四"); myLRUCache.put("3k","王五"); // 容量已满 System.out.println("myLRUCache:"+JSON.toJSONString(myLRUCache.getDataMap())); // 继续放入数据,该删除第一条数据为第四条数据腾出空间了 myLRUCache.put("4k","赵六"); // 打印出结果 System.out.println("myLRUCache:"+JSON.toJSONString(myLRUCache.getDataMap())); }运行结果:
myLRUCache:{"1k":"张三","2k":"李四","3k":"王五"} myLRUCache:{"2k":"李四","3k":"王五","4k":"赵六"} 总结好了,Redis的相关知识,就总结到这里了,算上前面两篇博文(Redis基础数据结构总结、你说一下Redis为什么快吧,怎么实现高可用,还有持久化怎么做的),这是Redis的第三篇了,这一篇博文也是新年的第一篇,元旦假期在家花了两天时间,自己学习自己总结。元旦假期结束后,我要继续面试了,后面我会继续将我面试中遇到的各种问题,总结出来,一是增加自己的知识面,二也将知识进行的传播。
毕竟独乐乐不众乐乐