ConcurrentHashMap 为什么使用ConcurrentHashMap 前文提到,HashMap无论任何版本都是线程不安全的。 但Hashtable会给整张表加悲观锁,仅允许单个线程独占,效率低下。 synchronizedMap加入了互斥锁mutex,在方法上加上synchronized,效率同样不高。 所以需要更低粒度的锁以换取更好的并发性能。 ConcurrentHashMap不允许null 无论是键还是值,ConcurrentHashMap都不允许使用null。 finalVputVal(Kkey,Vvalue,booleanonlyIfAbsent){ if(keynull...

  EYmIKSPPfzd2   2023年12月25日   21   0   0 concurrenthashmapConcurrentHashMap

快速幂(Exponentiationbysquaring)或者叫平方求幂,是一种求幂函数算法。 它可以以O(logN)的时间复杂度求任意乘方。 引入 如何求8的6次方? 常规算法: privatedoublepow(doublex,inty){ doubleresult=1; for(inti=0;i<y;i){ result=x; } returnresult; } 实际上,这样的暴力相乘并不高效。 再回想数学公式:$$a^na^n=a^{2n}\a^na^m=a^{n+m}$$那我们实际上可以理一下我们的思路,我们要计算6次方。 那么实际上可以将式子简化为:$$8^6=8^38^3...

  EYmIKSPPfzd2   2023年12月24日   21   0   0 快速幂快速幂

BitMap BitMap即位图,是一串连续的二进制(0或1)数组,通过偏移量(offset)定位元素,时间复杂度O(1)。 内部实现 BitMap本身使用String实现(sdshdr8)。 Redis将String的buf数组每个bit位都利用起来,表示一个BitMap。 需要注意offset从0开始。 >SETBITme101 0 >GETBITme10 1 >GETBITme1 0 >GETBITme11 0 获取1到11之间有几个1 >BITCOUNTme111 1 应用场景 特别适合一些数据量大且使用布尔值统计的场景。 签到及相关统计 签到中只有两种...

GEO GEO是用来存储并操作地理位置信息的数据类型。 随着移动互联网时代到来,LBS服务(Location-BasedService)愈发潮流,例如附近的建筑等。 GEO就是为了解决Redis对位置信息的存储需求而诞生的。 内部实现 GEO内部使用SortedSet集合类型,使用[GeoHash](GeohashWikipedia)编码方法实现了经纬度到SortedSet中元素权重分数的转换。 将经纬度保存到SortedSet中,利用SortedSet提供的“按权重进行有序范围查找”的特性,实现LBS服务中频繁使用的“搜索附近”的需求。 向locations添加 GEOADDlocation...

List List列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向列表添加元素。 List最大长度为2的32次方-1,即可以存储超过40亿元素。 >LPUSHmyList1234567 (integer)7 >RPUSHmyList0 (integer)8 >LRANGEmyList09 1)"7" 2)"6" 3)"5" 4)"4" 5)"3" 6)"2" 7)"1" 8)"0" 内部实现 List底层由双向链表或zipList实现。 遵循以下规则: 如果列表元素小于512个(默认值,由list-max-ziplist-entries配置更改),每个元素小于...

REDIS_SKIPLIST skipList,即:跳表,或者叫跳跃表。skiplist的优势是能支持平均O(logN)复杂度的节点查找。 用一句话来说:skiplist就是一个有着索引的list。 编码结构 简单理解 简单来说,skipList有多层“索引”以加快查找速度: 其中L1、L2和L3都是一个list。 当查找8时,从L3查找到5,再从L2从5开始查找,查找到7,再L3中从7开始查找,最终查找到8。 这样,原本需要8次查找的操作直接简化到了4次。 从源码理解 typedefstructzskiplist{ structzskiplistNodeheader,tail; unsig...

REDIS_INTSET intSet即为:整数集合,整数集合本质上是一块连续内存空间。 编码结构 typedefstructintset{ //编码方式 uint32_tencoding; //集合包含的元素数量 uint32_tlength; //保存元素的数组 int8_tcontents[]; }intset; 前两个属性encoding和length都用于规划这个set。本质上这个set的本体是contents。 虽然contents被声明为int8_t类型的数组,但是实际上contents数组并不保存任何int8_t类型的元素,contents数组的真正类型取决于intset结构...

REDIS_QUICKLIST quickList(快速列表)是Redis对List对象的一个实践。 在Redis3.0之前,List对象的底层数据结构是双向listNode或者zipList。 在Redis3.2更新中,List对象的底层改由quickList实现。 前文提到,zipList当元素个数比较多时,每当修改元素时,必须重新分配存储空间,对执行效率影响很大。 quickList本质上是listNode+zipList的组合,quickList的顶层设计就是一个链表,链表的每个节点就是一个zipList。 从源码分析结构 //QuickList顶层链表 typedefstructqu...

  EYmIKSPPfzd2   2023年12月15日   21   0   0 ListredisList链表链表Redis

REDIS_LISTNODE REDIS_LISTNODE本质上与Java的LinkedList一致,NodeList即为链表,是基本的线性结构。C语言原生没有对链表的支持,Redis对链表进行了实现。 listNode typedefstructlistNode{ structlistNodeprev; structlistNodenext; voidvalue; }listNode; listNode的结构较为简单,本质上只有三部分:prev(前节点),nex(后节点),value(值)。 其中前后节点分别为一个新的listNode。 list typedefstructlist{ l...

REDIS_STRING(SDS) SDS全称SimpleDynamicString(简单动态字符串),是专为Redis设计的简易字符串实现。 Redis并未采用C语言传统字符串char,而是自己设计了一套字符串实现标准。 传统字符串的缺陷 C语言字符串实际上就是一个以'\0'结尾的字符数组。 例如: charmyName="ErickRen"; 的结构即为: 该结构有个弊端,如果字符串内部有'\0',则C语言会误认为该字符串结束。 这个限制使得传统C语言字符串只能保存文本数据,不能保存图片、音频、视频等的二进制数据。 此外,C语言标准库中字符串操作函数非常不安全,一不小心就会缓冲区溢出。...

省流: 用一张图来解释top命令,它就是: 解释 Top命令用于显示Linux的运行状态,它提供了一个动态的,实时的系统监控视图。 一般情况下,这个命令会展示系统运行状态和各线程任务运行状态。 在这篇博客中,我将逐条解释其中的对应信息。 输入 top 后,会进入交互式命令模式。 按下q退出。 上述内容: top09:25:41up1min,3users,loadaverage:0.27,0.11,0.04 Tasks:127total,1running,126sleeping,0stopped,0zombie %Cpu(s):0.0us,0.0sy,0.0ni,100.0id,0.0wa...

  EYmIKSPPfzd2   2023年12月08日   11   0   0 linuxlinux

TheadLocal介绍及用法 ThreadLocal是线程的本地变量。当使用ThreadLocal维护变量时,它为每个线程提供独立的变量副本。 每一个线程可以独立地操作自己的变量,不受其他线程影响。 使用场景 作为数据副本,当某些数据是以线程为作用域并且不同线程有不同数据副本,使用ThreadLocal。 保存线程上下文信息,在任意需要的地方可以获取,避免显示传参。 解决线程安全问题,避免某些情况需要考虑线程安全必须同步带来的性能损失。 ThreadLocal与Synchronized ThreadLocal是与线程绑定的一个变量,其与Synchronized都用于解决多线程并发问题。 ...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~