Crash-Course-in-Redis

Redis FAQ


  • Redis与其他K-V存储有什么不同?
1
2
3
Redis在键值数据库中有着不同的发展路径,其值可以包含更复杂的数据类型,并在这些数据类型上定义了原子操作。Redis的数据类型与基本数据结构密切相关,因此无需额外的抽象层,程序员就能直接看到这些数据类型.

Redis是一种内存型并且可持久化到磁盘上的数据库,因此它代表了一种不同的权衡,即在实现极高的写入和读取速度的同时,限制数据集不能大于内存,内存数据库的另一个优势是与磁盘上相同数据结构相比,负载数据结构在内存中表示操作要简单的多,因此Redis只需很少的内部复杂性就能做很多事情,同时,磁盘持久化存储格式支持(RDB和AOF)
  • Redis的内存占用情况如何?
1
2
3
4
5
6
举几个例子 (均使用64位实例):
1. 一个空实例使用 -- 3MB内存
2. 100万个小键 -> 字符串值对使用 85MB内存
3. 100万小键 -> 哈希值,代表一个有5个字段的对象,使用160MB内存

测试你的用例非常简单,使用`redis-benchmark`工具生成随机数据集,然后使用`info memory`命令查看使用空间
  • 能否将Redis与基于磁盘的数据库一起使用?
1
一种常见的设计模式就是在Redis中获取写入非常大的小数据(你需要用Redis数据结构对问题进行高效建模),并将大块数据存储到SQL或最终一致的磁盘数据库中。同样,有时候会使用Redis将存储在磁盘数据库中的相同数据的子集拷贝到内存中,这看起来与缓存类似,但实际上是一种更先进的模式,因为Redis数据集通常与磁盘数据库数据集一起更新,而不是在缓存未命中时刷新.
  • 如何减少Redis的总体内存使用量?
1
一个好的做法是,在Redis中将逻辑数据模型映射到物理数据模型时考虑内存消耗,这些考虑因素包括使用特定的数据类型、键模式和规范.
  • 如果Redis内存不足会怎样?
1
Redis有内置保护措施,允许用户设置内存使用的最大限制,使用配置文件中的maxmemory选项来限制Redis可以使用的内存,如果达到这个限制,Redis就会开始错误回复写入命令(但会继续接收读命令)
  • Redis磁盘快照是原子的吗?
1
是的,Redis后台保存进程总是fork当前主进程,因此从磁盘快照的角度来看,每条命令都是原子操作.
  • Redis如何使用多个CPU或内核?
1
CPU成为Redis瓶颈的情况并不常见,因为Redis通常都是内存或网络绑定的,例如,当使用流水线,在普通Linux系统上运行的Redis实例每秒可提供100万个请求,所以如果你的应用程序主要使用O(N)O(log(N))命令,几乎不会占用太多CPU.
  • 单个Redis实例可容纳的最大键数是多少?散列、列表、集合和排序集合中元素的最大数量是多少?
1
Redis可以处理2^32个元素。经过测试,每个实例至少可以处理2.5万亿个元素,每个散列、列表、集合和排序集合都能容纳2^32个元素.
  • 为什么我的副本与主实例的key数量不相同?
1
2
3
4
5
6
7
8
如果使用的key有过期时间的话,副本实例和主实例的有效key的数量会不一样.

1. 主实例会在与副本实例首次同步时生成一个RDB文件
2. RDB文件不会包含主实例中已经过期但仍在内存中的key
3. 即使逻辑上已经过期,这些key仍在Redis主实例的内存中,他们将被视为不存在,其内存将在以后被回收,要么时增量回收,要么时访问时显式回收,虽然这些key在逻辑上不是数据集的一部分,但他们会在INFO输出和DBSIZE命令中被记录下来
4. 当副本读取主数据库生成的RDB文件时,将不会加载这组key

因此,拥有许多过期key的用户在副本中看到key数量较少是很正常的,不过,从逻辑上讲,主实例和副本内容是一样的

Crash-Course-in-Redis
https://blog.chyidl.com/2024/03/15/Crash-Course-in-Redis/
作者
Yaqing Chyi
发布于
2024年3月15日
许可协议