Redis知识小记

Redis的数据结构

  • SDS简单动态字符串
    以空字符’\0’结尾; 自动增长或缩减内存空间; 空间预分配(空间小M,预分配一倍空间;大于1M,预分配1M空间);可以保存一系列二进制数据(图片,音频,视频,压缩文件等);兼容部分C语言字符串函数。
  • 链表
    特点:双端,无环,多态(使用空指针保存节点值,可以用于保存不同类型的值)
  • 字典
    Redis数据库的底层实现; 哈希键的底层实现之一(键值对较多,或者键值对中的元素是比较长的字符串)。
    字典的底层实现:哈希表。使用拉链法实现的哈希表(新结点置于链表头);哈希结点值类型包含:void*, uint64_t, int64_t。
    字典结构体中包含:哈希函数指针,哈希函数参数,两个哈希表(用于哈希表的负载因子过大或过小时,进行渐进式的rehash,动态调整哈希表空间)
  • 跳跃表
    跳跃表是一种有序数据结构,通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。Redis使用跳跃表作为有序集合键的底层实现之一(元素数量较多或者元素是比较长的字符串时)。
    跳跃表结点:后退指针(往前遍历),分值(跳跃表所有节点按分值大小排序,分值相同按对象的字典序排序),成员对象,层(含多个结点指针和跨度,跨度用来计算结点的排位)
    跳跃表:头、尾指针,表长度(不含头结点,头结点用于遍历所有层),最大层数。
    跳跃表的查、插、删的平均复杂度均为O(logN),最坏为O(N),其效率可以与平衡二叉树相媲美,实现又更为简单。(空间换时间)
  • 整数集合
    整数集合是集合键的底层实现之一(集合只含整数值并且数量不多时)
    保证集合中元素是有序的且不重复的,可存int16_t,int32_t,int64_t。当插入的数的位数高于当前存的数时,会进行升级,使所有元素的类型都相同。但不会降级。这样可以尽可能节约内存,同时可以让集合同时存几种不同位数的整数值。
  • 压缩列表
    压缩列表是列表键和哈希键的底层实现之一(列表键、哈希键较少且是小整数或短字符串)
    压缩列表是由一系列的连续内存块组成的顺序型数据结构。结构:字节数,尾指针,结点数,结点,结束符
    压缩结点:前一结点的长度、结点数据的类型和长度、结点的值(整数或字节数组)
    可能会导致连续更新,机率较小。

Redis的对象系统

字符串对象、列表对象、哈希对象、集合对象和有序集合对象

使用引用计数智能管理和共享对象; 对象带有访问时间记录信息,用于计算数据库键的空转时长(若启用了maxmemory功能,删除空转最长的键)

  • 对象包含键与值,键总是一个字符串对象,值可为五种对象中的其中一种。

对象底层使用的数据结构(object encoding)

  • 字符串对象:整数值、embstr编码的SDS(长度小于39字节、只读)、SDS。(浮点数作为字符串值保存的)

  • 列表对象: 压缩列表(结点数量少且是小字符串)、双端链表

  • 哈希对象: 压缩列表(键值紧挨,结点数量少且键值的字符串长度较小)、字典(键值均为字符串)

  • 集合对象: 整数集合(均为整数且元素较少)、字典(键为字符串,值为NULL)

  • 有序集合对象: 压缩列表(结点数量少且长度小)、跳跃表和字典

    • 压缩列表:每个集合元素使用两个紧挨的压缩列表结点,分别保存元素的成员和元素的分值,按分值从小到大排序
    • 跳跃表和字典:有序集合对象使用zset结构作为底层实现,一个zet结构同时包含一个字典和一个跳跃表。跳跃表按分值排序保存了所有集合元素(快速进行范围查找),字典创建了成员到分值的映值(O(1)的查找复杂度)

    在需要的时候,会自动切换底层的数据结构。所有导致切换的上限值均可调

    对任何类型的键均有效的命令:DEL、EXPIRE、RENAME、TYPE、OBJECT

数据库命令

  • 切换数据库select n;清空数据库flushdb; 随机返回键randomkey; 数据库键数量 dbsize

  • 使用过期字典实现的命令:设置键生存时间 expire/pexpire key Time(单位秒/毫秒) 键的剩余生存时间 ttl/pttl key

  • 设置过期时间 expireat/pexpireat key Timestamp(时间戳,秒或毫秒) 移除过期时间 persist key

过期键删除策略

  • 定时删除(占用大量CPU时间,不现实);

  • 惰性删除(取键时判定键是否过期;浪费内存);

  • 定期删除。Redis配合使用后两种策略。

    主服务器控制从服务器统一地删除过期键;
    数据库通知:客户端通过订阅给定的模式,来获知数据库中键的变化。

持久化

RDB持久化
将某时间点的数据库状态保存到一个RDB文件中(经过压缩的二进制文件),可用于还原该时间点上的数据库状态
Redis默认策略,性能更高,安全性较低
save命令:阻塞服务器进程直至RDB文件创建完毕。BGSAVE命令:派生子进程负责创建RDB文件。RDB文件的载入工作是在服务器启动时自动执行的,此时服务器会一直阻塞直至载入完成。但RDB的优先级低于AOF。
save选项实现自动间隔性保存:如 save 900 1 表示900秒内对数据库进行了至少一次修改,就执行BGSAVE。

AOF持久化
通过保存Redis服务器所执行的写命令来记录数据库状态。安全性较高,性能较低
AOF文件的写入与同步(即保存)策略:always, everysec, no
AOF重写(BGREWRITEAOF):解决AOF文件体积膨胀的问题,去除冗余指令

事件:文件事件与时间事件

文件事件:Redis基于Reactor模式实现了网络事件处理器
时间事件 Redis将所有时间事件放在一个无序链表中,当时间事件执行器执行时,就遍历链表查找所有已到达的时间事件

数据库复制

SLAVEOF命令:使当前服务器成为另一台服务器(主服务器)的从服务器
新版复制功能的实现:完整重同步(初次同步); 部分重同步(断线后重复制),主服务器将断线期间执行的写命令发送给从服务器

Sentinal

Sentinal是Redis高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器下线时,自动将某个从服务器升级为新的主服务器,并让其它的从服务器成为新的主服务器的从服务器,若旧的主服务器重新上线时,将它设置为新的主服务器的从服务器。

集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能

节点:一个Redis集群由多个节点(运行在集群模式下的Redis服务器)组成。连接各个节点可使用命令cluster meet

槽:Redis集群通过分片的方式来保存数据库中的键值对,集群的整个数据库被分成16384个槽,每个键属于其中的一个槽,集群中的每个节点可以处理0~16384个槽。当所有槽都有节点在处理时,集群处于上线状态,相反的,处于下线状态。

槽指派命令 cluster addslots [slot…]。若客户端向节点发送与数据库键有关的命令时,键所在的槽并没有指派给接收命令的节点,此时节点会向客户端返回MOVED错误,指引客户端转向正确的节点。

重新分片:Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目的节点),并且相关槽所属的键值对也会从源结点移动到目的节点。

复制和故障转移

Redis集群中的节点分为主节点和从节点。设置从节点命令:cluster replicate <node_id>,发送命令的节点就成为了从节点。

故障检测:集群中的每个节点都会定期地向集群中其它节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定时间内返回PONG消息,则会被标记为疑似下线,若集群中半数以上的主节点都将某个主节点报告为疑似下线,那么这个主节点将被标记为已下线。这时会从其从节点中推举出一个新的主节点,进行故障转移。

事务

Redis通过MULT、EXEC、WATCH等命令来实现事务功能。事务首先以MULTI命令为开始,接着将多个命令放入事务当中,最后由EXEC命令将这个事务提交给服务器执行。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其它客户端的命令请求,直至事务中的所有命令都执行完毕。

WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。

Redis的事务也具有ACID性质(运行在某种持久化模式下)。
Redis与传统的关系型数据库事务的最大区别在于,Redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直至事务队列中的所有命令都执行完毕,但所有命令都不会生效。这是因为事务回滚这种复杂的功能和Redis追求简单高效的设计主旨不符。

因为Redis使用单线程的方式来执行事务,并且服务器保证在执行事务期间不会中断事务,因此Redis中的事务总是以串行的方式运行,具有隔离性。

排序

Redis的SORT命令可以对列表键、集合键或有序集合键的值进行排序。

SORT <key> (ALPHA) (DESC) (LIMIT <offset> <count>)

默认情况下,SORT命令执行升序排序。也可以使用BY选项,指定某些字符串键或者某个哈希键所包含的某些域来作为元素的权重,进行排序。

使用GET选项,可以让SORT命令在对键进行排序之后,根据被排序的元素,以及GET选项所指定的模式,查找并返回某些键的值。使用STORE选项,可以将排序结果保存在指定的键里面。

二进制位数组

Redis使用字符串对象来表示位数组,因为SDS结构是二进制安全的。内部中使用逆序来保存位数组。

二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来。

命令:SETBIT、GETBIT、BITCOUNT、BITOP

慢查询日志

Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,以监视和优化查询速度

  • slowlog-log-slower-than选项指定执行时间超过多少微秒的命令会被记录到日志上

  • slowlog-max-len选项指定服务器最多保存的最查询日志数量(可使用CONFIG SET 设置这两个的值)

    使用命令SLOWLOG GET查询慢查询日志

监视器

执行命令MONITOR,客户端可以将自己变成一个监视器,实时地接受并打印服务器当前处理的命令请求的相关信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值