Skip to content

Redis文档

仲灏约 1 分钟

Redis文档

常见问题

  1. 数据库 vs Redis,有什么优缺点?为什么不直接把 Redis 当成是数据库来读写?

    数据库支持:数据持久性、事务支持、复杂查询支持,缺点是读取速度上与内存相比差很多,可扩展性上价格贵;

    Redis:读取速度快、易扩展、数据结构丰富,但是数据容量受限、成本也高、持久性会存在问题;

    虽然 Redis 可以进行数据的读写操作,但由于其设计初衷是作为快速的内存数据存储系统,不具备传统数据库的一些关键特性,如复杂的事务处理、关系数据处理等。此外,Redis 的数据持久性和一致性保障不如关系数据库严格,因此它通常不适合作为主数据库来存储关键业务数据。

  2. 为什么 Redis 适合替代数据库的读取?

    由于 Redis 的高速读取能力,它非常适合作为数据库的缓存层,尤其在高读取、低写入的场景中。当应用需要频繁读取同一数据时,使用 Redis 可以大幅减少对数据库的访问次数,从而减轻数据库的压力并提高总体性能。

  3. Redis 适合写吗?写的性能为何不如数据库?

    Redis 也支持数据的写入操作,写入性能通常很高,因为它是直接操作内存。然而,与传统数据库相比,Redis 在以下方面可能存在不足:

    数据安全性:在默认配置下,如果在数据写入到磁盘之前服务器发生故障,那么最近写入的数据可能会丢失;

    写入瓶颈:在大量写入操作时,虽然 Redis 本身处理速度快,但持久化过程(如 RDB 快照或 AOF 日志记录)可能成为性能瓶颈。

Redis客户端比较

node-redis(也称为 redis)和 ioredis 是两个流行的 Node.js 库,用于与 Redis 数据库交互。它们都提供了丰富的 API 来操作 Redis,并且都可以在生产环境中广泛使用。不过,它们在一些关键方面有所不同,以下是这两个库的主要区别:

  1. 功能性和 API 设计
  • ioredis:
    • 支持所有 Redis 命令,并且频繁更新以支持最新的 Redis 特性。
    • 支持 Redis 集群、哨兵模式和流水线(pipeline)。
    • 提供了更多的自定义选项和高级特性,如自动重连、离线队列和 Lua 脚本支持。
    • API 设计支持使用 Promises,可以很好地与现代的异步编程模式配合使用。
  • node-redis:
    • 传统上被认为是更“轻量级”的库,相比之下 API 较为简单。
    • 支持 Redis 的基本功能,包括订阅/发布模式和事务。
    • 最初只支持回调方式,但自从 v4.0.0 开始,也支持 Promises,使其与现代应用开发更为契合。
  1. 集群支持
  • ioredis 具备完整的集群支持。它可以直接连接到 Redis 集群,并自动处理节点间的重定向和故障转移。
  • node-redis 在早期版本中并不直接支持集群,需要额外的库如 redis-cluster 来实现这一功能,但最新版本已开始增加对集群的支持。
  1. 性能
  • 性能比较ioredisnode-redis 在性能上通常很接近,<u>但由于 ioredis 提供了更多的功能和灵活性,它可能在某些复杂场景下表现稍微有些开销。</u>
  • 不过,实际性能差异通常取决于具体使用场景。在大多数常规操作中,两者的性能差异不会太明显。
  1. 社区支持和文档
  • ioredis 拥有非常详尽的文档,覆盖了其提供的各种高级功能,对于需要深入了解和利用 Redis 高级特性的开发者非常有用。
  • node-redis 的文档相对简洁,足以满足大多数基本使用情况。
  1. 错误处理和连接管理
  • ioredis 提供了更为复杂的错误处理和连接管理功能,如自动重新连接、故障转移等。
  • node-redis 提供了基本的错误处理和连接管理,但没有 ioredis 那么全面。

老师推荐:如果你需要一个功能全面、支持集群和多种高级特性的客户端,并且不介意稍微复杂的配置,ioredis 是一个很好的选择

Redis镜像

官方镜像:https://hub.docker.com/_/redis

第三方镜像:https://hub.docker.com/r/bitnami/redis

哪个镜像好?

官方镜像就只提供了一个redis-server命令

bitnami提供了非常丰富的环境变量与功能,参考说明文档:https://github.com/bitnami/containers/blob/main/bitnami/redis/README.md

Redis Docker-compose配置

其他示例:https://github.com/codewithrajranjan/awesome-docker-compose/redis

yaml
version: "3.3"
services:
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    volumes:
      - redis_volume_data:/data
    ports:
      - 6379:6379
      
  redis_insight:
    image: redislabs/redisinsight:latest
    container_name: redis_insight
    restart: always
    ports:
      - 8001:8001
    volumes:
      - redis_insight_volume_data:/db

volumes:
  redis_volume_data:
  redis_insight_volume_data:

Redis桌面端客户端

https://goanother.com/cn/

image-20240428142638987

Redis配置

官方配置列表:https://redis.io/docs/latest/operate/oss_and_stack/management/config/

官方配置:https://redis.io/docs/latest/operate/oss_and_stack/management/config-file/

7.2官方配置:https://raw.githubusercontent.com/redis/redis/7.2/redis.conf

Redis 目录下有一个redis.conf 配置文件,里面会有Redis 的默认配置,通过修改该配置,可以对Redis 达到一定程度的优化;或者根据业务的不同也可以修改该配置文件。

以下为redis 的部分配置文件以属性值:

配置名含义默认值可选值是否支持热生效
常规配置
daemonize是否是守护进程noyes|no不支持
supervised是upstart还是systemd接管redis进程nono|upstart|systemd|auto不支持
pidfile进程文件/var/run/redis.pid可自定义文件路径不支持
loglevel日志级别noticedebug|verbose|notice|warning可以
logfile日志文件路径自定义不支持
syslog-enabledredis系统日志noyes|no不支持
syslog-facility系统日志facilitylocal0local0-local7不支持
databases可用的数据库数16整数不支持
文件引用
include包含外部的配置文件可自定义文件路径不支持
网络
bind如果不配置,则可接受来自于所有网络的连接127.0.0.1ip|多个ip不支持
protected-mode可与bind 组合使用,默认开启,如果redis 没有设置密码,同时bind为空,则在使用客户端连接的时候会进行提示yesyes|no不支持
unixsocketunix套接字空(不通过unix 套接字来监听)指定套接字文件不支持
unixsocketpermunix套接字权限0Linux三位数权限不支持
timeout客户端N秒没有发送数据,自动断开连接 默认禁用0整数不支持
tcp-keepalive如果值非0,单位是秒 表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态 避免服务器一直阻塞,官方给出的建议值是300S(3.2.1之后)0整数不支持
RDB快照
saveRDB的保存条件 900秒更新了一个key 300秒更新了10个key 60秒更新了10000个key 都会进行rdb 保存save 900 1 save 300 10 save 60 10000如果没有该配置 则使用自动RDB策略支持
stop-writes-on-bgsave-errorbgsave执行错误 是否停止Redis接收写请求yesyes|no支持
rdbcompressionRDB文件是否压缩yesyes|no支持
rdbchecksumRDB文件是否使用校验和yesyes|no支持
dbfilenameRDB文件名称dump.rdb自命名 建议使用dump-{port}.rdb支持
dirRDB文件存放目录redis安装目录自定义文件路径支持
主从复制
slaveof指定当前从节点复制哪个主节点ip port不支持 但可以用slaveof命令设置
requirepass密码自定义支持
masterauth主节点密码主节点的密码支持
slave-serve-stale-data当从节点与主节点连接中断时,如果此参数设置为yes 则从节点可以继续处理客户端的请求。 否则除info和slaveof命令之外,拒绝所有的请求并统一回复: "SYNC with master in progress"yesyes|no支持
slave-read-only从节点是否只读yesyes|no支持
repl-diskless-sync是否开启无盘复制noyes|no支持
repl-diskless-sync-delay开启无盘复制后,延迟多少秒后进行RDB的操作,一般用于同时加入多个从节点时,保证多个从节点共享RDB5整数支持
repl-ping-slave-period主节点定期向从节点发送ping命令,用来判断从节点是否存活(单位:秒)10整数支持
repl-timeout主节点复制超时时间,秒60整数支持
repl-disable-tcp-nodelay是否开启主从复制socket的NO_DELAY选项: yes:Redis会合并小的TCP包来节省带宽,但是这要增加同步延迟,造成主从 数据不一致; no:主节点会立即同步数据,没有延迟。noyes|no支持
repl-backlog-size复制积压缓冲区大小1M整数支持
repl-backlog-ttl主节点在没有从节点的情况下多久后释放复制积压缓存区空间3600整数支持
slave-priority从节点的优先级1000-100支持
min-slaves-to-write当主节点发现从节点数量小于min-slaves-to-write 且延迟小于等于min-slaves-max-lag时,master停止写操作。0整数支持
min-slaves-max-lag10整数支持
slave-announce-ipRedis Sentinel可以使用该信息来发现slave实例。ip支持
slave-announce-portport支持
安全
requirepass密码自定义支持
内存策略
maxclients最大客户端连接数10000整数支持
maxmemory节点的最大内存无限制不能大于物理内存支持
maxmemory-policyredis 内存淘汰策略noevictionvolatile-lru:在设置过期时间的key中,剔除最少使用的key allkeys-lru:在所有的key中剔除最少使用的Key volatile-random:在过期时间key中,随机剔除 allkeys-random:在所有的key中,随机剔除 volatile-ttl:在设置过期的key中,优先剔除即将过期的key noeviction:不做任何操作,直接返回oom异常支持
maxmemory-samples上面LRU和最小TTL策略并非严谨的策略,而是大约估算的方式,因此可以选择取样值以便检查5整数支持
AOF相关配置
appendonly是否开启AOF持久化模式noyes|no支持
appendfilenameaof文件名称appendonly.aof建议:appendonly-{port}.aof不支持
appendfsyncaof同步磁盘频率everyseceverysec|always|no支持
no-appendfsync-on-rewrite设置为yes,表示rewrite期间对新的写操作不fsync,暂时放入缓冲区,等rewrite完成之后再写入noyes|no支持
auto-aof-rewrite-percentage触发rewrite的AOF文件增长比例条件100整数支持
auto-aof-rewrite-min-size触发rewrite的AOF文件最小阀值(单位:兆)64整数+m支持
aof-load-truncated加载AOF文件时,是否忽略AOF文件不完整的情况yesyes|no支持
Lua脚本
lua-time-limitLua脚本超时时间单位:毫秒5000整数,但是此超时不会真正停止脚本运行支持
Redis集群
cluster-enabled是否开启redis 集群yesyes|no不支持
cluster-config-file集群配置文件nodes-6379.confnodes-{port}.conf不支持
cluster-node-timeout集群节点超时时间,单位毫秒15000整数支持
cluster-slave-validity-factor从节点有效性判断因子,当从节点与主节点最后通信时间超过(cluster-node-timeout * slave-validity-factor + repl-ping-slave-period)时,对应从 节点不具备故障转移资格,防止断线时间过长的从节点进行故障转称。设置为0表示从节点永不过期。10整数支持
cluster-migration-barrier主从节点切换需要的从节点数最小个数。1整数支持
cluster-require-full-coverage集群是否需要所有的slot都分配给在线节点。才能正常访问。yesyes|no不支持
慢查询
slowlog-log-slower-than慢查询被记录的阀值。单位:微秒10000整数支持
slowlog-max-len慢查询记录的条数。128整数支持
latency-monitor-thresholdRedis服务内存延迟监控,0代表关闭0整数支持
高级选项
hash-max-ziplist-entrieshash数据结构优化参数512整数支持
hash-max-ziplist-valuehash数据结构优化参数64整数支持
list-max-ziplist-sizelist数据结构优化参数-2-5|-4|-3|-2|-1支持
list-compress-depthlist数据结构优化参数,0代表不可用00|1|2|3支持
set-max-intset-entriesset数据结构优化参数512整数支持
zset-max-ziplist-entrieszset数据结构优化参数128整数支持
zset-max-ziplist-valuezset数据结构优化参数64整数支持
hll-sparse-max-byteshyperLogLog数据结构优化参数3000整数支持
client-output-buffer-limit客户端输出缓冲区限制normal 0 0 slave 256mb 64mb 60 pubsub 32mb 8mb 60整数支持

讨论区

欢迎留下想法与补充