redis
谈谈你对redis的理解
- 非关系数据库
- 他是单线程的:数据放在内存中,单线程操作效率高(多线程会造成CPU的上下文切换)
- 基于内存操作(周期性的把更新的数据写入到磁盘(RDB)或者 把修改操作写入追加的文件记录(AOF))
五大基本数据类型
- strng(最常用)
- list(列表)底层链表 可以用来消息订阅
- set(集合)
- hash(哈希 hset key field value)map集合 更适合对象的存储
- Zset(有序集合)zset k1 score1 v1 score1 数字 后面可以根据这个排序
三种特殊的数据类型
- Geospatial 地理位置
- Hyperloglog 基数 返回不重复的元素个数 网页的uv一个网站访问多次还是算作一个人
- Bitmap 就只有0 和 1 两个状态 员工打卡不打卡
事务操作
- 本质:一组命令的集合,一个事务中的所有命令都会被序列化,按顺序执行。
- redis事务没有隔离级别
- redis的单挑命令是原子性的,但是事务不保证原子性
- redis事务步骤:
- 开启事务(multi)
- 命令入队(…)
- 执行事务(exec)
- 放弃事务 discard
注意:编译型异常(代码有问题! 命令有错!) ,事务中所有的命令都不会被执行
运行时异常(1/0), 如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行 的,错误命令抛出异常!
监控
悲观锁: 很悲观,认为什么时候都会出问题,无论做什么都会加锁!
乐观锁: 很乐观,认为什么时候都不会出问题,所以不会上锁!
更新数据的时候去判断一下,在此期间是否 有人修改过这个数据,
获取version 更新的时候比较 version
- watch命令进行监控
- unwatch在事务执行失败的时候新进行解锁,获取最新的值再次监视
- 在一个watch中只监控count 减少2 但是开启了另外一个线程增加out数字2就会报错
- 这时候需要unwatch取消监控,对一个监控的key可以增加又可以修改
主从复制
- 把一个redis服务器的数据复制到另外一台,前一个叫做主机,后一个叫做从机
- 复制是单向的,只能从主机复制到从机
- 默认情况下都是主机,谁是谁的从机需要配置
- 可以用作负载均衡:主机负责写操作,从机读操作
- 保证了在一个服务器崩了,情况下扔可以用一段时间
配置
- 端口
- pid名字
- log文件名
- dump.rdb名字
测试:
- 从机没有写操作
- 主机断开后,从机依旧是从机没有写操作
- 主机断开后,重新连接,从机依旧可以获取到主机数据
- 命令行配置:从机重启后就会变成主机
- 配置文件配置:从机重启后还是从机
- 如果主机断开了连接,我们可以使用 SLAVEOF no one 让自己变成主机
复制原理
- 全量复制:从机连接的时候就会把主机磁盘的数据加载到内存中
- 增量复制:主机的新的修命令会传递到从机
哨兵模式
概念
主机断开连接后自动选取一个新的主机
作用
- 独立的进程监控这几台服务器
- 通过发送命令让服务器返回它的运行状态
- 当哨兵模式检测到主服务宕机后,会自动把从机切换成主机,然后通过发布订阅模式通知其他的从机修改文件,切换主机
改进
一个哨兵监控可能会出现错误,可以使用多个哨兵进行监控,并且哨兵烧饼之间还能互相监控,这就是多哨兵模式
缺点
- redis不容易扩容
- 哨兵模式配置麻烦
缓存穿透
概念(查不到造成的)
缓存中查不到就要去数据库中查找,发现数据库中也没有
如果很多人都去访问这个数据缓存中没有,都去数据库中查找,数据库压力太大,出现缓存穿透
解决方案
布隆过滤器
缓存空对象:
存在问题
1、缓存大量的空健,空间浪费
2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于 需要保持一致性的业 务会有影响
缓存击穿
概念(量太大,缓存过期)
缓存的一个key是一个热点数据(微博热搜),当这个key在一个失效的瞬间,持续的大并发穿破缓存,直接请求数据库
解决方案:
缓存不过期
加上互斥锁
缓存雪崩
概念
一个时间段缓存都过期了,redis宕机
解决方案
redis集群:增加redis服务器数量
限流降级:对一个key只允许一个线程查询写缓存
数据预热:把可能照成大量访问的数据先访问一遍,放在缓存中。