自己对 Redis 的理解
数据类型最基本的五种数据类型String (字符串):最基本的数据类型 list(列表):相当于 java 语言里面的 LinkedList, 是链表结构,所以插入和删除非常快,时间复杂度是 O (1) set(集合):相当于 hashset hash (哈希):相当于 hashmap,数组 + 链表 zset(有序集合):在 set 的基础上 给每一个 value 会与了一个 score 代表这个 value 的排序权重 特殊的数据类型HyperLogLogs(基数统计):只统计数量,不会存入值,占用空间极少。结果会有误差,约为 0.81。因此适用于网站在线人数,UV、注册 IP 数等对精准度要求不高的场景 geo(地理位置):可以将一个或多个和经纬度加入到 key 中 1geoadd china:city 116.40 39.90 beijing BitMap( 位存储): 只能存储 0 和 1 可以用来统计用户的活跃状态 12345setbit sign userId 1 setbit sign userId 0 getbit sign userId #...
自己对锁的理解
synchronized 的底层实现原理同步锁。可以修饰实例方法 (当前实例加锁) 修饰静态方法 (当前类加锁),修饰代码块 (指定加锁对象) 使用 synchronized 编译后的字节码文件中会有 monitorenter 和 monitorexit 指令。分别对应着获取锁和释放锁。 而每一个同步对象都有一个自己的 Monitor 监视器锁。加锁的时候,会先尝试获取 monitor 的所有权, 如果 monitor 的进入数为 0,则将进入数设置为 1 并进入 monitor。该线程即为 monitor 的所有者 如果线程已经占有该 monitor,那么就重新进入,将进入数加 1 如果其他线程占用了 monitor,则该线程进入阻塞状态,直到 monitor 的进入数为 0。重新获取 monitor 的所有权 如果 monitorexit 出现了两次,第一次为同步正常释放锁,第二次为发生异常退出锁 Synchronized 和 Lock 的区别Synchronized 是 java 的关键字,而 Lock 是一个接口 synchronized 不会产生死锁,而...
自己对 MySQL 的理解
索引索引失效的情况如果 WHERE 条件中还有 OR 除了 OR 前后使用了索引列 如果 mysql 判断全表扫描比使用索引查询快,不会使用索引 执行 LIKE 模糊查询并以 % 开头 索引出现了隐式的类型转换。比如数据类型是 varchar,我们输入的是一个数值。那么不会使用索引 explain 执行计划可以模拟优化器执行 SQL 查询语句,用来分析 sql 语句的性能 Id: 标识符 Select_type: 查询的类型 type: 表的连接类型 const:通过主键或唯一键查询,并且结果只有 1 行(也就是用等号查询)。因为仅有一行,所以优化器的其余部分可以将这一行中的列值视为常量。 eq_ref:通常出现于两表关联查询时,使用主键或者非空唯一键关联,并且查询条件不是主键或唯一键的等号查询。 ref:通过普通索引查询,并且使用的等号查询。 range:索引的范围查找(>=、<、in 等)。 index:全索引扫描。 All:全表扫描 possible_keys 预测用的索引 key: 实际使用的索引 key_len 使用索引的长度 ...
自己对 JVM 的理解
内存模型线程独占: 虚拟机栈:先进后出的 又称方法栈,线程执行方法都是创建一个栈帧,用来存储局部变量表 (存放局部变量的), 操作数栈 (后进先出的操作数栈。负责写入数据和提取数据),动态链接 (执行常量池中的方法引用), 方法出口等信息,JVM 对栈的操作有 2 种,出栈和入栈。方法调用就是入栈。方法返回就是出栈 本地方法栈:区别是虚拟机栈为执行 Java 方法服务,而本地方法栈则为 Native 方法服务 什么是 native 方法呢 就是非 Java 方法。与 Java 环境外交互。因为 JVM 一些底层是 C 写的。比如 Thread 类中的 setPrioruty 方法 HotspotJVM 中 将本地栈和虚拟机栈合二为一的 栈是运行时单位 堆是存储的单位 程序计数器:一块较小的内存空间,是当前线程所执行的字节码的行号指令器,每条线程都要有一个独立的程序计数器,这类内存也被称为线程私有的内存。用来记录程序执行到哪一个地方,下次可以在这个地方继续执行 线程共享: 堆:java 虚拟机内存最大的一块,被所有线程共享,几乎所有线程实例都在这里分配内存。 1.7...
Spring 基于注解使用 AOP
概念面向切面编程。将多个对象的公共行为抽取封装成一个可重用的模块。降低了模块之间的耦合度。同时提高了系统的可维护性。一般用于权限认证,日志等。 AOP 是基于动态代理实现的。如果要代理的对象实现了某个接口,那么 AOP 就会使用 JDK 动态代理创建对象。而没有实现接口的对象,就无法使用 JDK 动态代理。使用 Cglib 动态代理生成一个被代理的子类来作为代理。 Aspect(切面): 切点 + 通知。在什么时候,什么地方,做的什么增强 Joint point(连接点):使用通知的一个时机,一般是方法的调用,或异常被抛出 Pointcut(切点):通过通配、正则表达式等方式,定义了切面发生在哪里 Advice(通知):告诉切面要做什么,什么时候开始,比如 Before、After、Around 等等 Target(目标对象):被通知的对象 Weaving(织入):把切面应用到目标对象,创建对象的一个过程。可以在编译时或运行时完成织入操作。 Spring AOP 和 AspectJ AOP 的选择Spring AOP 属于运行时增强。AspectJ 是编译时增强,Eclipse...
Linux 安装 Docker 和 MySQL
1. 安装准备 11.1 确保cenos版本是7.X 使用 uanme -a 查看 docker 内核版本 1uname -a 这里使用 cenos7 来安装 docker 11.2 安装docker运行环境 安装 docker 运行环境之前,我们先来配置一下 yum 2. 配置 yum 2.1 备份 1mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.2 配置国内镜像加速 1wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2.3 生成缓存 1yum makecache 2.4 安装 docker 运行环境 因为 docker 是基于 C 和 C++ 开发的 需要安装对应的环境 12yum -y install gccyum -y install...
服务器上 Nginx 的安装和使用
nginx 介绍 nginx 是一款使用 C 语言编写的高性能的代理服务器。优点是占用内存小,并发能力强。达到了 5W。一般用来做负载均衡 1. 官网下载 nginx 压缩包 我们先去官网下载一个最新稳定版的 nginx http://nginx.org/en/download.html 然后使用 xftp 或者 rz 上传到我们的服务器 # 解压压缩包 tar -zxvf nginx-1.22.0.tar.gz 然后进入到目录里面,查看是否有可执行权限 (是不是绿色的),没有赋予执行权限 # 赋予执行权限 chmod +x configure 2. 安装 nginx 所需要的环境在安装之前先安装 nginx 所需要的一些环境 12345678# c编译器yum -y install gcc gcc-c++ autoconf automake make# 解析正则的pcre库yum install -y pcre pcre-devel# 添加对gzip的支持yum install -y zlib zlib-devel# SSLyum -y...
linux 常用的插件安装
阿里云买一台服务器,部署自己的项目,让别人访问,多有成就感。但是刚买的服务器,上面什么都没装,很多时候都是软件装完了,这里缺一个 php,那里缺一个 c 环境,想要解压个 zip 文件,发现没有工具… 这些都是我们碰到的。这篇文章就把常用的插件一网打尽,到手执行完指令就可以使用。 wget wget 不用多说了吧 linux 的应用市场 net-tools 网络工具包 gcc C 编译器 xinetd 网络守护进程服务 unzip 解压缩软件,支持解压缩 zip lrzsz 替代 xftp 的工具 直接使用 rz 命令上传 initscripts 一些启动脚本 sudo 让我们获得管理员权限的东东 libaio 提供给我们异步非阻塞方式读取文件 gcc-c++ C++ 编译器 vim* Vim 文编编辑神器 lsof 方便我们更好的查看端口 epel-release 一个第三方源,帮助我们扩展 yum pcre-devel PCRE 库,支持正则表达式,用 nginx 必须得有 zlib-devel...
什么是 Docker?
容器技术的起源假设你们公司正在秘密研发下一个 “今日头条” APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。 测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。 从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。 有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware 好用的飞起,先搭好一套虚拟机环境然后给测试和运维 clone...
Redis - 集群
哨兵模式sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作。 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。 故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了。 哨兵的核心知识 哨兵至少需要 3 个实例,来保证自己的健壮性 哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。 对于哨兵 + redis...