Redis键值对数据库相关理论
未来数据库主流----非关系型数据库
数据库的新兴之秀非关系型数据库(NoSQL),除了今天要介绍的Redis,还有MongDB、Hbase、CouhDB等等。其凭借着其非关系型、 分布式、 开源和横向扩展等优势, 被认为是下一代数据库产品。
非关系型数据库解决了关系型数据库存在的一些缺点。
1.在现在的网络环境中要求数据库需要可以承载大量的并发访问量,和读写要求。一般会达到1W次/秒以上的请求数。这无疑给关系型数据库带来了巨大的挑战。
2.不仅如此,除了大量的并发请求现在的数据库还要承载海量的数据,据统计一个月就有可能产生大约2.5亿条用户信息,这给关系型数据库通过sql语句查找带来了巨大的挑战。
3.现在的关系型数据库存在着高可用、横向扩展的瓶颈。无法通过添加硬件和节点的方式扩展负载性能。尤其是24小时需要工作的数据库服务器进行扩展升级都要停机维护。这还带来了巨大的经济损失。
强大的非关系型数据库----Redis
Redis简介
Redis是一个开源的、使用 C 语言编写、基于内存运行的 NoSQL数据库。 Redis 基于内存运行并支持持久化,采用 key-value(键值对) 的存储形式,是目前分布式架构中不可或缺的一环。
Redis可以在同一台服务器上部署多个Redis实例。在一般的生产环境中会根据情况决定服务器需要开多少Redis进程,多了会增加CPU负担,少了会降低Redis工作效率。
Redis优点
1.具有极高的数据读写速度, 数据读取的速度最高可达到 110000 次/s, 数据写入速度最高可达到 81000 次/s。
2.支持丰富的数据类型, 不仅仅支持简单的 key-value 类型的数据, 还支持 Strings,Lists, Hashes, Sets 及 Ordered Sets 等数据类型。
3.支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用。
4.Redis支持事物的原子性, Redis 所有操作都是原子性的。
5.Redis支持数据备份。
Redis一些参数配置
在/etc/redis/6379.conf配置文件中,我们可以根据当前环境修改一些Redis的配置参数。
114 timeout 0 #当客户端闲置多长时间后关闭连接, 如果指定为 0, 表示关闭该功能
254 dbfilename dump.rdb #指定本地数据库文件名, 默认值为 dump.rdb
264 dir /var/lib/redis/6379 #指定本地数据库存放目录
540 # maxclients 10000 #最大客户端连接数,默认关闭如果设置 maxclients 0, 表示不限制。 当客户端连接数到达限制时, Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。
242 rdbcompression yes #指定存储至本地数据库时是否压缩数据, 默认为 yes。
567 # maxmemory <bytes> #指定 Redis 最大内存限制, Redis 在启动时会把数据加载到内存中, 达到最大内存后, Redis 会先尝试清除已到期或即将到期的 Key, 当此方法处理后, 仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。
704 appendfilename "appendonly.aof" #指定更新日志文件名, 默认为 appendonly.aof
Redis一些命令工具
redis-server: #用于启动 Redis 的工具
redis-benchmark: #用于检测 Redis 在本机的运行效率
redis-check-aof: #修复 AOF 持久化文件
redis-check-rdb: #修复 RDB 持久化文件
redis-cli: #是 Redis 命令行工具
redis-setinel: #是 redis-server 文件的软链接
因为Redis是一个c/s架构,所以要访问Redis需要客户端软件。用Redis自带的命令:redis-cli -h 来访ip -p端口 -a 密码。若无密码则不需要-a。
info;命令可以查看Redis当前的信息。
192.168.80.133:6379> info
# Server
redis_version:5.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:4db2f2a314114749
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:17803
run_id:5542ac499810d68d7367512ec3fb49715723d8e9
tcp_port:6379
uptime_in_seconds:3050
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:7568550
executable:/usr/local/bin/redis-server
config_file:/etc/redis/6379.conf
# Clients
connected_clients:2
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
......
redis-benchmark 测试工具,用于测试Redis性能的工具。
-c 指定并发连接数;-n指定请求数
redis-benchmark -h 192.168.80.133 -p 6379 -c 100 -n 10000
测试存取能力:
-q: 强制退出 redis。 仅显示 query/sec 值;-d: 以字节的形式指定 SET/GET 值的数据大小。
redis-benchmark -h 192.168.80.133 -p 6379 -q -d 100
Redis持久化
与同类型的数据库memcached相比,redis可以支持数据的持久化。即将内存中的数据存放在硬盘中。所以在进行持久化操作前就重启计算机,在内存中的数据就会丢失。在开启持久化后,redis会不定期通过异步方式将内存里的数据写入到磁盘中去。或者将每次的数据更新接入到磁盘中。
redis持久化的方式有两种:RDB和AOF。
RDB工作模式:通过创建快照的方式将某个时刻的内存中redis存储的数据变成快照写入此盘。其中会专门有一个fork进程去创建数据集进行备份。
在配置文件中设置了RBD的数据持久化规则:
219 save 900 1 #900秒内至少有1个key被更改就执行快照
220 save 300 10 #300内描述至少有10个key被更改就执行快照
221 save 60 10000 #60秒内至少有10000个key被更改就执行快照
备份数据会议dump.rbd形式存储在安装路径下。
我们也可以通过命令手动进行redis快照。save和bgsave,save是一个阻塞进程在输入命令后无法接受客户端的请求;而bgsave则是通过fork进程在后台完成快照,其父进程依旧可以接收来自客户端的请求。
RBD优缺点:
优点:
1.RBD备份是按照时间进行的,非常好归档们可以根据需求恢复到相应的时间点。
2.RBD方便备灾,通过还原文件进行数据恢复。还可以远程发送给其他终端使用。
3.在持久化过程中,通过fork子进程去完成,其父进程有就可以正常工作。不会影响到服务线程的I/O。
4.RBD启动比AOF的日志形式快。
缺点:
1.RBD在未进行备份前如果服务器出现情况,未进行数据持久化操作,为持久化的部分可能会造成数据丢失。
2.如果需要备份的数据过大,会造成redis服务停止几秒钟。
AOF工作模式:
AOF持久化模式是通过将数据写入到redis中的每条命令,记录为日志文件的形式,我们可以通过查看文件内容发现之前的操作记录。
首先我们需要在配置文件中开启AOF持久化功能,否则redis不会使用AOF模式进行持久化。
#只有改为yes才可以。
700 appendonly no
在配置文件中设置了AOF持久化频率的相关参数。
729 # appendfsync always #每个 Redis 命令都要同步写入硬盘。这样会严重降低 Redis 的性能
730 appendfsync everysec #每秒执行一次同步,显式地将多个写命令同步到硬盘
731 # appendfsync no #让操作系统来决定应该何时进行同步
因为AOF会将命令持续性的写入到文件中,这样就会造成冗余的操作记录占用太多的磁盘空间,甚至会超出磁盘的容量。为此我们需要对AOF文件进行重写和压缩的操作。
重写,可以通过设置auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个配置选项来对 AOF 重写进行配置。auto-aof-rewrite-percentage是当新的日志比旧的日志大多少时进行重写;auto-aof-rewrite-min-size是当新日志多大时进行重写。 Redis 以 append 模式不断的将修改数据写入到老的磁盘文件中, 同时 Redis 还会创建一个新的文件用于记录此期间有哪些修改命令被执行。
压缩,则是通过 BGREWRITEAOF 命令,与fork类似,也是一个子进程在后台对日志中无需的冗余操作进行删除,从而减小了日志的大小。
AOF的优缺点:
优点:
1.AOF提供了多种备份的频率,即使美妙同步也就会丢失1s的数据。保证了数据的安全性。
2.AOF 包含一个格式清晰、 易于理解的日志文件用于记录所有的修改操作。 事实上,我们也可以通过该文件完成数据的重建。
3.采用AOF模式,在写入过程中即使出现宕机现象, 也不会破坏日志文件中已经存在的内容。 然而如果我们本次操作只是写入了一
半数据就出现了系统崩溃问题, 不用担心, 在 Redis 下一次启动之前, 我们可以通过redis-check-aof 工具来帮助我们解决数据一致性的问题。
缺点:
1.AOF文件大小比RBD的大,所以在恢复数据的时候比较慢。
2.AOF备份频率比RBD的高,所以在性能上会占用更多的资源。
3.AOF是用记录的方式将操作卸载日志中,而RBD则是以快照的方式记录数据文件。RBD会更加的安全BUG比AOF少。