02.redis基础
# 01.redis简介
# 1、什么是Redis?
Redis本质上是一个Key-Value类型的内存数据库,很像memcached
整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB
# 2、redis特点
redis比memcached优点
- 数据类型:redis支持五中数据类型, memcached所有的值均是简单的字符串
- value大小限制:redis单个value的最大限制是512M,memcached只能保存1MB的数据
- 持久化:redis可以持久化,memcached不支持持久化
redis为什么快?
- 纯内存操作
- 单线程避免上下文切换
- 非阻塞IO多路复用机制
redis缺点
- 内存限制,不能用作海量数据存储
- 注:如果需要存储海量数据,可以使用MongoDB
# 02.redis内存碎片
1)什么是内存碎片
你可以将内存碎片简单地理解为那些不可用的空闲内存
举个例子:
- 操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间
- 那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片
2)产生内存碎片原因
- 1、申请的空间大于实际存储的空间
- 2、某个数据删除时,Redis 通常不会轻易释放内存给操作系统
# 03.redis 阻塞
1)O(n)复杂度命令
Redis 中的大部分命令都是 O(1)时间复杂度,但也有少部分 O(n) 时间复杂度的命令
KEYS *
:会返回所有符合规则的 keyHGETALL
:会返回一个 Hash 中所有的键值对LRANGE
:会返回 List 中指定范围内的元素SMEMBERS
:返回 Set 中的所有元素SINTER
/SUNION
/SDIFF
:计算多个 Set 的交集/并集/差集
2)SAVE 创建 RDB 快照
save
: 同步保存操作,会阻塞 Redis 主线程;bgsave
: fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。默认情况下,Redis 默认配置会使用
bgsave
命令如果手动使用
save
命令生成 RDB 快照文件的话,就会阻塞主线程
3)AOF 日志记录阻塞Redis
- AOF 持久化机制是在执行完命令之后再记录日志
4)大 Key
如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey
具体多大才算大呢?有一个不是特别精确的参考标准
string 类型的 value 超过 1MB
复合类型(列表、哈希、集合、有序集合等)的 value 包含的元素超过 5000 个
大 key 造成的阻塞问题如下
客户端超时阻塞
引发网络阻塞:如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量
阻塞工作线程:如果使用 del 删除大 key 时,会阻塞工作线程