Redis
2019-09-27 13:42:41 0 举报
AI智能生成
最全面的Redis知识图谱!学习或面试必备佳品!
作者其他创作
大纲/内容
redis使用场景
缓存
将热点数据放到内存中,设置内存的最大使用量以及过期淘汰策略来保证缓存的命中率。
计数器
Redis 这种内存数据库能支持计数器频繁的读写操作。
应用限流
限制一个网站访问流量。
消息队列
使用 List 数据类型,它是双向链表。
查找表
使用 HASH 数据类型。
交集运算
使用 SET 类型,例如求两个用户的共同好友。
排行榜
使用 ZSET 数据类型。
分布式 Session
多个应用服务器的 Session 都存储到 Redis 中来保证 Session 的一致性。
分布式锁
除了可以使用 SETNX 实现分布式锁之外,还可以使用官方提供的 RedLock 分布式锁实现。
发布和订阅
订阅者订阅了频道之后,发布者向频道发送字符串消息会被所有订阅者接收到。
某个客户端使用 SUBSCRIBE 订阅一个频道,其它客户端可以使用 PUBLISH 向这个频道发送消息。
发布与订阅模式和观察者模式有哪些不同?
1.观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。
2.观察者模式是同步的,当事件触发时,主题会去调用观察者的方法;而发布与订阅模式是异步的。
集群
复制
通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。
一个从服务器只能有一个主服务器,并且不支持主主复制。
连接过程
主从链
哨兵
Sentinel(哨兵)可以监听主服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器。
分片
三种分片方式
客户端分片:客户端使用一致性哈希等算法决定键应当分布到哪个节点。
代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上。
服务器分片:Redis Cluster。
持久化
RDB 持久化(即快照持久化)
AOF 持久化
同步选项
always
每个写命令都同步
everysec
每秒同步一次
no
让操作系统来决定何时同步
4.0版本开始支持RDB和AOF混用的方式进行持久化
事件
Redis 服务器是一个事件驱动程序。
Redis 服务器需要处理两类事件
文件事件
时间事件
事件的调度与执行
高可用和分布式
高可用实现
Redis Sentinel
分布式实现
Redis cluster
redis能存储哪些数据类型?
键
只能为字符串。
值
字符串(STRING)
字符串、整数或者浮点数(Strings, integers, or floating-point values)
最多可以容纳的数据长度是512M
列表(LIST)
Linked list of strings
集合(SET)
无序集合(Unordered collection of unique strings)
无序集合(Unordered collection of unique strings)
有序集合(ZSET (sorted set))
Ordered mapping of string members to floating-point scores, ordered by score
散列表(HASH)
包含键值对的无序散列表(Unordered hash table of keys to values)
Redis 与 Memcached的区别?
数据类型
Memcached 仅支持字符串类型。
而 Redis 支持五种不同种类的数据类型,使得它可以更灵活地解决问题。
数据持久化
Memcached 不支持持久化。
Redis 支持两种持久化策略:RDB 快照和 AOF 日志。
分布式
Memcached 不支持分布式。
Redis Cluster 实现了分布式的支持。
内存管理机制
网络IO模型
Redis使用单线程的IO复用模型
Memcached是多线程,非阻塞IO复用的网络模型
缓存失效策略
FIFO(First In First Out)
先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
LRU(Least Recently Used)
最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
LFU(Least Frequently Used)
最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。
内存淘汰
淘汰策略(默认的策略为 noeviction 策略)
noeviction
当内存使用达到阈值的时候,所有引起申请内存的命令会报错
allkeys-lru
在主键空间中,优先移除最近未使用的 key
allkeys-random
在主键空间中,随机移除某个 key
volatile-lru
在设置了过期时间的键空间中,优先移除最近未使用的 key
volatile-random
在设置了过期时间的键空间中,随机移除某个 key
volatile-ttl
在设置了过期时间的键空间中,具有更早过期时间的 key 优先移除
如何选择淘汰策略?
如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru。
如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用 allkeys-random。
volatile-lru 策略和 volatile-random 策略适合我们将一个 Redis 实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个 Redis 实例来达到相同的效果。
将 key 设置过期时间实际上会消耗更多的内存,因此我们建议使用 allkeys-lru 策略从而更有效率的使用内存。
事务
事务可以一次执行多个命令, 并且有两个重要的保证
事务是一个单独的隔离操作
事务是一个原子操作
事务相关的命令
EXEC
负责触发并执行事务中的所有命令。
MULTI
用于开启一个事务,它总是返回 OK 。
DISCARD
当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出。
WATCH
可以为 Redis 事务提供 check-and-set (CAS)行为。
取消 WATCH 的场景
当 EXEC 被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。
使用 WATCH 创建原子操作
WATCH 可以用于创建 Redis 没有内置的原子操作。
WATCH 使得 EXEC 命令需要有条件地执行:事务只能在所有被监视键都没有被修改的前提下执行,如果这个前提不能满足的话,事务就不会被执行。
Redis 不支持回滚,这种做法的优点
Redis 命令只会因为错误的语法而失败,或是命令用在了错误类型的键上面。
因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
算法
一致性哈希算法
一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形)
hash算法的选择
判断哈希算法好坏的4个定义
平衡性(Balance)
单调性(Monotonicity)
分散性(Spread)
负载(Load)
一致性Hash算法的容错性和可扩展性
倾斜问题
引入虚拟节点来解决
优势:一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
选举法?(从服务器中选举出新的主服务器)
哨兵(Sentinel)机制
作用
1.监控所有节点数据库是否在正常运行。
2.master数据库出现故障时,可以自动通过投票机制,从slave节点中选举新的master,实现将从数据库转换为主数据库的自动切换。
任务
监控(Monitoring)
提醒(Notification)
自动故障迁移(Automatic failover)
哨兵机制的缺点
1.主从服务器的数据要经常进行主从复制,这样造成性能下降。
2.当主服务器宕机后,从服务器切换成主服务器的那段时间,服务是不能用的。
哨兵(sentinel) 的一些设计思路和zookeeper非常类似
常见问题
为什么redis需要把所有数据放到内存中?
Redis是单进程单线程的
redis的并发竞争问题如何解决?
redis持久化的几种方式
redis的缓存失效策略和主键失效机制
redis实现分布式锁的思想
Redis常见性能问题和解决方案
0 条评论
下一页