面试_数据库_Redis


摘自:CyC公众号
https://cyc2018.github.io/CS-Notes/#/notes/Redisid=%e4%b8%89%e3%80%81%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84


一、概述

Redis 是一种非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。Redis 服务器是一个事件驱动程序。Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。**Sentinel(哨兵)**可以监听集群中的服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器。


二、数据类型

数据类型可以存储的值操作
STRING字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作对整数和浮点数执行自增或者自减操作
LIST列表从两端压入或者弹出元素 对单个或者多个元素进行修剪,只保留一个范围内的元素
SET无序集合添加、获取、移除单个元素检查一个元素是否存在于集合中计算交集、并集、差从集合里面随机获取元素
HASH包含键值对的无序散列表添加、获取、移除单个键值对获取所有键值对检查某个键是否存在
ZSET有序集合添加、获取、删除元素根据分值范围或者成员来获取元素计算一个键的排名

三、数据结构

1、字典

dictht 是一个散列表结构,使用拉链法解决哈希冲突。Redis 的字典 dict 中包含两个哈希表 dictht,这是为了方便进行 rehash 操作。在扩容时,将其中一个 dictht 上的键值对 rehash 到另一个 dictht 上面,完成之后释放空间并交换两个 dictht 的角色。rehash 操作不是一次性完成,而是采用渐进方式,这是为了避免一次性执行过多的 rehash 操作给服务器带来过大的负担。渐进式 rehash 通过记录 dict 的 rehashidx 完成,它从 0 开始,然后每执行一次 rehash 都会递增。例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],这一次会把 dict[0] 上 table[rehashidx] 的键值对 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。在 rehash 期间,每次对字典执行添加、删除、查找或者更新操作时,都会执行一次渐进式 rehash。采用渐进式 rehash 会导致字典中的数据分散在两个 dictht 上,因此对字典的查找操作也需要到对应的 dictht 去执行。

2、跳跃表

跳跃表是基于多指针有序链表实现的有序集合的底层实现之一,可以看成多个有序链表。在查找时,从上层指针开始查找,找到对应的区间之后再到下一层去查找。
与红黑树等平衡树相比,跳跃表具有以下优点:

  • 插入速度非常快速,因为不需要进行旋转等操作来维护平衡性;
  • 更容易实现;
  • 支持无锁操作。

四、使用场景

1、计数器

可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

2、缓存

将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。淘汰策略包括:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰(volatile-lru)、从已设置过期时间的数据集中挑选将要过期的数据淘汰(volatile-ttl)、从已设置过期时间的数据集中任意选择数据淘汰(volatile-random)、从所有数据集中挑选最近最少使用的数据淘汰(allkeys-lru)、从所有数据集中任意选择数据进行淘汰(allkeys-random)、禁止驱逐数据(noeviction)。

3、查找表

例如 DNS 记录就很适合使用 Redis 进行存储。查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。

4、消息队列

List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用 Kafka、RabbitMQ 等消息中间件。

5、会话缓存

可以使用 Redis 来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。

6、分布式锁实现

在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。

7、其他

Set 可以实现交集、并集等操作,从而实现共同好友等功能。ZSet 可以实现有序性操作,从而实现排行榜等功能。


五、Redis 与 Memcached比较

1、数据类型

Redis 支持五种不同的数据类型,Memcached 仅支持字符串类型。

2、数据持久化

Redis 支持两种持久化策略:RDB 快照和 AOF 日志,而 Memcached 不支持持久化。RDB 快照:将某个时间点的所有数据都存放到硬盘上。可以将快照复制到其它服务器从而创建具有相同数据的服务器副本;如果系统发生故障,将会丢失最后一次创建快照之后的数据;如果数据量很大,保存快照的时间会很长。AOF 日志:将写命令添加到 AOF 文件(Append Only File)的末尾,Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。同步选项分为

选项同步频率性能
always每个写命令严重减低服务器的性能
everysec每秒对服务器性能几乎没有任何影响
no由操作系统决定增加系统崩溃时数据丢失的数量,性能优化不明显

3、分布式

Redis Cluster 实现了分布式的支持,Memcached 不支持分布式。这里得提一句分片。Redis Cluster是实现了服务器分片,按照分片的位置可以分为三种分片方式:客户端分片、代理分片、服务器分片。还有范围分片、哈希分片。

4、内存管理机制

  • 在Redis 中不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached的数据则会一直在内存中。
  • Memcached将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。

六、事件

文件事件

服务器通过套接字与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象。

时间事件

服务器有一些操作需要在给定的时间点执行,时间事件是对这类定时操作的抽象

七、复制

通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。一个从服务器只能有一个主服务器,并且不支持主主复制。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值