一、数据类型
- String:缓存对象、常规计数、分布式锁
- List:消息队列
- Set/Zset:点赞(去重)、共同关注(交集运算)、Zset:排行榜
- Hash:缓存对象、购物车
二、备份
RDB(Redis Database):
通过生成数据快照的方式,将当前内存中的数据集保存到一个RDB文件中,再用这个临时文件替换之前的RDB文件。这种方式可以定期执行,以实现数据的持久化。
优点:
- RDB文件紧凑,占用空间小。
- RDB文件的恢复速度快。
- 适合于灾难恢复。
缺点:
- 数据可能不是最新的,因为RDB是定期备份的。
- 在备份过程中,fork子进程会占用一定的内存资源。
AOF(Append Only File):
以追加的方式记录Redis执行的所有写操作命令到一个AOF文件中。每当Redis执行一个写操作时,这个操作就会被追加到AOF文件的末尾。当Redis重启时,可以通过重新执行AOF文件中的命令来恢复数据。
优点:
- 数据更完整,因为AOF记录了所有的写操作。
- 可以在配置中设置AOF的同步策略,以平衡性能和数据安全性。
缺点:
- AOF文件通常比RDB文件大,因为AOF记录了所有的写操作。
- 恢复数据时需要重新执行AOF文件中的命令,这可能会比RDB慢。
三、运行原理
IO多路复用(select/poll/epoll)
四、集群
Redis 单副本
采用单个 Redis 节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。
Redis 多副本(主从)
采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。主从实例部署在不同的物理服务器上,根据公司的基础环境配置,可以实现同时对外提供服务和读写分离策略。
Redis Sentinel(哨兵)
Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。
Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主节点和从节点发送 PING 命令来检测它们的状态,当哨兵进程发现 master主节点 不可用时,根据投票数自动将某一个 slave 转换 master,然后通过消息订阅模式通知其它 slave,让它们切换到新的 master主节点 上,从而实现故障转移。然而,一个哨兵进程对 Redis 服务器进行监控,可能会出现问题,为此,我们可以使用多哨兵进行监控。哨兵进程还可以监控 Redis 集群的配置变化,并在配置变化时通知客户端进行相应的调整。
哨兵模式三大任务:
- 监控
- 提醒
- 自动故障迁移
选举算法:Raft
Redis Cluster
一致性 Hash 算法:虚拟节点解决不平衡问题 2^14-1 即 16348个槽 slot
数据分片 CRC16(key) % 16384来计算键key属于哪个槽
五、命令
通用命令
- KEYS 查看所有符合模板的key
- DEL 删除一个指定的key
- EXISTS 判断key是否存在
- EXPIRE 给key设置有效期,到期会删除key
- TTL 查看key的剩余有效期
- HELP [command] 查看命令的具体用法
String
- SET [key] [value] 添加或者修改已经存在的一个 String 类型的键值对
- GET [key] 根据 key 获取 String 类型的 value
- INCR [key] 让 key 自增1个
- INCRBY [key] [increment] 让 key 自增 increment 个
- INCRBYFLOAT [key] [increment] 让浮点型 key 自增 increment 个
- SETNX [key] [value] 添加一个String类型键值对, 前提key不存在,否则不执行
- SETEX [key] [second] [value] 添加一个String类型键值对并指定有效时间
Hash
- HSET [key] [field] [value] ([filed] [value] …) 添加或者修改hash类型key的field的值
- HGET [key] [field] 获取一个hash类型key的field的值
- HGETALL [key] 获取hash类型的key中所有的field和value
- HKEYS [key] 获取一个hash类型的key中所有的field
- HVALS [key] 获取一个hash类型的key中所有的value
- HINCRBY [key] [field] [increment] 让hash类型key的字段自增
- HSETNX [key] [field] [value] 添加一个hash类型的key的field的值, 如果存在就不执行
List
- LPUSH [key] [element] ([element] …) 向左侧插入一个或者多个元素
- LPOP [key] 移除并返回列表左侧的第一个元素, 没有返回nil
- RPUSH [key] [element] ([element] …) 向右侧插入一个或者多个元素
- RPOP [key] 移除并返回列表右侧第一个元素, 没有返回nil
- LRANGE [key] [start] [stop] 返回一段范围内的所有元素
Set
- SADD [key] [member] ([member] …) 添加一个元素
- SREM [key] [member] ([member] …) 删除一个元素
- SCARD [key] 返回元素个数
- SISMEMBER [key] [member] 判断是否存在一个元素
- SMEMBERS [key] 获取所有的元素
Zset
- ZADD [key] [score] [member] ([score] [member] …) 添加一个或者多个元素, 如果存在,更新score值
- ZREM [key] [member] ([member] …) 删除指定元素
- ZSCORE [key] [member] 获取指定元素的score值
- ZRANK [key] [member] 获取指定元素的排名
- ZCARD [key] 获取元素个数
- ZCOUNT [key] [min] [max] 统计指定范围内的元素个数
- ZRANGE [key] [min] [max] 获取指定排名范围内的元素
- ZRANGEBYSCORE [key] [min] [max] 获取指定score范围内的元素