Redis核心技术与实战课程复习一
基础数据类型
指给客户用的数据类型
string、list、hash、set、sorted set
底层数据结构
指实现Redis各功能所用到的数据结构
sds(简单动态字符串)、双向链表、ziplist、跳表、整数数组,字典
数据类型和数据类型的对应关系
- string:std
- list:ziplist、双向链表
- hash:ziplist,字典
- set:ziplist,整数数组
- sorted set:ziplist,跳表
Redis数据类型操作复杂度大概
单元素操作快,统计操作快(底层数据结构都带有大小计数),范围操作(lange,zrange)慢
如果业务非要范围操作有没有好的办法?
Redis2.8版本增加scan操作,可以一部分一部分的范围操作
Redis为什么快?
- 内存数据库
- 单线程
不过说Redis单线程是指和读写客户端数据的网络IO和读写键值对。
其他线程有哪些操作?持久化、异步删除、集群数据同步(其实是子进程操作)
6.0版本,客户端数据网络IO变为多线程 - 多路IO复用
Redis性能瓶颈
- 请求耗时
– 操作bigkey(如存有大量键值对的hash),删除时,释放内存阻塞
– 范围操作,操作复杂度高,耗时
– 大量key同时过期,释放内存
– 内存淘汰策略
– AOF使用Always写回策略
– RDB大量数据,虽然是写盘是子进程,但是fork子进程需要复制内存页,主线程数据改变时由于fork的写实复制机制,主线程数据修改就会写数据,这个时候耗时多,并且在fork时如果机器开启了hugepage(页面大小2M)会分配大内存块,所以建议关闭,关于fork带来的阻塞,在其他redis使用fork时都有。 - 读写客户端数据虽然是epoll,但是单个读写也是同步的
AOF
AOF是写后日志
好处
- 可以不做语法检查, Redis操作成功后才写入
- 不会阻塞当前的Redis指令
风险
- Redis指令刚执行完就宕机则无法写日志,这段时间的数据无法恢复
- 如果写盘阻塞将阻塞后面的指令
AOF写回策略
- Always
- EverySec
- No 由操作系统决定什么时候写回
AOF日志重写
根据Redis当前键值对数据重新生成一次的指令写入日志
如有多次set key value
更新同一个string的值最后的值是value1,则生成最后的指令
set key value1
一个拷贝,两处日志
AOF重写是fork出bgrewriteaof子进程重写日志,重写这段时间的客户端指令即要写入aof本身也要写入重写日志