redis 概述


redis 概述

 

*****************************************

基本特性

 

基于内存操作,读写速度快;

单线程运行,避免线程上下文切换

非阻塞IO,使用I/O多路复用模型

基本数据结构为key==》value,value可为多种数据类型,操作较为简单

可主从/哨兵,集群部署,具有高可用、分布式特性

 

*****************************************

数据类型及内部编码

 

redis 概述_第1张图片

数据类型查看: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表示遍历完成

          redis 概述_第2张图片

使用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文件损坏,则重启失败

 

 

你可能感兴趣的:(redis)