一小时快速入门Redis

Redis快速入门

  • 1. redis单机版安装
  • 2. redis配置文件(redis.conf)
  • 3.持久化之RDB和AOF
  • 4.redis导入导出

本文主要针对redis初学者对redis安装、配置文件、两种持久化方式等进行快速入门学习。

1. redis单机版安装

  1. redis5.0.4安装
    #tar -xvzf redis-5.0.4.tar.gz
    #cd redis-5.0.4
    #make && make install PREFIX=/data/redis
    #cp redis-5.0.4/redis.conf /data/redis
    #vim /data/redis/redis.conf #修改一些配置即可完成安装
    bind 0.0.0.0(任何ip都可以访问)----直接注释掉
    daemonize yes
    protected-mode no
    requirepass fhredisdb #设置密码
  2. 启动数据库(服务端)
    ./bin/redis-server redis.conf
  3. 关闭数据库
    在redis-cli中执行(需要有相应权限)
    方式一:正常关闭redis,不执行db 保存操作
    shutdown
    方式二:正常关闭redis,执行阻塞的db保存操作,会消耗一定时间
    shutdown save
  4. 登录数据库
    ./bin/redis-cli -a fhredisdb
  5. 验证
    127.0.0.1:6379> info server
    Server
    redis_version:5.0.4
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:83997575b90a511f
    redis_mode:standalone
    os:Linux 2.6.32-573.el6.x86_64 x86_64

2. redis配置文件(redis.conf)

  1. maxclients客户端同一时刻已建立的连接数(默认10000)
    一小时快速入门Redis_第1张图片
    当超过这个值时,redis将不再接收其他连接请求,客户端尝试连接时将受到error信息。
    通过命令行查看:
    127.0.0.1:6379> config get maxclients
    “maxclients”
    “10000”
    Tip:网上关于redis连接建立超时的问题解决
    经验:redis服务器是单线程模型,(即同一时刻,仅处理一个连接发出的指令,那么连接池中的多个连接,虽然将指令发送至redis,但redis并未立即处理,而是在排队。)加大连接池(业务上),只是加大排队的对列数,但是,redis是多进程共用,在处理大量的redis指令的同时,还要维护大量的连接,这是很耗资源的(因为是多进程共用原因)。所以,每个进程仅维护一条与redis的连接,通过加大maxwait(连接建立超时时间,注意与timeout区分),来控制在本进程内排队,可以降低redis的压力。redis与MySQL不同,mysql是可以多个连接的指令并行执行的,所以redis连接池设置过大没有意义。

  2. timeout客户端超时时间(默认不使用超时限制)
    设置客户端连接后的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么会关闭该连接。如果指定为0(redis.conf默认为0),表示关闭该功能,永远不会断开连接(除非quit/exit退出客户端)
    1、先看redis.conf中的配置
    在这里插入图片描述
    2、通过命令热修改(重启后redis.conf生效)
    config set timeout 300
    127.0.0.1:6379> config get timeout
    “timeout”
    “0”
    127.0.0.1:6379> config set timeout 300
    OK
    127.0.0.1:6379> config get timeout
    “timeout”
    “300”

  3. daemonize(默认no)
    默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。

  4. bind(默认bind 127.0.0.1)
    指定redis只接收来自于该IP地址的请求,如果不进行设置(即注释掉),那么将处理所有请求,在生产环境中最好设置该项。默认为bind 127.0.0.1 只允许本地环境客户端登录。建议直接注释掉此项 #bind 127.0.0.1

  5. maxmemory(默认0,不限制redis内存使用)
    设置redis能够使用的最大内存(需配合maxmemory-policy使用)。当内存满了的时候,如果还接收到set命令,redis将先尝试剔除设置过expire信息的key(tip:expire是为已存在的key设置过期时间expire age 10,setex是为key设置value值,并且设置过期时间 setex age 10 27 为value=27设置10s就过期清除value值了),而不管该key的过期时间还没有到达。在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,那么将返回错误。这样,redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合于把redis当做于类似memcached的缓存来使用。

3.持久化之RDB和AOF

首先,redis默认使用RDB方式持久化,如果redis只做缓存的话,可以不用开启持久化(不开启持久化,则一旦重启redis 数据将全部丢失)
RDB:Redis DataBase AOF:Append Only File
aof文件(恢复全部持久化的数据)—rdb(相当于快照,只恢复某一刻后的数据),rdb比aof恢复效率高很多

  1. RDB详解
    RDB是redis默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。redis每次重启会通过自动加载dump.rdb文件恢复数据。
    1、RDB核心规则配置(重点)
    save
    save “”
    save 900 1
    save 300 10
    save 60 10000
    解说:save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。
    若不想用RDB方案,可以把 save “” 的注释打开,下面三个注释上。
    2.、指定本地数据库文件名,一般采用默认的 dump.rdb
    dbfilename dump.rdb
    3.、指定本地数据库存放目录,一般也用默认配置(当前执行目录)
    dir ./
    4.、默认开启数据压缩
    rdbcompression yes
    解释:配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启。
    触发RDB快照(触发的意思就是下面四种执行了dump.rdb就会按照执行的操作进行更新)
    1 在指定的时间间隔内,执行指定次数的写操作
    2 执行save(阻塞当前redis服务器,执行save命令期间,redis不能处理其他命令,知道RDB过程完成为止) 或者是bgsave (异步方式,执行快照同时还可以响应客户端请求,推荐这种)命令
    3 执行flushall 命令,清空数据库所有数据,意义不大。(执行后触发dump.rdb,该文件内容清空)
    4 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义…也不大。
    通过RDB文件恢复数据
    将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可自动恢复。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 。
    RDB 的优缺点
    优点:
    1 适合大规模的数据恢复。
    2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
    缺点:
    1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。(也就是说,对于绝大部分数据都不会丢失,但是最近一次没满足1,5,15分钟持久化条件的数据,由于重启redis,dump.rdb没有及时保存数据,所以重启后这部分数据不存在了)
    2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍),最后再将临时文件替换之前的备份文件。
    所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。(夜深人静新数据更新进来少,也没业务用 内存占用不紧张)

  2. AOF详解
    AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中(每秒钟执行追加一次)。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
    从配置文件了解AOF
    打开 redis.conf 文件,找到 APPEND ONLY MODE 对应内容
    1.redis 默认关闭,开启需要手动把no改为yes
    appendonly yes
    2.指定本地数据库文件名,默认值为 appendonly.aof
    appendfilename “appendonly.aof”
    3.指定更新日志条件
    #appendfsync always
    appendfsync everysec
    #appendfsync no
    指定是否在每次更新操作后进行日志记录,redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中,默认为no
    appendonly no
    指定更新日志文件名,默认为appendonly.aof
    appendfilename “appendonly.aof”
    指定更新日志条件,共有3个可选值:
    no:表示等操作系统进行数据缓存同步到磁盘(快)
    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
    everysec:表示每秒同步一次(折中,默认值)
    appendfsync evertsec
    注释:
    always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
    everysec:出厂默认推荐,每秒异步记录一次(默认值)
    no:不同步
    4.配置重写触发机制
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    解说:当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。一般都设置为3G,64M太小了。
    触发AOF快照
    根据配置文件触发,可以是每次执行触发,可以是每秒触发,可以不同步。(默认使用,每秒触发一次)
    根据AOF文件恢复数据
    正常情况下,将appendonly.aof 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。但在实际开发中,可能因为某些原因导致appendonly.aof 文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。从下面的操作演示中体会。
    AOF的重写机制
    前面也说到了,AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以聪明的 Redis 新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩。
    重写的原理:Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中。并没有读取旧文件(你都那么大了,我还去读你??? o(゚Д゚)っ傻啊!)。最后替换旧的aof文件。
    触发机制:当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改。
    AOF 的优缺点
    优点:数据的完整性和一致性更高
    缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

  3. 总结
    Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
    RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
    Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
    AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
    Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
    若只打算用Redis 做缓存,可以关闭持久化。
    若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。

4.redis导入导出

  1. 通过redis-cli管道 --pipe方式快速导入数据到redis中
  2. redis-cluster集群模式下使用pipeline批量操作
  3. redis数据迁移
    先执行下bgsave指令得到最新的dump.rdb文件,将dump.rdb文件迁到新的redis环境替换该目录下的dump.rdb,启动redis即可。(这里面要注意 新redis环境中要先把库停了,再替换dump.rdb文件)
    tip:要是需要开启aof保管,则dump.rdb导入完成数据迁移后,执行指令:>bgrewriteaof 生成appendonly.aof文件==>关闭redis库,在redis.conf中开启aof模式==>再重启redis服务,这时候redis就会优先读取appendonly.aof文件,加载完整数据库了。

你可能感兴趣的:(redis,nosql)