自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

转载 分库分表和数据库分片方案

分库分表和数据库分片方案数据库数据量达到千万级别时查询效率会很低,分库分表是一种很有效的解决方案。垂直划分和水平划分垂直划分:垂直划分又分为垂直分库和垂直分表两种,垂直分库就是将关联度低的各种表放在不同的数据库中,垂直分表是针对表的列进行的,将字段拆到其他表中形成新表,这样表的记录就会变小,索引就会降低空间消耗,提升性能。垂直划分业务逻辑清晰便于管理,提升高并发性能,但是表无法连接...

2019-09-21 17:51:00 241

转载 mysql的锁

mysql的锁Mysql三种级别的锁:表级锁、行级锁、页级锁表级锁适合只读更新很少的情况,行级锁适合更改较多,并发较多的情况表级锁加锁开销小加锁快,粒度大,行级锁开销大加锁慢,粒度小,页级锁开销和粒度都在两种锁之间锁与隔离等级避免脏写(隐式锁):如果某个事务要修改某条记录,先检查有没有记录有没有独占锁,有的话就必须等锁释放,没有的话就检查记录的事务ID是不是当前的活跃事务ID,...

2019-09-21 14:13:00 130

转载 redo log和undo log、事务

redo log和undo log、事务redo log如果系统突然崩溃,一些在缓存中的修改还没来的及同步到磁盘中,用redo log就可以恢复这些修改,Redo log就是记录这些修改的日志。这些对页面的修改有一些是原子操作,比如有些插入伴随着页面分裂和页的新建(悲观插入),此时这些分裂和修改必须一气呵成,这样的操作叫mini-transition,一条语句可能包含多个mini-t...

2019-09-21 13:51:00 283

转载 mysql的缓存

mysql的缓存每次访问一个页的记录需要把整个页加载进一个叫bufferpool的内存区中,即使访问结束页还处于bufferpool中,再次访问该页可以直接从内存中读。用哈希表来判断页到底缓存了还是没有缓存(用表空间号和页号作为key)页存入bufferpool中涉及到三个特殊的链表:1、free链表:可用的内存块。2、flush链表:如果修改了某个内存中的页使数据与磁盘不一致...

2019-09-21 12:20:00 159

转载 索引和查询优化

索引和查询优化添加索引的三种方法一、Alter table 表名 add 键类型 (列列表)键类型:primary key/unique key/fulltext index/index(普通索引可以在index后接索引名)二、建表时在列名 类型 后加索引类型三、建表时在所有列名后面加索引类型(列列表)(全文索引是为了解决like%这种效率低的查询方式提出的查询优化)索引的...

2019-09-21 11:16:00 166

转载 外键、超键、候选键

外键、超键、候选键外键外键:指向另一张表的主键Foreign key(外键字段) references 表(主键)子表(外键所在)外键不能指向不匹配的父表主键父表主键不能随意更改,默认为严格模式,不能删除或更新记录,级联模式,父表更新记录子表也更新,置空模式,父表更新记录子表关联数据置空外键的两端必须类型相同,至少存在一对相同的数据,表中外键名不能重复,存储引擎必须是inno...

2019-09-21 10:42:00 178

转载 连接查询、子查询、联合查询

连接查询、子查询、联合查询连接查询交叉连接 t1 cross join t2内连接:t1 inner join t2 on 。。满足条件的交集左外连接: t1 left join t2 on 。。 以左表为主表,取出每一条与另一张对比,条件不匹配非主表字段都置位null自然内连接和外连接: t1 natural t2, t1 natural left t2以同名字段连接全连接...

2019-09-21 10:39:00 180

转载 主键、自增、唯一键和三大范式

主键、自增、唯一键和三大范式主键primary key, 加在建表语句中primary key(主键列表),主键对应的字段不允许重复自增长,在建表语句字段后加auto_increment,这样当对应的字段设置值不给值或给null或直接给默认值时会从表中最大值+1,一个表中只能有一个自增长唯一键unique key,解决多个字段需要保证唯一性的问题范式第一范式:字段中的数据具有原...

2019-09-21 10:10:00 460

转载 基本的增删改查和数据类型

基本的增删改查和数据类型数据库database数据库database:增:create database k1删:drop database k1改:只能修改库选项不常用alter database 库 库选项 具体值查:show databases (like 。。)两种库选项:charset和collate表table增:create table n (字段名 字...

2019-09-21 09:54:00 203

转载 Theadlocal和它造成的内存泄露

Theadlocal和它造成的内存泄露ThreadLocal、Thead、TheadMap。Thead类里有一个成员变量是TheadMap类型,这个TheadMap类的每一个entry的key是Theadlocal类,value就是Theadlocal类中存储的对象。对Theadlocal进行get和set时都是通过当前线程获取TheadMap对象,然后以当前Theadlocal对象...

2019-09-20 14:00:00 184

转载 java线程内存模型JMM

java线程内存模型JMM线程共享变量存储在主内存中,每个线程都有自己的本地内存,内部存有共享变量的副本,本地内存是一个抽象概念,它是缓存、寄存器、硬件和编译器优化的合集。保证内存可见性:内存模型的happens-before规则,也就是前一个操作执行的结果对后一个操作可见(并不保证前一个操作在后一个操作前执行,这是java在首先保障结果正确的前提下做出的允许编译器和硬件优化让步),...

2019-09-20 13:58:00 75

转载 常用集合

常用集合一、HashMap1、hash方法效率1.7时hash方法分为三步:获取hashcode,位运算和异或扰动、取模。1.8优化为获取hashcode、位运算和异或扰动、用位运算取模,1.8时扰动方法直接优化成了高16位异或低16位,且通过位运算取模hash&(n-1)替代取模,提高了计算效率。2、链表的插入顺序hashMap在1.7时采用头插法,发生碰撞时新元素被...

2019-09-20 13:51:00 129

转载 锁的API及多线程性能调优

锁的API及多线程性能调优轮询锁trylock方法尝试获取锁,如果获取了结果就是true,执行目标代码,如果没有就继续尝试获取(放入while循环中可以做其他事),还可以采用中断锁。中断锁线程的isInterrupted方法可以检查是否处于中断状态,interrupted可以将线程的中断标记设置为true,在调用join,sleep,wait都会检查中断标记,如果被中断了就立即抛...

2019-09-20 13:30:00 128

转载 设计线程安全的类

设计线程安全的类有时调用是非线程安全的,此时必须把有安全隐患的方法用同步代码块包括起来,所谓线程安全的类就是将同步机制封装在类内部,这样方法调用时就不存在线程安全问题了。要设计线程安全的类首先寻找可能暴露在外的字段,包括private但是内部方法修改的。然后将这些字段用同步手段保护起来,不仅仅要在修改时保护,在访问时也要保护,以保证时刻读到正确的值。在保护时注意维护不变性条件,例如...

2019-09-19 14:01:00 107

转载 BlockingQueue接口和线程池

BlockingQueue接口和线程池BlockingQueue接口它有四套api,add/remove操作失败会直接抛出异常,offer/poll操作失败会返回特殊值,还可以加时间,过了时间返回失败,put/take操作失败会阻塞。ArrayBlockingQueue:是数组实现的,必须构造时传入大小,传入后不可改变。DelayQueue:实现Delay接口,与排序有关,它是一...

2019-09-19 13:30:00 184

转载 AQS的几个同步组件

AQS的几个同步组件CountDownLatch一个线程或多个线程一直等待,直到其他线程执行的操作完成才继续执行。应用:并行计算。计数器是不能重计的,计数值不能往上加,类似操作只有一次。使用时首先new一个countDownLatch,构造方法中放入计数,然后在一个线程中调用await方法,这个线程就会进入等待状态,其他线程中调用countDown方法减少这个计数,直至降到0...

2019-09-19 10:19:00 109

转载 AQS的使用和reentrantlock

AQS的使用和reentrantlockAQS概述AQS是一个同步器,全称是AbstractQueuedSynchronizer类。使用方法:子类继承AQS,然后重写tryAcquire、tryRelease、isHeldExclusively(如果是共享模式实现tryAcquireShared和tryReleaseShared方法),然后将其作为内部类,外部类定义unlock和l...

2019-09-17 10:33:00 261

转载 使用redis的原因,缓存穿透和缓存雪崩

使用redis的原因,缓存穿透和缓存雪崩为什么使用redis而不使用map?map是本地缓存,随着jvm关闭而销毁,多实例时每个实例都要保存一份缓存。而redis是分布式缓存,多实例下只保存一份缓存,且提供持久化,即使服务器宕机数据也不会消失。缓存穿透访问大量没有做缓存的数据,导致大量请求落到数据库,数据库崩溃。解决方案:将所有存在的数据装入一个bitmap或者布隆过滤器中,一...

2019-09-16 11:07:00 99

转载 redis的其它模块:队列、位图、HyperLogLog、布隆过滤器、GeoHash

redis的其它模块:队列、位图、HyperLogLog、布隆过滤器、GeoHash延时队列实现队列的一种简单的方式:用zset,其中的score就是剩余时间。还有一种实现简单队列的方式就是用redis中的list,可以用阻塞读命令blpop、brpop,这样在读不到数据时就会立即进入休眠状态,然后一旦有数据就会醒过来,降低延迟。如果用普通的命令rpush、lpush、lpop、r...

2019-09-16 10:59:00 197

转载 Jedis、redis安全、Lua脚本、其他命令

Jedis、redis安全、Lua脚本、其他命令Jedis的使用基本用法:首先new一个jedispool,然后getResource取到jedis即可,最后jedis要关闭连接。为了防止发生异常导致jedis没有关闭引发的连接池内连接数不够,要把close语句放在finally块里或者用trywithresource都可以。有时出现网络抖动会导致redis自动断开连接,此时可以...

2019-09-16 10:46:00 131

转载 懒惰删除和redis中的特殊线程

懒惰删除和redis中的特殊线程懒惰删除删除key的指令是del,如果key非常大,这个指令就会卡顿,此时可以用unlink,它会将删除丢给后台进程异步回收内存,在执行的一瞬间,其他客户端就无法访问到该key了。(如果key很小就会立刻删除)删除任务会塞进异步任务队列(主线程操作这个队列时会有加锁和解锁操作,如果异步线程在休眠的话还会唤醒),后台线程会依次处理这些任务。异步清空数...

2019-09-16 10:11:00 197

转载 过期策略与淘汰策略

过期策略与淘汰策略过期策略为key设置过期时间:expire key 5(5s过期)查看key的剩余时间:ttl key(未设置超时返回-1,已超时返回-2)redis的过期实现通过两种方式,分别是懒惰删除和定时遍历。懒惰删除就是用到某个key的时候再去查它是否过期,如果过期就删除。定时遍历是一个集中处理的方式,redis会把所有设置了过期时间的key放到同一个字典中,默认每...

2019-09-16 09:52:00 197

转载 两种redis集群解决方案:codis和cluster

两种redis集群解决方案:codis和cluster1、Codiscodis是一个代理中间件,当客户端向codis发送指令时,codis负责将指令转发到后面的redis来执行,并将结果返回给客户端。一个codis实例可以连接多个redis实例,也可以启动多个codis实例来支撑,每个codis节点都是对等的,这样可以增加整体的QPS需求,还能起到容灾功能。槽位关系codis根...

2019-09-16 09:39:00 169

转载 主从复制与sentinel

主从复制与sentinelCAP原理CAP原理是设计和部署分布式应用时存在三个核心系统需求:consistent(一致性)、availability(可用性)、partition tolerance(分区容忍性)。一致性不满足就是多个分布式节点的数据不一致,一个节点的修改操作无法同步到另一个节点。当网络分区(网络断开,分布式节点之间失去联系)发生时,一致性很难满足。除非牺牲可用性,就...

2019-09-15 19:50:00 112

转载 订阅与发布:redis的PubSub

订阅与发布:redis的PubSub订阅:subscribe 具体频道发布:publish 频道 内容 可以将具体内容发送到对应频道,同时订阅该频道的所有客户端都能接收到该消息。订阅多个:subscribe 具体频道* 可以订阅具体名称开头的多个频道,即使后续增加了某个新的频道只要在这个范围内也可以收到新的消息。可以利用这个来完成redis的消息多播功能。在应用中,用ge...

2019-09-15 19:28:00 117

转载 事务和乐观锁watch

事务和乐观锁watchredis使用multi开启事务,exec来执行,discard来回滚事务中的指令会缓存在服务器中的一个事务队列中,服务器一旦受到exec指令就会顺序的执行所有指令并返回所有的运行结果,这些指令在运行时不会相互影响,因为redis是单线程的。redis的事务并不是原子性的,一次事务的执行过程中如果有的命令失败,其他命令依然会执行,redis只是拥有隔离性中的串...

2019-09-15 19:17:00 170

转载 持久化机制:RDB与AOF

持久化机制:RDB与AOF快照RDBRDB可能丢失数据,可以设置改1次key存一次,改10次,改1万次。RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来(操作系统会维护共享页面和修改后的分离页面),所以在快照持久化期间修改的数据不会被保存...

2019-09-15 19:01:00 89

转载 客户端与服务器端的通信与redis管道

客户端与服务器端的通信与redis管道服务器的任务调度IO模型采用的是多路复用IO。redis会为每个客户端套接字都分配一个指令队列,redis会从指令队列中取出指令执行,还会为每个客户端套接字分配一个相应队列,将指令的结果返回给客户端。redis处理定时任务时会将定时任务放入一个堆中,堆顶就是最快要执行的任务,轮询时redis都会取出已经到时间的任务来处理,还会将要执行的任务需...

2019-09-15 18:52:00 188

转载 keys、scan、bigkeys、key的存储方式

keys、scan、bigkeys、key的存储方式keyskeys 正则表达式 来找到所有符合要求的key,但是这个指令有几个缺点,首先就是没有限制参数,可能查出超多的数据,还有就是它是遍历算法,复杂度是ON,因为redis是单线程,如果数据多的话会导致redis卡顿。所以代替keys 指令的就是新的指令:scanscan它有一些特点:1、复杂度也是ON。但是他是游标分步进...

2019-09-15 14:35:00 285

转载 限流

限流一个通用的限流接口就是一个用户只能在特定的时期内对于特定的行为只允许发生有限次。可以简单的用redis的zset来实现这个功能,zset中的score就代表时间,用户每发起一次请求都维护一次zset,清理掉多余的任务,这里的value只需要保证唯一即可,所以选用毫秒时间戳。但是这个简单的限流功能不适合巨大的数据量,因为要保存所有的行为记录很耗费空间。另一种简单的限流方案就是用r...

2019-09-15 14:21:00 109

转载 分布式锁

分布式锁多个系统要对一个key进行操作,最后操作key的顺序和预期的顺序不一致,此时就用分布式锁对一个目标加锁,使其他进程无法争到已经被占用的锁。基本指令加锁指令:setnx lock 目标 true移除锁指令:del lock 目标但是如果在加锁后执行出现异常终止导致没有移除锁,就会导致死锁,所以要给锁加一个自动释放时间:expire lock 目标 5(5秒过期)red...

2019-09-15 13:54:00 84

转载 底层:基数树radix tree

底层:基数树radix tree它是一个有序字典树,支持快速定位、插入和删除。它和trie树很类似,如果某个节点只有一个子节点那么可以采用压缩形式,路径代表一个字符串。在redis中,它被用来存储stream消息队列,消息队列中的每一个消息ID都是时间戳加序号,有了基数树就能根据ID快速定位到具体的消息。它还用来在cluster中定位槽和key的关系,此时node名是由槽位编号和k...

2019-09-15 13:22:00 223

转载 底层:跳跃链表skiplist

底层:跳跃链表skiplist跳表每个node的结构:含键和值,还有一个由多个node组成的list,就是本node在不同层指向下一个node的指针。每次初始化时初始化最初的节点,也就是最左边的节点,它的高度就是跳表最大高度,初始每个位置指针指向null。插入元素时首先判断该元素在集合中是否存在,从最初节点的最高位置开始寻找,向前的指针键值比要找的值大就向下移动,小就向前移动。...

2019-09-15 13:03:00 144

转载 底层:快速列表quicklist

底层:快速列表quicklist在redis早期版本中,list底层使用的是ziplist和linkedlist(元素少时ziplist,多时linkedlist),后来因为链表指针的空间占用大换成了现在的quicklist,quicklist就是两者的混合体,它将linkedlist按段拆分,每一段是一个ziplist,每个ziplist用双向指针连接起来。ziplist默认一个存8...

2019-09-15 10:43:00 155

转载 底层:压缩列表ziplist、intset、紧凑列表listpack

底层:压缩列表ziplist、intset、紧凑列表listpackziplist和它的级联更新当zset(sorted set)和hash在元素个数较少时会采用压缩列表ziplist存储。ziplist是一块连续的内存空间。ziplist有一些属性:总字节数、最后一个元素距离起始偏移量、元素个数、entry列表、结束标志。其中偏移量是为了定位最后一个元素倒序遍历用的。entry...

2019-09-15 10:38:00 440

转载 底层:字典

底层:字典字典是redis整个映射的基础,hash结构依赖字典,zset中member到score的映射也是通过字典。set的底层也是字典,只不过value是null。一个字典内部实际包含两个hashtable,因为扩容缩容需要渐进式hash迁移。hashtable是由数组加链表组成。渐进式hash在渐进式rehash时,搬迁操作在对字典的后序指令中触发,如果没有的话也会进行定时...

2019-09-15 09:28:00 179

转载 底层:字符串

底层:字符串redis的字符串是一种SDS(simple dynamic string),类似ArrayList,有三个字段(大小、容量、标志位)和一个字符串组成,分配数组的长度和字符串的长度可以不同。扩容如果进行append操作数组就要进行扩容,如果字符串很大内存分配和复制开销就会很大。redis规定字符串最长不能超过512M,创建字符串时分配数组和实际长度相同,因为append...

2019-09-15 09:21:00 106

转载 Redis的基本数据类型

Redis的基本数据类型1、String类型它是二进制安全的,可以存储图片等数据。不会因为特殊字符导致字符串结尾,redis是C语言书写的,C的字符串有这种特点。底层是SDS(simple dynamic string),字符串是动态的,类似arraylist。底层:SDS(simple dynamic string)用途:缓存用户信息的一个字段常用命令:set、get、get...

2019-09-13 16:48:00 85

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除