前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis-----简单介绍---基本的配置---持久化----学习笔记

redis-----简单介绍---基本的配置---持久化----学习笔记

作者头像
张琳兮
发布2018-09-10 11:39:56
5670
发布2018-09-10 11:39:56
举报
文章被收录于专栏:首富手记

redis 缓存数据库

redis 的简单介绍

代码语言:javascript
复制
Redis是一个开源(BSD许可)的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSql数据库产品。
内存中的数据结构存储系统,他可以用作数据库、缓存和消息中间件。
它支持多种数据类型。字符串(string)、字典(hash)、列表(list)、集合(set)、有序集合(sorted set)
运行于大多数POSIX系统,如Linux、*BSD、OS X等。
基本配合后端数据库使用,存放的只是用户当前频繁调去的数据
作者: Salvatore Sanfilippo

redis的功能特点

代码语言:javascript
复制
1)高速读写(因为是在内存上的数据库)
2)数据类型丰富
3)支持持久化(把内存上的数据写到磁盘上)
4)多种内存分配及回收策略
5)支持多事物
6)消息队列、消息订阅(先订阅后发送)
7)支持高可用
8)支持分布式分片集群

Memcache、redis和Tair的对比

代码语言:javascript
复制
企业缓存数据库解决方案对比

Memcached:

代码语言:javascript
复制
优点:高性能读写,单一的数据类型,支持客户端式分布式集群,一致性hash多核结构,多线程读写性能高
缺点:无持久化,节点故障可能出现缓存穿透,分布式需要客户端实现,跨机房数据同步困难,架构扩容复杂度高

Redis:

代码语言:javascript
复制
优点:高性能读写,多数据类型支持,数据持久化,高可用架构,支持自定义虚拟内存,支持分布式分片集群,单线程读写性能极高
缺点:多线程读写较Mencached慢

Tair:淘宝使用

代码语言:javascript
复制
优点:高性能读写,支持三种存储引擎(ddb/rdb/ldb),支持高可用,支持分布式分片集群,支撑了几乎所有淘宝业务的缓存。
缺点:单机情况下,读写性能较上两种较慢

Redis的应用场景

代码语言:javascript
复制
1)数据高速缓存
2)Web会话缓存(session cache)
3)排行榜应用(有序集合、sorted set)
4)消息队列
5)发布订阅

Redis的安装配置

下载redis的源码包

代码语言:javascript
复制
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

移动到/usr/local/目录下,这个目录随意自己

代码语言:javascript
复制
[root@shoufu ~]# mkdir -p /usr/local
[root@shoufu ~]# cd /usr/local/
[root@shoufu application]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz
[root@shoufu application]# ls
redis-3.2.9.tar.gz

解压/安装

代码语言:javascript
复制
[root@shoufu application]# tar  xf redis-3.2.9.tar.gz 
[root@shoufu application]# rm -rf redis-3.2.9.tar.gz 
#建立一个软连接,方便以后软件升级
[root@shoufu application]# ln -s /usr/local/redis-3.2.9/ /usr/local/redis
#因为redis官方已经编译过源码包了,所以我们不需要执行./configure了,直接安装即可
[root@shoufu redis]# make && make install
..............
    INSTALL install
make[1]: Leaving directory `/usr/local/redis-3.2.9/src'
#正在离开这个目录,安装完成

把redis的命令存在的路径写到PATH的环境变量中去,能更好的执行命令

代码语言:javascript
复制
[root@shoufu src]# tail -2 /root/.bash_profile 
export PATH=/usr/local/redis/src:$PATH

1.6 配置Redis,并启动

1.6.1 未指定配置文件启动

代码语言:javascript
复制
[root@shoufu src]# redis-server &       #在后台启动
[1] 5530
[root@shoufu src]# 5530:C 13 Aug 11:40:24.774 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
#你当前没有指定配置文件,以默认的配置文件启动,如果你想指定配置文件你可以redis-server 文件所在位置

1.6.2 配置redis的配置文件

代码语言:javascript
复制
先创建一个配置文件所在的位置:
mkdir -p /usr/local/redis/conf.d/
vim /usr/local/redis/conf.d/6379.conf
#守护进程方式启动,后台运行
daemonize yes   
#端口号
port 6379
#日志文件
logfile /var/log/redis.log
#RDB持久化文件名*
dbfilename dump.rdb
#RDB持久化文件位置
dir /usr/local/redis/data/6379
指定配置文件启动
代码语言:javascript
复制
[root@shoufu redis]# redis-server /usr/local/redis/conf.d/6379.conf 
[root@shoufu redis]# netstat  -ntalp | grep redis
tcp 0   0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      5556/redis-server * 
tcp 0   0 :::6379                     :::*                        LISTEN      5556/redis-server *
1.6.4   连接测试
[root@shoufu redis]# redis-cli 
127.0.0.1:6379> set name test   #简单的写入以恶搞字符串
OK
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> exit
#127.0.0.1:6379   从那个地址的连接进来,

关闭redis

代码语言:javascript
复制
[root@shoufu redis]# redis-cli shutdown
[root@shoufu redis]# netstat  -ntalp | grep redis
[root@shoufu redis]#

Redis的安全配置

代码语言:javascript
复制
在配置文件里面加上
#监听的地址,要加上127.0.0.1,否则从本地不能登录
bind 10.0.0.200 127.0.0.1
#取消保护模式,是否只允许本地登录
protected no
#增加密码
requirepass {password}
不设置上述的内容,先远程登录测试
代码语言:javascript
复制
[root@shoufu redis]# redis-cli -h 10.0.0.200
10.0.0.200:6379> get name
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface.(redis默认只允许本地登录,远程登录被屏蔽). If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password.(设定一个监听地址或者一个密码认证,配合使用) NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
在配置文件里面配置安全
代码语言:javascript
复制
[root@shoufu redis]# tail -3 /usr/local/redis/conf.d/6379.conf 
protected-mode no
bind 10.0.0.200 127.0.0.1
requirepass 123123
#关闭redis
[root@shoufu redis]# redis-cli shutdown
#重新指定配置文件启动
[root@shoufu redis]# !redis-server
redis-server /usr/local/redis/conf.d/6379.conf 
[root@shoufu redis]# netstat -ntalp | grep redis
连接测试
代码语言:javascript
复制
#通过远程连接的方式测试连接
[root@shoufu redis]# redis-cli -h 10.0.0.200
10.0.0.200:6379> get name
#虽然连接进来,但是获取数据时提示我们需要认证,
(error) NOAUTH Authentication required.
#在redis内部进行认证,推荐使用
10.0.0.200:6379> auth 123123
OK
10.0.0.200:6379> get name
(nil)
10.0.0.200:6379> exit
#在命令行提供认证
[root@shoufu redis]# redis-cli -h 10.0.0.200 -a 123123
10.0.0.200:6379> get name
(nil)

Redis数据的持久化

RDB持久化

代码语言:javascript
复制
可以在指定的时间间隔生成数据集的时间点快照(point-in-time-snapshot);相当于在一定时间内把当前redis缓存数据库里面的数据拍个照片,存放到磁盘上的永久化文件上(dbfilename),性能比AOF持久化高,突然宕机可能会照成少量的数据丢失
RDB持久的优点
代码语言:javascript
复制
1)RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。例如,你可能想要每小时归档最近24小时的RDB文件,每天保存近30天的RDB快照。这允许你很容易的恢复不同版本的数据集以容灾。
2)RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
3)RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。
4)RDB在重启保存了大数据集的实例时比AOF要快。
RDB的缺点
代码语言:javascript
复制
1)当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(save point)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
2)RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。

AOF持久化

代码语言:javascript
复制
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中命令全部以Redis协议的格式来保存,新命令会被追加到文件末尾。因为每执行一条写操作,都要对磁盘上写一次,所以性能比较低,安全性最好,实时记录
AOF持久化的优点
代码语言:javascript
复制
1)使用AOF Redis会更具有可持久性(durable):你可以有很多不同的fsync策略:没有fsync,每秒fsync,每次请求时fsync。使用默认的每秒fsync策略,写性能也仍然很不错(fsync是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。
2)AOF日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof工具也可以很轻易的修复。
3)当AOF文件变得很大时,Redis会自动在后台进行重写。重写是绝对安全的,因为Redis继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis就会切换这两个文件,并开始往新文件追加。
4)AOF文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个AOF文件。例如,即使你不小心错误地使用FLUSHALL命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启Redis就可以。
AOF的缺点
代码语言:javascript
复制
1)对同样的数据集,AOF文件通常要大于等价的RDB文件。
2)AOF可能比RDB慢,这取决于准确的fsync策略。通常fsync设置为每秒一次的话性能仍然很高,如果关闭fsync,即使在很高的负载下也和RDB一样的快。不过,即使在很大的写负载情况下,RDB还是能提供能好的最大延迟保证。
3)在过去,我们经历了一些针对特殊命令(例如,像BRPOPLPUSH这样的阻塞命令)的罕见bug,导致在数据加载时无法恢复到保存时的样子。这些bug很罕见,我们也在测试套件中进行了测试,自动随机创造复杂的数据集,然后加载它们以检查一切是否正常,但是,这类bug几乎不可能出现在RDB持久化中。为了说得更清楚一点:Redis AOF是通过递增地更新一个已经存在的状态,像MySQL或者MongoDB一样,而RDB快照是一次又一次地从头开始创造一切,概念上更健壮。但是,1)要注意Redis每次重写AOF时都是以当前数据集中的真实数据从头开始,相对于一直追加的AOF文件(或者一次重写读取老的AOF文件而不是读内存中的数据)对bug的免疫力更强。2)我们还没有收到一份用户在真实世界中检测到崩溃的报告。
RDB和AOF的选择:
代码语言:javascript
复制
一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户单独使用AOF,但是我们并不鼓励这样,因为时常进行RDB快照非常方便于数据库备份,启动速度也较之快,还避免了AOF引擎的bug。

注意: 基于这些原因,将来我们可能会统一AOF和RDB为一种单一的持久化模型(长远计划)。 下面的部分将介绍两种持久化模型等多的细节。

RDB快照的工作方式
代码语言:javascript
复制
        默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。你可以设置让Redis在N秒内至少有M次数据集改动时保存数据集,或者你也可以手动调用SAVE或者BGSAVE命令。

例如,这个配置会让Redis在每个60秒内至少有1000次键改动时自动转储数据集到磁盘:
#配置文件里面加上
save 60 1000
Redis配置
代码语言:javascript
复制
#60S内有1000次改写就拍照
save 60 1000 
高级配置
stop-writes-on-bgsave-error yes
rdbcompression yes 
rdbchecksum yes
dbfilename dump.rdb
dir ./ 
以上配置分别表示:
后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致 
导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做
导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
导出来的rdb文件名
rdb的放置路径
AOF持久化配置
代码语言:javascript
复制
#基本配置
appendonly yes/no
appendfsync always
appendfsync everysec
appendfsync no
配置分别表示:
是否打开aof日志功能
每1个命令,都立即同步到aof 
每秒写1次
写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
#高级配置
no-appendfsync-on-rewrite yes/no
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb
配置分别表示:
正在导出rdb快照的过程中,要不要停止同步aof
aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
aof文件,至少超过64M时,重写
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redis 缓存数据库
    • redis 的简单介绍
      • redis的功能特点
        • Memcache、redis和Tair的对比
          • Memcached:
          • Redis:
          • Tair:淘宝使用
        • Redis的应用场景
          • Redis的安装配置
            • 下载redis的源码包
            • 移动到/usr/local/目录下,这个目录随意自己
            • 解压/安装
            • 把redis的命令存在的路径写到PATH的环境变量中去,能更好的执行命令
          • 1.6 配置Redis,并启动
            • 1.6.1 未指定配置文件启动
            • 1.6.2 配置redis的配置文件
            • 关闭redis
            • Redis的安全配置
          • Redis数据的持久化
            • RDB持久化
            • AOF持久化
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档