NoSql
发展历史:
在互联网刚兴起的时代,由于数据量和数据的访问量都比较小
单机的mysql

但是经过时代的发展,以前的单一的结构已经无法适应当前环境大数据量和高访问量的业务需求,所以需要晋级(使用缓存)
需要使用缓存技术来缓解数据库压力,提高效率
网站的大多数情况下是在读取数据,所以需要使用缓存进行优化,提高效率和减轻数据的压力
NoSql
概念:
NoSQL = Not Only SQL (不仅仅是sql)
泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难适应当前互联网时代的业务要求! (尤其是超大规模高并发的社区)
典型:Map<Object,Object>使用键值对来控制
特点
解耦!
-
方便扩展(数据之间没有关系,很好扩展)
-
大数据量高性能(Redis一秒可以写8万次,读取11万,NoSQL的缓存记录级是一中细粒度的缓存,性能会比较高)
-
数据类型是多样的!(不需要事先设计,随取随用)
-
传统的RDBMS和NoSQL
传统的RDBMS
- 结构化组织
- 数据和关系都存在单独的表中 (行和列)
- 使用固定的操作语言
- 严格的一致性
- 基础的事务
- .....
NoSQL
- 不仅仅是数据
- 没有固定的操作语言
- 键值对存储,列存储,文档存储,图形数据库(常用于社交关系)
- 最终一致性
- CAP定理和BASE (异地多活)
- 高性能,高可用,高可扩展
- ....
一般在公司中都是nosql和rdbms一起使用的
NoSQL四大分类
KV键值对:
以redis和memecache为代表
- 新浪:redis
- 美团redis+tair
- 阿里,百度:redis+memecache
文档型数据库(bson格式和json一样):
MongoDB
- MongoDB是一个基于分布式存储的数据库,C++编写的,主要用来存储大量的文档!
- MongoDB是一个介于关系型数据库和非关系型数据库中间的产品,是非关系型数据库中功能最丰富,最像关系型数据库的
列存储数据库
- HBase
- 分布式文件系统
图关系数据库
- 它不是存图形,存的是关系. 比如:朋友圈社交网络,广告推荐
- Neo4j,infoGrid
四种非关系型数据库对比:

Redis概述
Redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
支持的语言
Redis的用处
- 可以做为缓存使用
- 可以数据库使用
- 可以发布订阅系统
- 可以用于计数器,计时器
Redis特性
- 多样的数据类型
- 持久化
- 集群
- 事务
Redis是单线程基于内存操作
Redis单线程快的核心:
Redis将所有的数据放在了内存中,而且由于Redis是单线程的不涉及到CPU的上下文切换,所以Redis的效率会快,官方发布说,Redis每秒可以读11万次,写8万次
五大常见类型:
- String
- hash
- list
- set
- Zset
三大特殊类型 - Bitmap
- Geospatial
- Hyperloglog
Redis事务
本质:
一组命令的集合,一个事务中的所有的命令都会被序列化,在事务执行过程中,会按照顺序执行**
redis事务:
正常执行事务
- 开启事务(multi)
- 命令入队(…)
- 执行事务(exec)
放弃事务
-
开始事务(multi)
-
取消事务(DISCARD)
事务队列中命令都不会被执行
编译性事务(代码有问题,命令有错!),事务中所有的命令都不会被执行
运行时异常,如果事务队列中存在语法,那么执行命令的时候,其他命令都是可以被执行的,错误命令会抛出异常
Jedis
jedis是官方推荐的java连接redis的工具
SpringBoot整合Redis
说明:在SpringBoot2.x之后,原来使用的jedis被替换成了lettuce
jedis:采用的是直连,多个线程操作的话是不安全的,如果想要避免不安全,使用jedis连接池解决,更像BIO模式
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式
lettuce性能比jedis高一些
源码分析

配置连接池时建议使用lettuce连接池
因为jedis连接池(JedisConnectionFactory)与Springboot有很多类不存在,而且效率也没有哦lettuce(LettuceConnectionFactory)高
redis操作string类型模板工具
redis操作redis各种类型的模板工具,可以使用 redisTemplate.opsXXX选择要操作的类型
默认的RedisTemplate使用的是JDK序列化,我们可以自己写一个配置类重写RedisTemplate方法来替换他原本的配置类中的RedisTemplate方法
在企业中我们对象需要序列化,一般都是使用json序列化,默认的是jdk序列化,我们想要用其他方式的序列化可以重写RedisTemplate方法
模板

Redis持久化
Redis是内存数据库,所以持久化是必须的.
什么是RDB
在主从复制中,rdb就是备用的,aof几乎不使用
在指定时间间隔内将内存中的数据集体快照写入磁盘,也就是Snapshot快照,他恢复的时候也是将快照文件直接读取到内存中


默认的是RDB 一般情况下是不会去修改这个配置
缺点就是最后一次保存的时候宕机了,那么就数据可能会丢失
rdb保存文件是dump.rdb文件,都是在我们的快照文件中进行配置的

触发机制
-
save规则满足的情况,可以触发
-
执行flushall命令,也会触发
-
退出redis也会触发
备份生成后会自动生成一个dump.rdb文件
如何恢复rdb文件
一般情况下,redis自己配置就够用了,我们可以在生成环境中对dump.rdb文件进行备份
优点:
- 适合大规模的数据恢复
- 如果对数据的完整性要求不高
缺点:
- 需要一定时间间隔
- 如果redis 意外宕机最后一次修改数据就没有了
- 在fork另外一条进程的时候会占用内存空间
Aof
将我们所有的命令都记录下来,在恢复的时候再将这个文件执行一遍



默认不开启,需要手动开启,开启的话需要将appendonly no 修改为appendonly yes
重启redis就可以生效
如果aof文件有错误,这个时间redis无法启动的,需要使用redis提供的redis-check-aof修改工具修改这个配置文件


重写规则说明:
如果aof文件大于64m,fork一个新的进程来将我们的文件进行重写
优点:
- 每一次修改都同步,文件的完整性会更加好
- 默认开启的是每秒同步一次,可能会丢失一秒的数据
- 从不同步,效率是最高的
缺点:
- 相对于数据文件大小来说,aof远远大于rdb,修复的速度也比rdb慢
- aof运行效率比rdb慢,所以redis默认的配置是rdb持久化
扩展

Redis缓存雪崩,击穿和穿透
这些都是服务器的高可用问题

缓存雪崩
常见的情况:会在访问量比较高的情况下,会停掉一些服务,保证服务的高可用(比如在双十一,无法使用退款业务,就是因为停掉了一些服务来保证当时访问量比较高的服务可用)
解决方案:

缓存穿透(查不到)



缓存击穿 (量太大,缓存过期的空档期)
该笔记来自B站up主:狂神说 视频地址: https://www.bilibili.com/video/BV1S54y1R7SB









6万+

被折叠的 条评论
为什么被折叠?



