*****************************************
基本特性
基于内存操作,读写速度快;
单线程运行,避免线程上下文切换
非阻塞IO,使用I/O多路复用模型
基本数据结构为key==》value,value可为多种数据类型,操作较为简单
可主从/哨兵,集群部署,具有高可用、分布式特性
*****************************************
数据类型及内部编码
数据类型查看:type key
内部编码查看:object encoding key
字符串:其他几种数据类型都是在字符串类型上构建,内部编码
int:字符串为整形字符串时使用
embstr:字符串小于等于39个字节使用
raw:字符串大于39个字节使用
使用场景:缓存、计数、session共享、限流
list:存储多个有序的字符串,内部编码
ziplist:元素个数小于list-max-ziplist-entries(默认512个),并且每个元素的值小于list-max-ziplist-value(默认64字节)
linkedlist:不满足上述条件,使用linkedlist
redis 3.2之后,提供quicklist内部编码类型,结合了ziplist和linkedlist的优势
使用场景:消息队列
set:元素不能重复,且是无序的,支持多个集合求交集、差集、并集,内部编码
intset:元素个数小于set-max-intset-entries(默认512)
hashtable:不满足上述条件时,使用hashtable
使用场景:给key打标签,求多个key的共有标签
zset:元素不能重复,给元素赋值score,可按score排序,内部编码
ziplist:元素个数小于zset-max-ziplist-entries(默认128个),且每个元素的值小于zset-max-ziplist-value(默认64字节)
skiplist:不满足上述条件时,使用skiplist
使用场景:排行榜、热门查询
hash:value为键值对map类型,内部编码
ziplist:元素个数小于hash-max-ziplist-entries(默认512个),且所有元素的值小于hash-max-ziplist-value(默认64字节)
hashtable:不满足上述条件时,使用hashtable
使用场景:存储pojo,较直接序列化为字符串更直观
*****************************************
遍历键
遍历键时,由于redis单线程执行,如果键的个数很多,会造成后续命令阻塞
解决办法:可使用scan命令逐渐遍历键
scan原理:redis内部存储键使用的是hashtable+链表,空间不足时会扩容,删除元素时也可能会缩容,每次返回的游标值是下一个数组节点的数值,返回的游标值为0表示遍历完成
使用scan遍历,扩容时不会遍历到重复元素,缩容时可能会遍历到重复元素
*****************************************
慢查询
命令从客户端发送需要经历:命令发送、命令排队、命令执行、返回结果,慢查询会记录命令执行的时间
相关参数:
slowlog-log-slower-than:执行时间大于此值的会被记录,默认为10毫秒
slowlog-max-len:存储慢查询的列表大小,列表空间不足时,会删除最早的元素,可适当调高此值
相关命令:
查看慢查询日志:slowlog get [ n ]
慢查询列表长度:slowlog len
清空慢查询日志:slowlog reset
*****************************************
内存管理
内存划分
进程内存:消耗很小
对象内存:存储数据
内存碎片:内存块写入之后,不会写入其他数据,导致空间碎片
缓冲区内存:客户端缓冲、发布订阅输出缓冲、aof缓冲
内存回收时间
定时回收:redis后台会开启定时任务,对过期的键删除
惰性回收:客户端调用的时候删除过期的键
内存回收策略
volatile-lru:删除最近使用最少的超时键值对
allkeys-lru:删除所有最近使用最少的键值对
volatile-random:随机删除超时键值对
allkeys-random:随机删除所有键值对
noeviction:不删除任何键值对,此时若内存空间不足,则只可读不能写
volatile-ttl:删除存活时间最少的键值对
*****************************************
持久化
rdb:后台会定期开启内存快照,保存全量数据到磁盘,重新启动redis时,根据rdb恢复数据较快,若只使用rdb,在快照后,redis故障,快照后的数据会丢失,应配置aof文件
aof:如果开启aof文件,后台也会将写入命令持久化到aof文件,redis根据aof文件重启恢复慢,为了压缩文件大小,后台会定期根据内存数据重写aof文件
说明:如果同时配置rdb和aof,redis会优先加载aof文件,如果aof文件损坏,则重启失败