redis
注:本文都是对官方文档的搬运:
https://redis.io/documentation
https://redis.io/topics/data-types-intro
Redis的数据类型
Redis支持五种数据类型:Strings(字符串)、Hashes(哈希)、Lists(列表)、Sets(集合)、Sorted sets(有序集合)。
Strings
redis最基本的数据类型,是二进制安全,即可以存储任何数据,因为任何数据都能转换为二进制数据。但是字符串的值最大为512M。
常用操作:
- 原子计数器:利用INCR, DECR, INCRBY,DECRBY命令可以实现原子增减操作。
- 字符串追加:使用APPEND命令附加到字符串末尾。
- 下标操作: GETRANGE 获取指定下标字符串 和 SETRANGE在指定下标插入一个字符串
- 布隆过滤器:GETBIT和SETBIT创建布隆过滤器,占用空间小。
Lists
字符串列表,双向链表实现的双端队列,可在头部和尾部分别进行入队和出队的操作,具备队列和栈的功能。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
基于lists可以实现消息队列。
Sets
无序的字符串集合。以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。
Sets不允许重复数据,所以可以实现字符串去重的功能。
Sets可以实现取交集、并集、差集、获取随机元素的功能。
Sets可以统计访问人数
Hashes
字符串字段和字符串值之间的映射,可以存储对象的数据类型。
一个拥有少量(100个左右)字段的hash需要 很少的空间来存储,所有你可以在一个小型的 Redis实例中存储上百万的对象。
Sorted sets
排序的Sets,O(log(N))完成添加,删除和更新元素的操作,插入时就排好序。
可以实现动态的排行榜。
可以对数据进行排序,然后分页获取数据。
redis名称:remote directory server(远程字典服务),使用单进程epoll模型。
特点:支持持久化、支持丰富的数据类型、支持数据备份(主从复制备份)
数据持久化
redis支持两种持久化方案 RDB和AOP
RDB
在指定时间间隔内将内存中的数据生成快照写入硬盘。
原理:fork出一个子进程,子进程包含父进程的所有数据,在子进程中生成RDB文件,这个过程中主进程还能对外继续工作。
优点:在大容量备份时,效率高于AOP,数据恢复也快于AOP
缺点:由于fork出来的子进程包含所有父进程所有数据,导致内存会突然膨胀一倍。宕机时会丢失几分钟的数据,通常用于备份一些不敏感的数据,数据就算丢失也在可接受范围内。
触发条件:默认为1分钟1万次修改或5分钟10次修改或15分钟1次修改。(这里的修改是指发生了写操作,即使对同一个key发生10次修改,,也会触发5分钟一次的备份)
flushall和shutdown都会生成一个rdb文件,flushall会生成一个空的rdb文件,导致server重启后的数据也都是空的。
rdb也可以手动触发,save命令会阻塞会阻塞服务进程,使redis不能对外服务,直到RDB文件创建完毕为止,服务器不能处理任何命令请求。bgsave会fork一个子进程进行文件备份,主进程不影响服务。
AOF
以日志的形式记录所有写操作,redis启动后会读取aof文件,并从头到尾执行一遍命令恢复数据,如果数据量很大的情况,这个时间会比rdb长。
原理:用追加的方式,记录所有写操作
优点:支持多种持久化策略,每秒同步,修改同步,不同步,数据完整性较rdb而言更好。
缺点:恢复速度慢于rdb,文件膨胀过快使占用空间过大,执行效率低于rdb
执行flushdb和flushall也会被记录到aof中,如果这时服务挂了,重启后数据就都没了,可以删除aof文件最后的flushdb或flushall恢复。
服务器非正常关机导致aof或者rdb文件损坏,可以使用redis_check_aof和redis_check_rdb进行修复。
rewrite
aof提供rewrite方式对aof文件进行重写以减小文件大小。
rewrite并不是在已有的aof文件上进行重写,而是和rdb类似,fork一个子进程,在子进程中对内存中的数据重新生成一个aof文件,然后覆盖。这个覆盖过程会出现主进程短暂IO阻塞。
事务
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
redis是部分支持事务,不保证事务的原子性。
redis可以将多个命令入队组成一个事务进行执行,执行过程中不会接受队列外的任何命令操作。
2.6.5版本以后,开始事务后,如果有一条命令入队失败,则提交事务后,redis会拒绝执行并放弃事务。
2.6.5版本以前,开始事务后,redis指执行入队成功的队列。
即便入队成功,事务提交也有可能命令执行失败,这时不会对整个事务回滚,执行失败的任务会忽略并继续往下执行并最终提交执行成功的命令。
主从复制
使用slaveof ip port 连接主机
作用:读写分离,容灾恢复
数据同步流程:
从机首次连接主机
是:执行全量复制,主机bgsave生成rdb,然后发送给从机,从机接受后恢复数据
否:尝试部分同步,将从机断开连接到重连主机的这段时间发生的写操作发送到从机进行增量复制,如果部分同步失败,则采用全量复制
在没有哨兵且没有在配置文件中进行主备配置的情况下,主从复制的主机挂了,从机不会进行主备切换,而是等待主机重连,主机恢复后,主从结构恢复正常。若从机挂了,服务恢复后,从机会脱离主从结构,成为一个独立的主机。
哨兵
连接所有主从结构的机器,并监控主机是否故障,如果故障则根据从机的投票数将从机转换为主机
当主机挂了,在从机中产生新的主机,原主机恢复后的一小段时间,原主机会变成一个单独的主节点,直到哨兵监控到后,会将它挂载到现在主从结构的主机下成为从节点。