Nosql概述
NoSQL = Not Only SQL
泛指非关系型数据库
Redis数据类型
5大基本数据类型
- String
- Hash
- List(linkedlist)有序、元素可重复、查找一般
- Set(hashset)无序、元素不可重复、查找快
- ZSet (sortedset)可排序、元素不重复、查询速度快
新增数据类型
- Bitmaps
- HyperLogLog
- Geospatial
Redis事务
- 事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行
- 一次性、顺序性、排他性
- Redis事务没有隔离级别的概念
- Redis单条命令保证原子性,但是事务不保证原子性
- 开启事务(multi)命令入队(…)执行事务(exec)
- 编译型异常(代码有问题),事务中所有的命令都不会执行
- 运行时异常,出错的命令不会运行,其它命令正常运行
监控
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:很乐观,认为什么时候都不会出现问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,获取version,更新时比较version
Redis使用watch实现乐观锁操作,watch监控某个对象,对该对象进行事务操作,这些操作还未执行前,其他进程对监控的对象进行更改,这样会导致事务操作执行失败。如果失败,使用先使用unwatch解除监控,然后重新watch对象,获取最新的值。
Java使用Redis
- Jedis
- spring-data-redis(redisTemplate)
Redis持久化
- RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时将快照文件直接读到内存里。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。缺点是最后一次持久化后的数据可能丢失。
- AOF:将所有的命令都记录下来,history,恢复的时候重新执行一遍,以日志的形式来记录每一个写操作,将redis执行过的所有的指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据
Redis发布订阅
- 订阅:SUBSCRIBE channel_name
- 发布:PUBLISH channel_name message
Redis主从复制
- 概念:将一台redis服务器的数据,复制到其他的redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只由主节点到从节点。
- 作用:
- 数据冗余:实现数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复:当主节点出现问题,可以由从节点提供服务,实现快速的故障恢复
- 负载均衡
- 高可用基石
主从复制,读写分离,减少服务器的压力,最低配置一主二从 - 从机配置:slaveof host port
- 哨兵模式:sentinel ,主机宕机,从从机选一个
缓存穿透
概念:用户想查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多时,缓存都未命中,都去请求数据库,这就叫缓存穿透。
解决方案:
布隆过滤器:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力
缓存空对象:当存储层不命中后,即使返回的空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据
**缓存击穿:**当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导致数据库瞬间压力过大。
缓存雪崩
概念:某一个时间段,缓存集中过期失效。redis宕机
解决方案:redis高可用,限流降级,数据预热