Redis五种常用的数据结构
结构类型 | 结构类型存储的值 | 常用的命令 |
STRING | 可以时字符串,数字或者浮点数 | set key value get key del key |
LIST | 链表,链表上的每个节点都包含了一个字符串 | RPUSH (将给定值推入列表的右端) LRANGE (获取列表的给定范围上的所有值) LINDEX (获取列表在给定位置上的单个元素) LPOP (从右端弹出一个值并返回弹出的值) |
SET | 包含字符串的无序收集器,并且包含的字符串都是不重复的 | SADD SMEMBERS SISMEMBER SREM |
HASH | 包含键值对的无序散列表 | HSET HGET HGETALL HDEL |
ZSET | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值大小决定 | ZADD ZRANGE ZRANGEBYSCORE ZREM |
Redis的基本事务
Redis的基本事务需要用到MULTI命令和EXEC命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多歌命令。被MULTI和EXEC包围的命令会一个一个地执行,直到所有的命令都执行完毕之后,Redis才会处理其他客户端的命令。但由于EXEC命令在被调用之前不会执行任何实际操作,所以用户没办法根据读取到的数据来做决定。
Redis有5个命令可以让用户在不被打断的情况下对多个键执行操作,它们分别是WATCH、MULTI、EXEC、UNWATCH、DISCARD。因为加锁有可能会造成长时间的等待,所有Redis为了尽可能地减少客户端的等待时间、并不在执行WATCH命令时对数据进行加锁。Redis只会在数据已经被其他客户端抢先修改了的情况下通知执行了WATCH命令的客户端,这种做法被称为乐观锁。
Redis的持久化方式
方式 | 描述 | 特点 | 配置 |
快照(snapshtting) | 将某一时刻的所有数据写入到硬盘里面 | 通过发送BGSAVE或SAVE命令来创建快照,可能会丢失最近一次创建快照之后写入的数据 | save 60 1000 60秒执行1000次执行一次自动快照 stop-writes-on-bgsave-error-no 执行快照失败后是否继续执行写操作 rdbcompression yes 是否对文件执行压缩 dbfilename dump.rdb |
AOF(append-only file) | 执行写命令时将命令复制到硬盘里面 | 写入的内容首先会被存储到缓冲区,然后会在将来的某个时刻将缓冲区存储的内容写入到硬盘。 随着系统的运行,文件会越来越大 | appendonly no 是否执行AOF持久化 appendfsync erverysec 每秒将写入的内容同步到硬盘 no-appendfsync-on-rewite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb |
Redis 主从链
Redis支持主从复制,不支持主主复制,从服务器也可以拥有自己的从服务器,由此形成主从链(master/slave chaining)。
Redis目前的复制实现只保证最终一致性,而不 是强一致性。 如果程序不能够容忍过期数据,那么就应该读取 主服务器,而不是从服务器。
-
一个集群由主节点和从节点组成,主节点负责储存键值对数 据,而从节点负责复制主节点。
-
集群将整个数据库被分为 16384 个槽,集群里面的每个主节点 处理一部分槽。
-
集群里面的每个节点会互相通知其他节点自己在处理哪些槽, 并且维持一个槽表。
-
节点执行命令前需要查看槽表,判断命令是否由该节点来执 行,如果不是的话,就向客户端返回转向错误。
-
集群的复制实现重用了 SLAVEOF 代码。
-
集群中的每个节点都可以检测其他节点是否已经下线,而在线的主节点可以对下线的主节点进行故障转移。
Sentinel
● Sentinel是一个状态机,它监视着多个实例,并 根据实例的身份和状态,对实例进行操作。
● Sentinel使用PING命令来检测实例是否在线。
● Sentinel会对下线的主服务器进行故障转移,步 骤主要有三个:
1)选出一个从服务器;
2)将被选 中的从服务器升级为主服务器;
3)让其他从服务 器复制这个新的主服务器。