- 博客(36)
- 收藏
- 关注
原创 Redis高性能设计之epoll和IO多路复用深度解析
I/O:网络I/O多路:多个客户端连接(连接就是套接字描述符,即socket或者channel),指的是多条TCP连接复用:用一个进程来处理多条的连接,使用单进程就能够实现同时处理多个客户端的连接。总结:实现了用一个进程处理大量的用户连接,IO多路复用类似一个规范和接口落地实现。可以分select->poll->epoll三个阶段来描述。同步阻塞同步非阻塞异步阻塞异步非阻塞。
2023-06-07 17:22:32
1917
原创 Redis经典五大数据类型源码及底层实现
int:保存long型(长整型)的64位(8个字节)有符号整数。只有整数才会使用int,如果是浮点数,Redis内部其实先将浮点数转化为字符串值,然后再保存。- embstr:代表embstr格式的SDS(Simple Dynamic String简单动态字符串),保存长度小于44字节的字符串。EMBSTR顾名思义即:embedded String,表示嵌入式的字符串。raw:保存长度大于44字节的字符串。
2023-06-06 11:26:21
807
原创 Redis-- 缓存预热+缓存雪崩+缓存击穿+缓存穿透
请求去查询一条记录,先查redis无,后查mysql无,都查询不到该条记录。但是请求每次都会达到数据库上面去。导致后台数据库压力暴增。这种现象我们称为缓存穿透,这个redis变成了一个摆设。大量的请求同时查询一个key时,此时这个key正好失效了,就会导致大量的请求都达到数据库上面去。简单说就是热点key突然失效了,暴打mysql。穿透和击穿,截然不同。
2023-05-30 11:00:26
910
原创 Redis之bitmap/hyperloglog/GEO
Redis Hyperloglog是用来做基数统计的算法,hyperloglog的优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的,并且是很小的。在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
2023-05-24 09:40:42
929
原创 Redis缓存双写一致性之更新策略
先删除缓存值再更新数据库,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力导致打满mysql。如果业务应用中读取数据库和写缓存的时间不好估算,那么延迟双删中的等待时间就不好设置。
2023-05-18 14:21:05
1265
1
原创 Redis BigKey
这个指令没有offset、limit参数,是要一次性吐出所有满足条件的key,由于redis是单线程的,其所有操作都是原子的,而keys算法是遍历算法,复杂度是O(n),如果实例中有千万级以上的key,这个指令就会导致Redis服务卡顿,所有读写Redis的其它的指令都会被延后甚至会超时报错,可能会引起缓存雪崩甚至数据库宕机。基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历,不保证每次执行都返回某个给定数量的元素,支持模糊查询。
2023-05-16 16:39:14
1044
原创 Redis单线程 Vs 多线程
一个服务端进行可以同时处理多个套接字描述符,实现IO多路复用的模型有3种,可以分select->poll->epoll三个阶段来描述。
2023-05-16 10:45:11
301
原创 Spring Boot 集成 Redis
SpringBoot 2.X 版本,Redis默认的连接池采用Lettuce,当Redis集群节点发生变化后,Letture默认是不会刷新节点拓扑。Jedis Client是Redis官网推荐的一个面向Java客户端,库文件实现了对各类API进行封装调用。RedisTemplate默认使用的是JdkSerializationRedisSerializer。键(key)和 值(value)都是通过Spring提供的Serializer序列化到数据库的。是一个Redis的java驱动包。
2023-05-12 15:35:50
725
原创 Redis集群(cluster)
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个Master。Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
2023-05-12 09:50:20
8273
原创 Redis哨兵(sentinel)
哨兵巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务。监控redis的运行状态,包括master和slave。当master down机后,能自动将slave切换成新的master。
2023-05-10 15:08:09
241
原创 Redis复制(replica)
就是主从复制,master以写为主,Slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。
2023-05-08 17:44:57
188
原创 Redis发布订阅
Redis pub/sub 是一种消息通讯模式,发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递。Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。仅代表个人观点:不推荐使用该功能,专业的事情交给专业的中间件处理,Redis就做好分布式缓存功能。发布的消息在redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布。
2023-05-08 15:18:07
266
原创 Redis管道
Pipline是为了解决PTT往返耗时,仅仅是将命令打包一次性发送,对整个Redis的执行不造成其他任何影响。批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)。
2023-05-08 14:55:00
102
原创 Redis事务
开启:以MULTI开始一个事务。入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。执行:由EXEC命令触发事务。
2023-04-17 17:20:32
132
原创 Redis持久化技术
RDB(Redis数据库):RDB持久性以指定的时间间隔执行数据集的时间点快照。实现类似找记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据库的可靠性也就得到了保证。这个快照文件就称为RDB文件(dump.rdb),其中,RDB就是Redis DataBase的缩写。AOP是以以日志的形式来记录每个写操作。
2023-04-17 16:26:20
119
原创 MyBatis基础知识归纳整理
打包方式:jar引入依赖2.3 创建MyBatis的核心配置文件2.4 创建mapper接口2.5 创建MyBatis的映射文件相关概念:ORM(Object Relationship Mapping)对象关系映射。对象:Java的实体类对象关系:关系型数据库映射:二者之间的对应关系Java概念数据库概念类表属性字段/列对象记录/行映射文件的命名规则表所对应的实体类的类名+Mapper.xml例如:表t_user,映射
2023-03-24 10:18:25
355
原创 数据库备份与恢复
数据迁移(data migration)是指选择、准备、提取和转换数据,并将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程。此外,验证数据完整性和退役原来旧的数据存储,也被认为是整个数据迁移过程的一部分。数据库迁移的原因是多样的,包括服务器或存储设备更换、维护或升级,应用程序迁移、网站集成、灾难恢复和数据中心迁移。根据不同的需求可能要采用不同的迁移方案,但总体来讲,MySQL数据迁移方案大致可以分为物理迁移和逻辑迁移两类。通常以尽可能自动化。
2023-03-16 09:27:32
4554
原创 MySQL主从复制
在实际工作中,常常将Redis作为缓存与MySQL配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出,如果不存在再访问数据库,这样就提升了读取的效率,也减少了对后端数据库的访问压力。Redis的缓存架构是高并发架构中非常重要的一环。此外,一般应用对数据库而言都是“读多写少,也就是说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构,进行读写分离,这样同样可以提升数据库的并发处理能力。
2023-03-13 10:17:34
144
原创 MySQL多版本并发控制
MVCC(Multiversion Concurrency Control),多版本并发控制。顾名思议,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MVCC没有正式的标准,在不同的DBMS中MVCC的实现方式可能是不同的,也不是普遍使用的。
2023-03-09 17:39:00
397
原创 数据库--锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时锁机制。
2023-03-09 14:39:41
1165
原创 MySQL事务日志
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?有的DBA或许会认为UNDO是REDO的逆过程,其实不然。REDO和UNDO都可以视为一种。
2023-03-03 16:15:09
449
原创 数据库事务概述
事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。ACID是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。数据库事务,其实就是数据库设计者为了方便起见,把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务。
2023-03-02 18:05:06
363
原创 数据库调优策略
随着用户量的不断增加,以及应用程序复杂度的提升,我们很难用“更快”去定义数据库调优的目标,因为用户在不同时间段访问服务器遇到的瓶颈不同,比如双十一促销的时候会带来大规模的。需要连接查询的情况也就越多。这些数据库的优缺点和使用场景各有不同,比如列式存储数据库可以大幅度降低系统的I/O,适合分布式文件系统,但如果数据需要频繁地增删改,那么列式存储就不适用了。也就是索引列的cardinality的值与表中数据的总条数差距越大,即使查询的时候使用了该索引作为查询条件,存储引擎实际查询的时候使用的概率就越小。
2023-03-01 16:27:22
2370
原创 数据库的设计规范
在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,必须满足一定的范式。范式的英文名称是,简称NF。它是英国人E.F.Codd在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。有的时候不能简单按照规范要求设计数据库,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务优先。
2023-02-28 17:47:10
1751
1
原创 Spring 5 系统架构
Spring 大约有20个模块,由1300多个不同的文件构成。这些模块可以分为核心容器,AOP和设备支持、数据访问和集成、Web组件、通信保温和集成测试、集成兼容等类。模块结构图如上图所示。组成Spring框架的每个模块都可以单独存在,也可以将一个或多个模块联合实现。1、核心容器核心容器由Spring-beans、Spring-core、Spring-context 和 spring-expression(Spring Expression Language,SpEL)4个模块组成。Spring.
2021-10-15 09:51:22
163
原创 spring核心原理----开篇
Spring中的编程思想总结Spring 中的编程思想总结如下表所示:Spring思想应用场景(特点)一句话概括OOPObject Oriented Programming(面向对象编程),用程序归纳总结生活中一切事务封装、继承、多态BOPBean Oriented Programming(面向Bean编程),面向Bean(普通的Java类)设计程序,解放程序员一切从Bean开始AOPAspect Oriented Programming(面向切面编程),找出
2021-10-14 10:31:21
137
原创 JUC了解
JUC第一节:什么是JUC ?JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包,在JDK1.5开始出现的。第二节:进程和线程2.1 简介进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。一个程序至少一个进程,一个进程至少一个线程。2.2 进程与线程间的区别地址空间:同一进程的线程共享本进
2021-10-13 17:56:33
566
原创 MySql基础第一阶:单表查询
单表查询的基础语句1.查询所有字段SELECT 字段1,字段2,字段3 … FROM 表名;SELECT * FROM 表名;2.查询指定字段SELECT 字段1,字段2,字段3 … FROM 表名;3.Where条件查询SELECT 字段1,字段2,字段3 … FROM 表名 WHERE 条件表达是;4.带IN关键字查询SELECT 字段...
2018-07-03 18:25:41
232
原创 Java基础:线程的生命周期
线程的生命周期一、新建:当程序使用new关键字创建一个线程之后,该线程就处于新建状态,此时它和其他Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量值。此时的线程对象并没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。二、就绪:当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态...
2018-06-27 17:54:36
175
原创 CheckedTextView的使用(结合ListView实现单选、多选效果)
小小码农初成长之—Android基础_CheckedTextView情景描述:说到实现单选、多选毫无疑问的我想到了RadioGroup + RadioButton 和 CheckBox。但针对选项个数的不定以及内容的多变,通过RadioButton与CheckBox实现则显得不那么优雅......;CheckedTextView:通过CheckedTextView实现的单
2018-02-01 22:29:06
10352
2
转载 “flavor”与“buttonKnife"异常问题记录(小小码农在成长)
异常统计_20180125背景:学习使用okhttp中,使用okgo封装类实现项目的网络请求。异常一:**Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-m
2018-01-26 00:01:44
396
原创 Android中Xml数据存储与解析
xml可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。xml作为承载数据的一个重要角色,在Android中常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器;
2017-08-25 11:30:36
1292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人