- redis高并发
1 redis是单线程程序,所以不用加锁
2 redis数据都存储在内存中,操作内存的数据极快
3 底层使用多路复用IO
- redis集群和高可用
1 redis改用集群的方式,并且每个节点都支持一主多倍
2 redis集群采用哈希槽分区算法:
(1)redis集群中设计了16384个槽位(16384和redis节点之间发送心跳包的大小有关,16384够用且不会导致心跳包太大),每个节点负责一部分槽位。
(2)计算槽位:slot = CRC16(key)%16384。
(3)节点的删除或增加:只用移动部分数据。
4 redis每个节点都可以是一主多从,读写分离。
- redis持久化
RDB:指定一定时间内一定的写操作次数,将内存中的数据保存到磁盘。优点是操作少,确定是如果在两次写磁盘之前宕机会导致数据丢失。
AOF:将每次写操作都记录。优点是每一次的写操作都记录在文件中,但是随着写错的次数过多会导致AOF文件越来越大,redis为了决绝AOF文件越来越大的问题设计了重写机制,当aof文件超过设置的阈值时,会将当前内存的值读到新文件中并替换旧文件。
- redis应用场景
1 保存热点数据,避免太多请求打到db
2 分布式限流
3 分布式锁:使用Lua脚本(包含setnx和expire两条指令)
- redis常见问题
1 redis缓存雪崩 穿透 击穿
(1)雪崩是指的大量key同时失效,请求打到db。解决办法是:key的过期时间不要设置得都一样。
(2)穿透是值redis和db都没有的key,一般是攻击者的请求,解决办法是参数校验
(3)缓存击穿是单个key的量比较大,如果key失效,导致大量请求打到db,解决办法是:设置过期时间长一点或者限流。
- redis内存淘汰策略
1 对所有写请求直接返回错误
2 随机淘汰
3 最快过期的key淘汰
4 lru算法淘汰(最久没有被访问的key淘汰)
- redis事务
用redis的命令执行:muti - 一系列操作 - exec