redis基础
- List item
-
Remote Dictionary Server ,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。是当下最热门的NoSQL技术之一。
-
内存存储,持久化。效率高,可以用于高速缓存,支持事务。支持集群。
-
redis.conf 配置文件
-
默认安装路径: /usr , 本地程序都在/usr/ local目录下,可执行程序在/usr/ local/bin目录下。
-
redis-benchmark:压力测试工具
-
redis事务,multi,exec,discard (分为两种情况)
-
三种特殊的数据类型:geospatial ,Hyperloglog,Bitmaps
-
配置文件详解
-
发布和订阅
-
watch,unwatch,类似乐观锁
-
连接超时->连接池 ,超卖->事务和锁
-
Lua脚本语言写脚本->库存遗留问题
-
RDB(redis database),写时复制技术(COW)f
缺点就是:最后一次持久化后的数据可能会丢失 -
AOF (append only file)
注意上面:如何更改配置文件,文件保存的位置,文件的默认名字
两个同时开启默认读取的时AOF -
AOF同步频率设置,重写压缩操作
-
主从复制:读写分离,性能扩展,容灾快速恢复
-
注意事项:
从服务器宕机后再启动会变成master服务器,再加入集群后数据会从头恢复
主服务器宕机后再启动依然是master服务器,从机不会自动上位。 -
主从复制原理:
-
哨兵模式:当master宕机的时候slave自动变为master
redis集群
- 创建集群命令(与docker学习里面的集群进行对比)
- redis连接集群:加参数 -c
cluster nodes 查看集群的状态
- 16384个槽(slots)
- 在集群里面没法直接用mset插入多个值,但是可以用组的方式,例:
mset name{user} zhr age{user} 20
- 故障恢复
重点
-
缓存穿透:是指查询一个一定不存在的数据,由于缓存没有命中要查询的数据时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
现象:1,redis查询不到数据库。2,出现了很多非正常的url访问
解决方案:
1,对空值做缓存
2,设置可访问的名单(白名单)
3,布隆过滤器
4,对redis进行实时监控 -
缓存击穿: 是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到数据库。
解决方案:
1,预先设置热门数据
2,实时调整
3,使用锁 -
缓存雪崩: 是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
解决方案:
1,构建多级缓存架构
2,使用锁或队列
3,设置过期标志更新缓存
4,将缓存失效时间分散开
分布式锁
- 主流的实现方案:基于数据库实现分布式锁,基于缓存(redis,性能最高),基于Zookeeper(可靠性最高)。
- 通过redis的setnx上锁,del释放锁(相当于用setnx模拟锁的机制),设置key的过期时间来防止死锁。在上锁的时候同时设置过期时间来防止在设置过期时间之前服务器宕机。
redis6新特性
- ACL(Access Control List):
- io多线程