Entry

Redis内存淘汰策略

时光毁灭记忆、已成空白 提交于 2021-02-09 09:53:00
一、逻辑图 二、淘汰策略 // noeviction 当内存不足时,新写入操作会报错。 // allkeys-random 当内存不足时,在键空间中,随机移除某个key。 // allkeys-lru 当内存不足时,在键空间中,移除最近最少使用的key。 // volatile-lru 当内存不足时,在设置了过期时间的键空间中,移除最近最少使用的key // volatile-random 当内存不足时,在设置了过期时间的键空间中,移除随机某个key // volatile-ttl 当内存不足时,在设置了过期时间的键空间中,有更早过期时间的key优先移除 三、考点剖析 1、如何设置淘汰策略? //Redis.conf maxmemory-policy allkeys-lru 2、LRU算法的简单实现 import java.util.LinkedHashMap; import java.util.Map; public class LruCache<K, V> extends LinkedHashMap<K, V> { private final int maxCapacity; private final float DEFAULT_LOAD_FACTOR = 0.75f; public LruCache(int maxCapacity) { super(maxCapacity,

java8新特性:对map集合排序,根据key或者value操作排序(升序、降序)

瘦欲@ 提交于 2021-02-09 08:45:55
直接上代码: package com.drew.test; import java.util.List; import java.util.Map; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * @author zero 2019/04/08 */ public class Java8future { public static void main(String[] args) { Map <String, Integer> map = ImmutableMap.of("0", 3, "1", 8, "0.29", 7, "1.67", 3 ); System.out.println( "原始的map:" + map); System.out.println( "根据map的key降序:" + sortByKey(map, true )); System.out.println( "根据map的key升序:" + sortByKey(map, false )); System.out.println( "根据map的value降序:" + sortByValue

彻底弄懂HashMap

╄→尐↘猪︶ㄣ 提交于 2021-02-08 09:36:26
我们在面试中, 也会经常被问到HashMap相关的底层实现, 阿巴阿巴.... HashMap的底层实现 首先它是基于数组(存储对象的引用)加链表(存储对象)实现的 当我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象 简单的模拟实现put的底层实现 jdk1.8 put(k, v){ int code = k.hashcode(); //计算key的hashcode int index = code % table.length; // 存放的数组下表 table[index] = new Entry(k, v, null); // 对应的对象 } // 第二次插入 HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 table[index] = new Entry(k, v, table[index]); // todo 底层实现 若key相同时 返回并覆盖 否则插入链表的下一个节点 if (p

ELF文件简介

泪湿孤枕 提交于 2021-02-05 15:19:53
1. ELF文件简介 ELF文件主要有三种:可重定位的对象文件(Relocatable file,如:.o .ko文件),可执行的对象文件(Executable file,如:.out文件),可被共享的对象文件(Shared object file,如:.so文件) 2. ELF文件格式 ELF header: 描述整个文件的组织。 Program Header Table: 描述文件中的各种segments,用来告诉系统如何创建进程映像的。 sections 或者 segments:segments是从运行的角度来描述elf文件,sections是从链接的角度来描述elf文件,也就是说,在链接阶段,我们可以忽略program header table来处理此文件,在运行阶段可以忽略section header table来处理此程序(所以很多加固手段删除了section header table)。从图中我们也可以看出,segments与sections是包含的关系,一个segment包含若干个section。 Section Header Table: 包含了文件各个segction的属性信息,我们都将结合例子来解释。 ELF文件格式提供了两种视图,分别是链接视图和执行视图。链接视图是以节(section)为单位,执行视图是以段(segment)为单位

Spring Boot Admin 集成诊断利器 Arthas 实践

独自空忆成欢 提交于 2021-02-04 14:18:29
作者 | 阿提说说 来源| 阿里巴巴云原生公众号 前言 Arthas 是 Alibaba 开源的 Java 诊断工具,具有实时查看系统的运行状况;查看函数调用参数、返回值和异常;在线热更新代码;秒解决类冲突问题;定位类加载路径;生成热点;通过网页诊断线上应用。如今在各大厂都有广泛应用,也延伸出很多产品。 这里将介绍如何将 Arthas 集成进 Spring Boot 监控平台中。 SpringBoot Admin 为了方便,SpringBoot Admin 简称为 SBA(版本:1.5.x)。 1.5 版本的 SBA 如果要开发插件比较麻烦,需要下载 SBA 的源码包,再按照 Spring-boot-admin-server-ui-hystrix的形式 Copy 一份,由于 JS 使用的是 Angular,本人尝试了很久,虽然掌握了如何开发插件,奈何不会 Angular,遂放弃💀 版本:2.x 2.x 版本的 SBA 插件开发,官网有介绍如何开发,JS 使用 Vue,方便很多,由于我们项目还在使用 1.5,所以并没有使用该版本,请读者自行尝试。 不能使用 SBA 的插件进行集成,那还有什么办法呢?😅 SBA 集成 鄙人的办法是将 Arthas 的相关文件直接 Copy 到 Admin 服务中,这些文件都来自 Arthas-all 项目 Tunnel-server。 admin

JDK(八)JDK1.7&1.8源码对比分析【集合】HashMap

99封情书 提交于 2021-02-04 06:49:45
前言 在 JDK1.8源码分析【集合】HashMap 文章中,我们分析了HashMap在JDK1.8中新增的特性(引进了红黑树数据结构),但是为什么要进行这个优化呢?这篇文章我们通过对比JDK1.7和1.8来分析优化的原因。 众所周知,HashMap底层是基于 数组 + 链表 的方式实现的,不过在JDK1.7和1.8中具体实现稍有不同。 目录 一、对比分析 1. 1.7版本 2. 1.8版本 总结 一、对比分析 1. 1.7版本 1.7 中的数据结构图: 先来看看1.7中几个比较核心的成员变量: /** * The default initial capacity - MUST be a power of two. * 初始桶大小,因为底层是数组,所以这是数组的大小 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. * 桶最大值 */ static final int MAXIMUM

alibaba/Sentinel 分布式 系统流量防卫兵

好久不见. 提交于 2021-02-03 10:03:45
Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 Sentinel 的主要特性: Sentinel 的开源生态: Sentinel 分为两个部分: 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /

【iOS】图表实现-Charts(一)

回眸只為那壹抹淺笑 提交于 2021-02-03 09:30:38
前几天把AAChartsKit的使用简单写了写,官方使用说明已经写的很详细了。我也就不多说了,今天就讲讲Charts的使用。 0.简介 近期项目需要使用到折线图这样的图表功能,因此接触到了Charts这个框架,不得不说这个图表框架很强大,但是在GitHub上 Charts 的介绍也比较简单的介绍(直说了和MPAndroidChart类似,大部分使用方法一致),就写写自己的一点心得供大家参考。 Charts使用swift编写,它是仿照 MPAndroidChart 实现的。所以在安卓和iOS上可以实现一致的效果。如果你们的APP想在两端实现统一的效果,就可以使用这个图标库。 废话不多说了。开始讲解使用方法吧。 1.导入三方库 charts支持cocoapods导入,这就对大多数开发者比较方便了。但是就是使用cocoapdos也需要注意些地方。 由于charts使用swift编写,在swift编写的项目中使用比较方便,在这篇文章中就不详细描述了。但是现如今还是有很多项目使用oc编写,就如我的这个项目。这就需要了解一些oc和swift的桥接了。这就需要看别的文章了。回归正题,开始讲cocoapdos的导入吧。 (1)podfile的设置 (2)将工程中Pods的编译语言设置为SWIFT最新版本 build Settings ->Swift Language Version 改为最新版本

BAPI_GOODSMVT_CREATE物料凭证增强字段

人走茶凉 提交于 2021-02-02 07:23:47
项目MSEG 的 BAPI 表增强结构 BAPI_TE_XMSEG 抬头MKPF 的 BAIP 表增强 BAPI_TE_XMKPF 1. 在结构BAPI_TE_XMSEG中appending structure附加结构 ZMSEG_001,增加字段LSMNG, LSMEH In The method IF_EX_MB_Hi, you can update LSMNG quantity using EXTENSIONIN structures of BAPI_GOODSMVT_CREATE. The steps are the following: Add LSMNG field in BAPI_TE_XMSEG structure create an appending structure (char field) By SE19 transaction create the Enhancement Spot starting from MB_GOODSMOVEMENT Define the Badi Implementation choosing MB_BAPI_GOODSMVT_CREATE Badi Definition implementing a new customer class. --------------------- 作者:ChampaignWolf 来源

KafkaStream低级别API

南楼画角 提交于 2021-02-02 06:42:30
开发者可以通过Processor接口来实现自己的自定义处理逻辑。接口提供了Process和Punctuate方法。 其中:Process方法用于处理接受到的消息 Punctuate方法指定时间间隔周期性的执行,用于处理周期数据:例如某些状态值计算生成 新的流。 Processor接口还提供了init方法,init初始化方法可以将ProcessorContext转存到Procesor实例中,以供Prounctute使用。 可以使用context的schedule方法实现punctute的周期性调用。 将修改后的数据转存到下游处理节点:context.().forward 体检当前处理节点的处理进度:context.commit. 代码实例如下: public class MyProcessor extends Processor { private ProcessorContext context; private KeyValueStore kvStore; @Override @SuppressWarnings("unchecked") public void init(ProcessorContext context) { this.context = context; this.context.schedule(1000); this.kvStore =