珠宝网站制作的理念,yum安装wordpress,WordPress提高打开速度,黄石网络推广缓存淘汰策略 生产上redis内存设置为多少
设置为最大内存的 3/4
redis 会占用物理机多少内存
默认大小是 0#xff0c;64 位系统下表示不限制内存大小#xff0c;32位系统表示 3G
如何设置修改redis内存大小
config get maxmemory 查看修改方式 配置文件 单位是字节 2.…缓存淘汰策略 生产上redis内存设置为多少
设置为最大内存的 3/4
redis 会占用物理机多少内存
默认大小是 064 位系统下表示不限制内存大小32位系统表示 3G
如何设置修改redis内存大小
config get maxmemory 查看修改方式 配置文件 单位是字节 2. font stylecolor:#000000;临时修改重启后失效 config set maxmemory 104857600/font如果redis内存满了会怎么样
redis 将会报错(error) OOM command not allowed when used memory ‘maxmemory’
通过命令查看 redis 内存使用情况?
info memory redis 对于过期 key 的三种不同删除策略
定时删除创建kv的同时cpu会创建定时器内存友好cpu占用高
惰性删除再次访问这个 key 的时候才会去检查过期时间内存不友好 定时删除每隔一段时间去抽样扫描一定注意不是所有数量的key是否过期并可通过限制执行的频率和时长来控制对 cpu 的影响折中但可能存留较多过期key并且需要根据具体情况合适的设置频率和时长
如果执行时间太长退化成定时。太短则又会出现过期key太多
引出兜底方案缓存淘汰策略
redis 缓存淘汰策略
8种内存淘汰策略
noevition: 不操作 默认看上面oom案例allkeys-lru: 对所有 key 使用 lruvolatile-lru: 对所有设置了过期时间的key lruallkeys-randomvolatile-randomvolatile-ttl: 删除快要过期allkeys-lfu lfuvolatile-lfu
修改 - maxmemory-policy 总结记忆
2个维度 过期键中筛选 allkeys所有键中筛选 volatile 4个方面 lru 最少使用最长时间未被使用lfu 最不常用一段时间内使用次数最少random 随机ttl
用哪种 后两种都对业务有精确的要求推荐 allkeys-lru
lru算法手写最近最少使用算法
leetcode 146 哈希链表 基于 LinkedHashMap 的写法 public class LruCacheDemoK,V extends LinkedHashMapK,V {private int capacity;public LruCacheDemo(int capacity) {super(capacity, 0.75f, false); // true accessOrder false insertionOrderthis.capacity capacity;}Overrideprotected boolean removeEldestEntry(Map.EntryK, V eldest) {return super.size() capacity;}public static void main(String[] args) {LruCacheDemo lruCacheDemo new LruCacheDemo(3);lruCacheDemo.put(1, 1);lruCacheDemo.put(2, 2);lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.keySet());lruCacheDemo.put(4, 4);System.out.println(lruCacheDemo.keySet());lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.keySet());lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.keySet());lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.keySet());lruCacheDemo.put(5, 5);System.out.println(lruCacheDemo.keySet());}
}
/*** true* [1, 2, 3]* [2, 3, 4]* [2, 4, 3]* [2, 4, 3]* [2, 4, 3]* [4, 3, 5]*/
// false只看插入顺序不看访问顺序多次插入33的位置不变
/*** false*[1, 2, 3]* [2, 3, 4]* [2, 3, 4]* [2, 3, 4]* [2, 3, 4]* [3, 4, 5]*/手写的案例
// 手写 LruCache
public class MyLruCacheDemo {// map 负责查找构建一个虚拟的双向链表它里面安装的就是一个个Node节点作为数据载体// 1 构造一个 Node 作为数据载体class NodeK, V {K key;V value;NodeK, V prev;NodeK, V next;public Node() {this.prev this.next null;}}//2 构建一个虚拟的双向链表里面安放的就是我们的Nodeclass DoubleLinkedListK, V {NodeK, V head;NodeK, V tail;// 2.1 构造方法public DoubleLinkedList() {head new NodeK, V();tail new NodeK, V();head.next tail;tail.prev head;}//2.2 添加到头public void addFirst(NodeK, V node) {node.next head.next;node.prev head;head.next.prev node;head.next node;}//2.3 删除节点public void remove(NodeK, V node) {node.prev.next node.next;node.next.prev node.prev;node.prev null;node.next null;}//2.4 获得最后一个节点public NodeK, V getLast() {return tail.prev;}}private int cacheSize;MapInteger, NodeInteger, Integer map;DoubleLinkedListInteger, Integer doubleLinkedList;public MyLruCacheDemo(int cacheSize) {this.cacheSize cacheSize; // 坑位map new HashMap(); // 查找doubleLinkedList new DoubleLinkedList();}public int get(int key) {if (!map.containsKey(key)) {return -1;}NodeInteger, Integer node map.get(key);doubleLinkedList.remove(node);doubleLinkedList.addFirst(node);return node.value;}// saveOrUpdatepublic void put(int key, int value) {if (map.containsKey(key)) { // updateNodeInteger, Integer node map.get(key);node.value value;doubleLinkedList.remove(node);doubleLinkedList.addFirst(node);} else {if (map.size() cacheSize) { // 坑位满了NodeInteger, Integer last doubleLinkedList.getLast();map.remove(last.key);doubleLinkedList.remove(last);}// 才是新增NodeInteger, Integer node new Node();node.key key;node.value value;map.put(key, node);doubleLinkedList.addFirst(node);}}public static void main(String[] args) {MyLruCacheDemo lruCacheDemo new MyLruCacheDemo(3);lruCacheDemo.put(1, 1);lruCacheDemo.put(2, 2);lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(4, 4);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(5, 5);System.out.println(lruCacheDemo.map.keySet());}
}