- 博客(12)
- 资源 (14)
- 收藏
- 关注
原创 Redis源码解析:数据结构详解-skiplist
跳表是个什么数据结构?本文的很多内容参考自如下文章《Redis 为什么用跳表而不用平衡树?》,为了加深理解,所以用自己的话复述一遍。如图所示,redis中的zset在元素少的时候用ziplist来实现,元素多的时候用zskiplist来实现。那么skiplist是一个什么样的数据结构呢?skiplist(跳表)是一种为了加速查找而设计的一种数据结构。它是在有序链表的基础上发展起来的。如下图是一个有序链表(最左侧的灰色节点为一个空的头节点),当我们要插入某个元素的时候,需要从头开始遍历直到找到该元.
2021-01-30 20:53:35 1861 3
原创 Redis源码解析:数据结构详解-intset
介绍intset是Redis中set的底层数据结构,当集合中全为整数,并且元素数据不多时,会用intset来实现set,inset和ziplist一样,都是一块连续的存储空间typedef struct intset { // 编码方式 uint32_t encoding; // 元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset;contents:contents数组是整数集合的底层.
2021-01-27 23:26:46 880
原创 Redis源码解析:数据结构详解-quicklist
介绍在redis 3.0版本及以前,采用压缩链表(ziplist)以及双向链表(linkedlist)作为list的底层实现。当元素少时用ziplist,当元素多时用linkedlist在redis 3.0版本以后,采用quicklist作为list的底层实现quicklist是一个双向链表,链表中每个节点是一个ziplist假如说一个quicklist包含4个quickListNode,每个节点的ziplist包含3个元素,则这里list中存的值为12个。quicklist为什么要这样设计.
2021-01-24 23:49:01 1372
原创 Redis源码解析:缓存淘汰策略
介绍Redis是一个内存数据库,当Redis使用的内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,交换会导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。当实际使用的内存超过maxmemoey后,Redis提供了如下几种可选策略。noeviction:写请求返回错误volatile-lru:使用lru算法删除设置了过期时间的键值对volatile-lfu:使用lfu算法删除设置了过期时间的键值对volatile-random:在设置.
2021-01-24 12:47:39 12796 17
原创 Redis源码解析:dict与迭代器
介绍在之前的文章中我们提到,Redis中的数据是放在一个字典中的。例如当我们执行如下命令后,redis的字典结构如下set bookName redis;rpush fruits banana apple;Redis中hash也用dict来实现的,zset中存储value和score值的映射关系也是用dict来实现的。其实Reids中dict的实现和Java中HashMap的实现很类似,也是采用数组+链表的形式实现的。结构如下typedef struct dict { // 类型特定.
2021-01-16 18:32:08 1425 1
原创 Redis源码解析:数据结构详解-sds
介绍我们知道Redis是一个键值对数据库,当你执行如下命令时set testKey testValue;rpush fruits banana apple;其中的键就是用sds(Simple Dynamic String,简单动态字符串)来实现的,redis中string类的值也是用SDS实现的(如上面的testValue)。我们来看一下SDS的底层数据结构是啥?3.0版本及以前struct sdshdr { // buf数组中已使用字符的数量 unsigned int len;.
2021-01-16 15:13:48 1074
原创 Redis源码解析:Redis持久化策略详解(一)
介绍Redis中的数据存在内存中,如果突然宕机,那么内存中的数据将全部丢失。如果数据能从后端数据库恢复还好,如果数据只存在Redis中,那数据就全丢失了。并且如果请求量很多,MySQL服务器的压力会很大。所以最好的方式是对数据进行持久化,并能当宕机的时候能快速恢复在Redis中有如下两种持久化方式,rdb快照和aof日志RDBrdb就是对当前数据库的状态做一个快照,将某个阶段的数据通过二进制文件保存下来。你可以类比照相。内存中的数据越多,生成快照的时候就越长,同时将快照写入磁盘耗费的时间也越长。.
2021-01-10 15:48:49 1905
原创 Redis源码解析:数据结构详解-ziplist
压缩列表的数据结构zset和hash容器对象在元素个数较少的时候,采用压缩列表(ziplist)来存储。压缩列表是一块连续的内存空间。结构如下属性类型长度用途zlbytesuint32_t4字节整个压缩列表占用字节数zltailuint32_t4字节最后一个元素距离压缩列表起始位置的偏移量,用于快速定位最后一个元素zllenuint16_t2字节压缩列表的节点数量,值小于UINT16_MAX(65535)时,这个属性值就是压缩列表包含节点的数量,.
2021-01-09 20:56:35 900
原创 Redis源码解析:数据明明都过期了,为啥还占着内存?
介绍我们可以给Redis中的key设置过期时间,那么当key过期了,它在什么时候会被删除呢?如果让我们写Redis过期策略,我们会想到如下三种方案定时删除,在设置键的过期时间的同时,创建一个定时器。当键的过期时间来临时,立即执行对键的删除操作惰性删除,每次获取键的时候,判断键是否过期,如果过期的话,就删除该键,如果没有过期,则返回该键定期删除,每隔一段时间,对键进行一次检查,删除里面的过期键定时删除策略对CPU不友好,当过期键比较多的时候,Redis线程用来删除过期键,会影响正常请求的响应.
2021-01-09 18:44:46 1250 1
原创 Redis源码解析:主从复制
介绍在生产环境中,为了系统的可靠性,我们会对Redis搭建主从。这样当一个实例发生宕机,另一个实例中还有数据,还能继续提供服务。主从库之间采用的是读写分离的模式。读操作:主库,从库都可以执行写操作:只能主库上执行,主库将操作同步给从库因为主从库都可以接收读请求,提高了系统的QPS。那么主从库之间如何进行数据同步呢?全量复制我们可以通过replicaof命令或者replicaof设置来让redis形成主从库的关系(redis 5.0之前使用slaveof命令)假设现在有两个实例,实例一(17.
2021-01-09 18:38:18 994
原创 面试官:Synchronized和Lock接口有哪些区别?
Lock接口的使用既然有了synchronized,为啥还要提供Lock接口呢?也许你会说Lock接口比synchronized性能高。在jdk1.5之前确实如此,但是在jdk1.6之后,两者性能差不多了。直接来看Lock接口的定义,看看比synchronized多了哪些功能?public interface Lock { // 加锁 void lock(); // 能够响应中断 void lockInterruptibly() throws InterruptedExcepti.
2021-01-03 19:00:29 920
原创 面试官:同样是注册中心,Zookeeper和Eureka有哪些区别?
CAP定理在分布式系统的发展中,影响最大的莫过于CAP定理了,是分布式系统发展的理论基石。2000年,加州大学的计算机科学家 Eric Brewer提出了CAP猜想2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜想,CAP猜想成为了CAP定理CAP定理,简单来说就是分布式系统不可能同时满足Consistency 一致性、Availability 可用性、Partition Tolerance 分区容错性三个要素Consisten.
2021-01-01 16:14:29 2930 1
mybatis-generator-core-1.3.5.jar
2019-08-15
将doc文件批量转为docx文件,用python将doc文件批量转为docx文件
2017-12-28
Spring MVC学习指南
2017-10-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人