redisCluster
前言
此篇文章主要介绍分片,主从和哨兵模式会在别的文章中介绍
一、客户端分片在Redis 3.0之前,redis并没有Redis cluster功能,当时大部分使用的是客户端分片以及第三方工具实现分片集群,比如Jedis,Jedis的Redis Sharding实现具有如下特点:
采用一致性哈希算法(consistent hashing),将key和节点name各自hashing,,然后进行映射匹配,采用的算法是MURMUR_HASH。采用一致性哈希而不是采用简单类似哈希求模映射的主要原因是当增加或减少节点时,不会产生由于重新匹配造成的rehashing。一致性哈希只影响相邻节点key分配,影响量小。
为了避免一致性哈希只影响相邻节点造成节点分配压力,ShardedJedis会对每个Redis节点根据名字(没有,Jedis会赋予缺省名字)会虚拟化出160个虚拟节点进行散列。根据权重weight,也可虚拟化出160倍数的虚拟节点。用虚拟节点做映射匹配,可以在增加或减少Redis节点时,key在各Redis节点移动再分配更均匀,而不是只有相邻节点受影响。(就比如ABC3个节点只能映 ...
Spring-基础
启动流程
redis-面试题
一、基本概念Redis为什么这么快
基于内存
单线程,IO多路复用
高级数据结构(如 SDS、Hash以及跳表等)
缓存三大问题以及解决方案?缓存穿透(查询数据不存在)解决办法
缓存空值
布隆过滤器做Key值校验
缓存击穿(缓存过期,伴随大量对该 key 的请求)解决办法
互斥锁
热点数据永不过期
熔断降级
缓存雪崩(同一时间大批量的 key 过期)解决办法
随机分散过期时间
热点数据永不过期
一致性解决办法强一致性:串行化弱一致性:延时双删保证redis的高并发 主从加集群,读写分离
保证原子性
使用 incr、decr、setnx 等原子操作
使用锁
使用lua脚本
Redis 是如何实现字典的?123456789101112131415161718192021222324252627282930typedef struct dictEntry { void *key; //键 union { void *val; //值 uint64_t u ...
redis
数据结构String其底层实现就可以分为 int、embstr 以及 raw 这三种类型
Redis 中所有的 key 都是字符串,这些字符串是通过一个名为简单动态字符串(SDS) 的抽象数据类型实现的
123456789struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[];}
1)如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置为 int。比如 set number 10086 命令。
2)如果字符串对象保存的是一个字符串值,并且这个字符串的长度大于 44 字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为 raw。
3)如果字符串对象保存的是一个字符串值,并且这个字符串的长度小于等于 ...
java基础-多线程
线程的生命周期
ThreadLocalThead源码
12345678910public class Thread implements Runnable { //...... //与此线程有关的ThreadLocal值。由ThreadLocal类维护 ThreadLocal.ThreadLocalMap threadLocals = null; //与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护 ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; //......}
ThreadLocalMap是TreadLocal的内部类
ThreadLocal内存泄漏ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。所以,如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。 ...
java类相关简介
类的加载顺序加载—连接(验证、准备、解析)—初始化—使用—卸载
双亲委派
jvm简要介绍
内存模型
程序计数器
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
虚拟机栈
堆在 JDK 7 版本及 JDK 7 版本之前,堆内存被通常分为下面三部分:
新生代内存(Young Generation)
老生代(Old Generation)
永久代(Permanent Generation)
方法区方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。
为什么永久代要换成元空间
整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比 ...
mysql索引简介
数据页InnoDB 是如何存储数据的?记录是按照行来存储的,但是数据库的读取并不是以行为单位,否则一次读取(一次 I/O 操作) 只能处理一行数据,效率会非常低。因此,InnoDB 的数据是按 数据页数据页为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。
数据库的 I/O 操作的最小单位是页,InnoDB 数据页的默认大小是 16KB,数据库每次读写都是以 16KB 为单位,一次最少从磁盘中读取 16K 的内容到内存中 或者 一次最少把 16K 内容刷新到磁盘中。
数据页包括七个部分,结构如下:
7个部分的说明如下:
名称
说明
File Header
文件头,表示页的信息
Page Header
页头,表示页的状态信息
Infimum + Supremum Records
两个虚拟伪记录,分别表示页中的最小记录和最大记录
User Records
用户记录,存储行记录内容
Free Space
空闲空间,表示页中还未被使用的空间
Page Directory
...
kafka常见面试题以及答案整理
Kafka的用途有哪些?使用场景如何?
Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么
ISR:所有与leader副本保持一定程度同步的副本(包括leader副本在内),(In-Sync Replicas)OSR:与leader副本同步滞后过多或断开连接的副本(不包括leader副本)组成OSR(Out-of-Sync Replicas),时间阈值由replica.lag.time.max.ms配置,默认30SAR:所有的副本列表统称AR(Assigned Replicas)ISR伸缩:leader副本负责维护和跟踪 ISR 集合中所有follower副本的滞后状态,当follower副本落后太多或失效时,leader副本会把它从 ISR 集合中剔除。如果 OSR 集合中所有follower副本“追上”了leader副本,那么leader副本会把它从 OSR 集合转移至 ISR 集合。默认情况下,当leader副本发生故障时,只有在 ISR 集合中的follower副本才有资格被选举为新的leader,而在 OSR 集合中的副本则没有任何机会(不过这个可以通过配置来改变
...