一个缓存服务应该包含什么?

网络访问:socket server + 请求解析
数据操作方式:PUT、GET、DELETE、SCAN …
索引模块(索引到 Key)
存储模块(分配器 + 持久化)
高可用集群支撑(主从复制 + 哨兵)
高可扩展集群支撑模块(数据分片)
01 基本架构:一个键值数据库包含什么?.jpg

Redis 简介

  • Redis 是一个开源的 key-value 存储系统。
  • 和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set —有序集合)和 hash(哈希类型)。
  • 这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
  • 在此基础上,Redis 支持各种不同方式的排序。
  • 与 memcached 一样,为了保证效率,数据都是缓存在内存中。
  • 区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
  • 并且在此基础上实现了 master-slave (主从) 同步。

官方文档

Redis 英文官方网站
Redis 中文官方网站
GitHub - redis/redis

Redis 安装

Linux Redis

linux 下安装和简单使用 redis - SegmentFault 思否
下载地址:http://redis.io/download,下载最新稳定版本。
本教程使用的最新文档版本为 2.8.17,下载并安装:

# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
# tar xzf redis-6.0.8. tar. gz
# cd redis-6.0.8
# make

执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:
下面启动 redis 服务:

# cd src
# ./redis-server

注意这种方式启动 redis 使用的是默认配置。也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。

# cd src
# ./redis-server ../redis.conf

redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。比如:

# cd src
# ./redis-cli
redis> set foo bar
OK
redis> get foo "bar"

Ubuntu apt 命令安装

在 Ubuntu 系统安装 Redis 可以使用以下命令:

# sudo apt update
# sudo apt install redis-server

启动 Redis

# redis-server

查看 redis 是否启动

# redis-cli

以上命令将打开以下终端:

redis 127.0.0.1:6379>

127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。

redis 127.0.0.1:6379> ping
PONG

Redis 配置

基本配置

默认 16 个数据库,类似数组下标从 0 开始,初始默认使用 0 号库
使用命令 select   <dbid> 来切换数据库。如: select 8
统一密码管理,所有库同样密码。
dbsize 查看当前数据库的 key 的数量
flushdb 清空当前库
flushall 通杀全部库

CONFIG 命令

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
redis 127.0.0.1:6379> CONFIG GET * # 获得所有配置项
...略

配置文件

Linux 配置文件名称 redis.conf,Windows 配置文件名称 redis.windows.conf
Redis 配置 | 菜鸟教程

Units
配置大小单位, 开头定义了一些基本的度量单位,只支持 bytes,不支持 bit。大小写不敏感。 # 1k 1000 bytes # 1kb 1024 bytes # 1m 1000000 bytes # 1mb 1024*1024 bytes # 1g 1000000000 bytes # 1gb 1024*1024*1024 bytes

INCLUDES
添加多个标准化模板

# include .\path\to\local.conf
# include c:\path\to\other.conf

**NETWORK **

# bind
# 默认情况bind=127.0.0.1只能接受本机的访问请求。不写的情况下,无限制接受任何ip地址的访问。
bind=127.0.0.1
# bind 192.168.1.100 10.0.0.1 接受多个IP
# bind 127.0.0.1 ::1 接受IP+端口号

# protected-mode
# 保护模式默认开启
# 保护模式开启 & bind 没有显示绑定 or 没有配置密码,只接受来自客户端的链接
protected-mode yes

port 6379

# TCP listen() backlog.
tcp_max_syn_backlog
tcp-backlog 511

# Unix socket.
# unixsocket /tmp/redis.sock
# unixsocketperm 700

timeout 0
# 一个空闲的客户端维持多少秒会关闭,0 表示关闭该功能。即永不关闭。

tcp-keepalive 0
# 对访问客户端的一种心跳检测,每个n秒检测一次是否保持连接中。单位为秒,如果设置为 0,则不会进行 Keepalive 检测,建议设置成 60

GENERAL

daemonize yes/no
是否为后台进程,设置为 yes

pidfile <pidfile>
存放 pid 文件的位置,每个实例会产生一个不同的 pid 文件

loglevel
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
四个级别根据使用阶段来选择,生产环境选择 notice 或者 warning

logfile <logfile>
日志文件名称

databases 16
设定库的数量默认 16,默认数据库为 0,可以使用 `SELECT <dbid>` 命令在连接上指定数据库 id

**SNAPSHOTTING **
Redis 持久化

REPLICATION

# slaveof <masterip> <masterport>
# masterauth <master-password>
slave-serve-stale-data yes
slave-read-only yes           ##设置从redis只读

未整理。

SECURITY

requirepass <password> 访问密码的查看、设置和取消.在命令中设置密码,只是临时的。重启redis服务器,密码就还原了。

LIMITS

maxclients
- 设置 redis 同时可以与多少个客户端进行连接。
- 默认情况下为 10000 个客户端。
- 如果达到了此限制,redis 则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

persistence-available [(yes)|no]

maxmemory <bytes>
- 建议必须设置,否则,将内存占满,造成服务器宕机
- 设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
- 如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如 GET 等。如果你的 redis 是主 redis(说明你的 redis 有从 redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

maxmemory-policy 内存淘汰策略,默认 noeviction

maxmemory-samples
- 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
- 一般设置 3 到 7 的数字,数值越小样本越不准确,但性能消耗越小。默认5

APPEND ONLY MODE
Redis 持久化

LUA SCRIPTING

lua-time-limit 5000
Lua 脚本的最大执行时间(以毫秒为单位)。
如果达到最大执行时间,Redis 将记录脚本在最大允许时间后仍在执行,并开始回复带有错误的查询。
将其设置为 0 或负值以无警告地无限执行。

REDIS CLUSTER

# cluster-enabled yes                 ##开启redis集群
# cluster-config-file nodes-6379.conf    ##集群配置文件(启动自动生成)
# cluster-node-timeout 15000         ##节点互联超时的阀值
# cluster-slave-validity-factor 10  ##slave节点检测因素,开始failover的超时时限是通过factor与timeout的乘积来确定的
# cluster-migration-barrier 1  ##设置master只有在关联多少slave时才会触发迁移过程
# cluster-require-full-coverage yes
##集群各节点在检测到至少一个hash槽位遗漏的情况下将停止处理查询请求。如集群部分节点宕机(例如部分hash槽位没有被分配)会造成整个集群不可用,直到所有槽位均被分配时才会自动恢复为可用状态

SLOW LOG

LATENCY MONITOR
EVENT NOTIFICATION
ADVANCED CONFIG

Redis 远程连接配置

本地配置
修改如下配置:

daemonize yes
bind 0.0.0.0
protected-mode no
requirepass <pass>

然后重新启动 redis-server

redis-server ./redis.conf
# sudo service redis-server restart

配置解释:
daemonize 开启守护进程,即后台运行。
bind 支持所有 IP 地址访问,如果更改为特定 IP 地址访问则 bind <IP1> [<IP2>]
protected-mode 其他服务器访问需要关闭保护模式。
requirepass 设置密码,推荐设置,否则容易被不法分子连接然后使用。
防火墙可能拦截端口,需要放行
iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

远程连接
redis-cli -h <IP> -p <port> -a <password>

Redis Module

Redis 从 4.0 版本开始,支持通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库(so 文件)的形式被加载到 Redis 中,这是一种非常灵活的动态扩展功能的实现方式,值得借鉴学习!

我们每个人都可以基于 Redis 去定制化开发自己的 Module,比如实现搜索引擎功能、自定义分布式锁和分布式限流。

目前,被 Redis 官方推荐的 Module 有:

  • RediSearch:用于实现搜索引擎的模块。
  • RedisJSON:用于处理 JSON 数据的模块。
  • RedisGraph:用于实现图形数据库的模块。
  • RedisTimeSeries:用于处理时间序列数据的模块。
  • RedisBloom:用于实现布隆过滤器的模块。
  • RedisAI:用于执行深度学习/机器学习模型并管理其数据的模块。
  • RedisCell:用于实现分布式限流的模块。
  • ……

关于 Redis 模块的详细介绍,可以查看官方文档:https://redis.io/modules