Redis数据类型
五种基本数据类型Redis支持五种基础数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。三种特殊数据类型:geospatial(地理位置),hyperloglog(基数统计),bitmaps(位图场景)
String(字符串)
命令
描述
INCR key
将 key 中储存的数字值增一
DECR key
将 key 中储存的数字值减一
INCRBY key
increment 将 key 所储存的值加上给定的增量值(increment)
DECRBY key
decrement key 所储存的值减去给定的减量值(decrement)
STRLEN key
返回 key 所储存的字符串值的长度。
12345678910111213141516127.0.0.1:6379> set string 1OK# 自增 1127.0.0.1:6379> incr string(integer) 2# 自减 1127.0.0.1:6379> decr string(in ...
Redis缓存穿透,缓存击穿和雪崩
缓存穿透缓存穿透是指查询一个不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存。这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
穿透解决方案
布隆过滤器 布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先校验,不符合则丢弃,从而避免对底层查询系统的压力
缓存空对象 在存储不命中后,即便返回的空对象也将其缓存起来,同时设置一个过期时间,之后访问这个数据会从缓存中获取,保护后端数据源 但是这种方法存在两个问题:
如果空值能够被缓存,意味着缓存需要更多的空间存储更多的键,因为其中可能有很多空值的键
即便对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间的不一致,对于保持一致性的业务可能有影响
缓存击穿对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间间隔对这个Ke ...
Redis持久化
概念持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。
Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘;由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地
RDB持久化RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。当Redis重新启动时,可以读取快照文件恢复数据。
触发条件对RDB来说,有手动触发和自动触发两种情况
手动触发手动触发对应save和bgsave命令,两者都会生成RDB文件
savesave命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间 ...
Redis
NoSQL介绍
NoSQL = Not Only SQL
为什么使用NoSQL关系型数据库:表格,行,列随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心
大数据时代的3V和3高
大数据3V(问题)
海量Volume
多样Variety
实时Velocity
互联网3高(性能)
高并发
高可拓
高性能
NoSQL特点
方便扩展(数据之间没有关系)
快速读写(Redis一秒写8万次,读取11万次)
成本低廉(大部分分布式数据库都是开源)
数据类型是多样型的(不需要事先设计数据库)
传统的RDBMS和NoSQL
传统的 RDBMS(关系型数据库管理系统)
结构化组织
SQL
数据和关系都在单独的表中
严格的一致性
基础的事务
。。。。。。
NoSQL
不仅仅是数据
没有固定的查询语言
键值对存储,列存储,文档存储,图形数据库(社交关系)
最终一致性
CAP定理和BASE(异地多活)
高性能,高可用,高可扩
。。。。。。
NoSQL类型KV键值对
新浪:Redis
美团:Redis+Tair
阿里,百度:Redis+meme ...
异常
异常处理的作用
向用户通报错误。
返回到一个安全的状态,并能执行一些命令。
保存所有工作结果,并以妥善的方式退出。
常见错误
输入错误
设备错误
物理限制
代码错误
Java 中异常对象都是派生于 Throwable 类的一个实例,如果内置的异常不能满足要求,用户可以创建自己的异常类。
异常结构简化示意图
Error 类层级结构描述了 Java 运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出这种类型的对象。
Exception 层次结构又派生为两类:
RuntimeException: 由程序错误导致的异常
错误的类型转换ClassCastException
数组访问越界java.lang.ArrayIndexOutOfBoundsException
访问 null 指针java.lang.NullPointerException
……
其他异常: 由于像 I/O 错误这类错误导致的异常
试图在文件尾部后面读取数据IOException
试图打开一个不存在的文件EOFException
试图根据给定的字符串查找 Class 对象,而这个字符串表示的类并不存在FileN ...
多线程
定义通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序被称为多线程程序。
并行与并发此模块内容大部分来自博客园-并行与并发的区别
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群。并发是在一台处理器上“同时”处理(实际上是交替执行)多个任务,
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
举例假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务
顺序执行:老师甲先帮学生 A 辅导,辅导完之后再取给 B 辅导,最后再去给 C 辅导,效率低下 ,很久才完成三个任务
并发:老师甲先给学生 A 去讲思路,A 听懂了自己书写过程并且检查,而甲老师在这期间直接去给 B 讲思路,讲完思路再去给 C 讲思路,让 B 自己整理步骤。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,在这之后,老师是完全 ...
前后端传递参数
正常情况下传递给后端的是application/x-www-form-urlencoded格式,后端可以直接接收但是传递对象时,需要以json格式来传递(application/json),前端需要设置
12contentType: "application/json",data: JSON.stringify(data),
同时,后端需要用@RequestBody作用在参数上来接受例:
1234@RequestMapping("/deleteAll") public String deleteAll(@RequestBody Vip vip) { }
后端返回JSON格式数据可以使用@RestController
@RestController等价于@Controller+@ResponseBody
knife4j
这是对官网内容的一份总结,是对官网内容的整理本文中所使用knife4j版本号–>2.0.8
简介knife4j是springfox-swagger的增强UI实现,为Java开发者在使用Swagger的时候,能拥有一份简洁、强大的接口文档体验,前身是swagger-bootstrap-ui官方指南
整合SpringBoot添加依赖
在pom.xml中添加依赖
123456<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <!--在引用时请在maven中央仓库搜索最新版本号--> <version>2.0.8</version></dependency>
TIP:3.x的版本依赖springfox3.0.0,springfox3.0目前也只更新发布了一个版本,从功能稳定性来说,可能不如2 ...
博客搭建
1:前置准备安装git,nodejs,hexo
1-1:Git
git安装详细教程
设置用户名和邮箱
12git config --global user.name "github用户名"git config --global user.email "github邮箱"
1-2:nodejs下载后默认配置一路确定
node -v和npm -v检查是否安装成功
设置淘宝镜像npm config set registry https://registry.npm.taobao.org检查是否更换成功npm config get registry结果为:https://registry.npm.taobao.org/
1-3:安装Hexo打开命令行npm install -g hexo
2:开始搭建2-1:初始化Hexo在创建的Hexo文件夹上打开命令行(shift+右键),输入:hexo init
创建成功后输入:
123hexo new my_first_blog//新建个人页面hexo ghexo s
就可以本地访问 ...
MyBatis Generator
Why生成pojo,mapper.java.mapper.xml文件(包含基础增删改查),提交工作效率,解决繁琐的消逝
使用方法1. pom.xml导入插件1234567891011<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version></dependency><!-- Mybatis Dynamic Sql 依赖,可以不添加 --><!-- <dependency> <groupId>org.mybatis.dynamic-sql</groupId> <artifactId>mybatis-dynamic-sql</artifactId> <version>1.1.4&l ...