NoSQL
非关系型数据库
类型
键值存储数据库
key-value
列存储数据库
关系型数据库是典型的行存储数据库(MySQL),按行存储的数据在物理层面占用的时连续的存储空间,不适合海量数据存储。而按列存储则可实现分布式存储,适合海量存储(HBase)
文档型数据库
NoSQL 与 关系型数据库的结合(MangoDB)
图像(Graph)数据库
用于存放一个节点关系的数据库(Neo4J)
Redis的用途
数据缓存
减小 RT,而且降低 DBMS 的压力
缓存分类
实时同步缓存
指DBMS中数据更新后,Redis缓存中存放的相关数据会被立即清除,以促使再有对该数据的访问到来时,必须先从DBMS中查询获取到的最新数据,然后再写入到Redis
阶段性同步缓存
指Redis缓存中的数据允许在一段时间内与DBMS中的数据不完全一致,而这个时间段就是这个缓存数据的过期时间
Redis 的 IO 模型
Redis 处理客户端请求所采用的处理架构,称为Redis 的 IO 模型
单线程模型
对于 Redis 3.0 及其以前版本,Redis 的 IO模型采用的是纯粹的单线程模型,即所有客户端的请求全部由一个线程处理,Redis 的单线程模型采用了多路复用技术
优点
可维护性高,性能高,不存在并发读写情况,所以也就不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的枷锁/解锁开销问题
缺点
性能会受到影响,且由于单线程只使用一个处理器,所以会形成处理器浪费
多线程模型
从 Redis 6.0 版本开始。处理客户端请求的仍是单线程模型,但对于一些比较耗时担又不影响对客户端的响应的操作,就由后台其他线程来处理。
优点
其结合了多线程与单线程的优点,避开了他们的不足
缺点
该模型并非是一个真正意义上的多线程,因为真正处理任务的线程仍是单线程。所以,其对性能也是有些影响的
Redis 的配置
INCLUDE
指定要在当前配置文件中包含的配置文件。这样做的目的主要是便于配置信息管理,可以将不同场景的配置都进行单独定义,然后在当前核心配置文件中根据不同场景选择包含进不同的配置文件。
想要使用外部配置文件覆盖,可以在Redis配置文件的文件末尾 include
例:
include /xxx/xxx.conf
MODULES
加载不同的第三方模块,来增强,扩展 Redis 的功能
例:
loadmodule /xxx/xxx/xxx/xxx.so
NETWORK
网络配置
tcp-backlog
tcp-backlog 是一个 TCP 连接队列,其主要用于解决高并发场景下客户端慢连接问题。配置中设置的值就是这个队列的长度。该队列与 TCP 连接的三次握手有关。不同的 Linux 内核,backlog 队列中存放的元素(客户端连接)类型是不同的
-
Linux 内核 2.2 版本之前
该队列中存放的是已完成了第一次握手的所有客户端连接,其中就包含已完成三次握手的客户端连接。当然,此时的 backlog 队列中的连接也具有两种状态:未完成三次握手的连接状态为
SYN_RECEIVED,已完成三次握手的连接状态为ESTABLISHED。只有ESTABLISHED状态的连接才会被 Redis 处理。 -
Linux 内核 2.2 版本之后
TCP 系统中维护了两个队列:
SYN_RECEIVED队列与ESTABLISHED队列。SYN_RECEIVED队列中存放的是未完成的三次握手的连接,ESTABLISHED队列中存放的是已完成三次握手的连接。此时的 backlog 就是ESTABLISHED队列 -
TCP 中的 backlog 队列的长度在 Linux 中由内核参数 somaxconn 来决定。在 Redis 中该队列的长度由 Redis 配置文件设置 与 somaxconn 共同决定:取它们中的最小值。
# 查看 Linux 内核中 somaxconn 的值 cat /proc/sys/net/core/somaxconn生产环境下(特别是高并发场景下),backlog 的值最好要大一些,否则可能会影响系统性能
# 修改somaxconn的值 vim /etc/sysctl.conf # 添加 net.core.somaxconn=2048 # 动态重新加载配置 sysctl -p
GENERAL
通用配置
daemonize
控制 Redis 启动是否采用守护进程方式,即是否是后台启动
pidfile
指定 Redis 允许是 pid 写入的文件,无论 Redis 是否采用守护进程方式启动,pid 都会写入到该配置文件
注意
如果没有配置 pid 文件,不同的启动方式,pid 文件的产生效果是不同的
采用守护进程方式启动(后台启动,daemonize 为 yes)——pid 文件为
/var/run/redis.pid采用前台启动——不生产 pid 文件
loglevel
日志等级
logfile
指定日志文件。如果设置为空串,则强制将日志记录到标准输出设备(显示器)。如果使用的是前台启动方式,设置为空串,则意味着会将日志发送到设备
/dev/null(空设备)
databases
设置数据库数量
security
用户设置 ACL 权限,Redis 访问密码相关配置。该模块中最常用的就是 requirepass 属性
CLIENTS
设置与客户端相关的属性
maxclients
设置Redis可并发处理的客户端连接数量,默认为10000,如果达到该最大连接数,则会拒绝再来的新连接,并返回一个异常消息:已达到最大连接数
注意
- 该值不能超过 Linux 系统支持的可打开的文件描述符最大数量阈值
MEMORY MANAGEMENT
控制最大可用内存及相关移除问题
maxmemory
将内存使用限制设置为指定的字节数,当达到内存限制时,REdis 将根据选择的逐出策略 maxmemory-poilcy 尝试删除符合条件的key
如果不能按照逐出策略移除key,则会给写操作命令返回error,但对于只读的命令是没有影响的
Threaded I/O
配置 Redis 对多线程 IO 模型的支持