1.Redis简介
- Redis是一个高性能的key-value内存数据库,支持持久化,可将数据保存在磁盘,重启时加载;
- Redis是单线程模型,所有操作都是原子性的。单个操作是原子性的,多个操作也支持事务;
- Redis单机支持多个数据库,每个数据库的数据是隔离的。数据库从0开始的递增数字命名,默认支持16个数据库。集群没有数据库的概念;
2.Redis数据类型
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set有序集合)
3.Redis发布订阅
- 一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息;
- 一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订阅者;
- 特性
- 可靠性
- 不可靠发布者发布消息,如没有订阅者或者订阅者中途掉线,消息将丢失;
- 实时性
- 实时性高
- 持久性
- 是针对于整个redis缓存的内容持久化;
- 队列监控
- 监控比较困难
- 可靠性
- 特点
- 轻量级,低延迟,高并发,低可靠性;
- 适用于对可靠性要求不高的异步交互场景;
4.Redis事务
- Redis事务可一次执行多个命令:
- 在EXEC前把操作放入队列缓存;
- 在EXEC后执行事务,任意命令执行失败,其余的命令依然被执行;
- 在事务执行中,不能插入其它操作;
- 批量指令非原子化操作,某条指令失败不会回滚已做指令,也不会取消后续指令
- 事务执过程:
- multi: 开始事务;
- 命令入队;
- exec: 执行事务;
- 相关命令:
- watch key1 key2 … : 监视一或多个key(类似乐观锁);
- multi: 事务开始;
- exec: 执行事务;
- discard : 取消事务(放弃事务块中的所有命令);
- unwatch : 取消watch对所有key的监控;
- 说明
- 若在事务队列中存在命令性错误,则所有命令都不会执行;
- 若在事务队列中存在语法性错误,则其他正确命令会被执行,错误命令抛出异常;
- watch类似于乐观锁,在事务提交时,果watch监控的任何KEY的值被更改,则事务队列将不会被执行;
- EXEC执行事务后,无论事务是否成功, WARCH的监控都会取消;
5.Redis集群
- 主从模式
- 一个主redis服务器,多个从服务器。在master节点写入数据后,同步到slave节点,实现数据的备份,并且可以在slave节点进行查询,实现读写分离;
- 优点
- 数据备份
- 读写分离
- 高可靠性
- slave节点下线不影响读取其他slave节点和写master节点,启动后可恢复数据;
- master节点下线,不影响读slave节点,可手动切换到其它master节点;
- 缺点
- master节点下线,需要手动切换master节点,不能自动切换;
- 每个节点都保存全量数据,对每个节点的资源要求较高,且不易扩展;
- 哨兵(sentinel)模式
- 一个或多个Sentinel实例组成的Sentinel系统监视任意多个redis主服务器和下属的所有从服务器,在被监视的主服务器下线时,自动将下属的某个从服务器升级为新的主服务器;
- 优点
- 数据备份
- 读写分离
- 高可靠性
- master节点下线,Sentinel会自动推举其它slave节点为master节点,不影响系统运行;
- 易维护
- 相对于集群模式,需要的服务器数量较少,易于维护,适用于数据量一般的场景;
- 缺点
- 每个节点都保存全量数据,对每个节点的资源要求较高,且不易扩展;
- 集群(cluster)模式
- 采用去中心化的思想,使用hash slot方式将16348个hash slot覆盖到所有节点上,每个节点保存一部分数据;
- 取值时先获取到对key对应的hash slot,然后找到他的hash slot所在节点,由当前访问节点从hash slot所在节点取数据;
- 优点
- 负载均衡
- 每个节点保存部分数据,易扩展
- 高可靠性
- 缺点
- 难维护
- 一般至少需要三主三从架构,相对于哨兵模式难于维护,适用于数据量比较大的场景
- 难维护