欢迎来到Vincentyw的博客

该来的终究会来,该走的也一定会离开。凡事都存在前因后果,因缘成熟了,果报便产生了,无法阻挡。
但是发生过了就会消失,有来就有走,一切都是过客,把握自己当下的因缘,承担起自己该承担的责任,做好眼前该做的事情,做的时候尽全力,过去便放下,放下即自在。

Redis常用API和持久化机制

Redis常用API和持久化机制

一、Redis常用API---参考命令:http://redisdoc.com/geo/index.html

Redis支持的数据类型比较广泛,例如:string(字符串)、list()、set(集合)、hash(哈希类型和zset(sorted set --有序集合)

key
keys *
exists key 判断某个key是否存在
move key db 当前库就没有了,到指定的库中去了
expire key 为给定的key设置过期时间
ttl key 查看还有多少时间过期 -1表示永不过期 -2表示已过期
type key 查看key是什么类型

1.string
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
set key value 设置key value
get key 查看当前key的值
del key 删除key
append key value 如果key存在,则在指定的key末尾添加,如果key存在则类似set
strlen key 返回此key的长度
-------------------------------------------------------------------------
以下几个命令只有在key值为数字的时候才能正常操作
incr key 为执定key的值加一
decr key 为指定key的值减一
incrby key 数值 为指定key的值增加数值
decrby key 数值 为指定key的值减数值

getrange key 0(开始位置) -1(结束位置) 获取指定区间范围内的值,类似between......and的关系 (0 -1)表示全部
setrange key 1(开始位置,从哪里开始设置) 具体值 设置(替换)指定区间范围内的值
setex 键 秒值 真实值 设置带过期时间的key,动态设置。
setnx key value 只有在 key 不存在时设置 key 的值。
mset key1 value key2 value 同时设置一个或多个 key-value 对。
mget key1 key 2 获取所有(一个或多个)给定 key 的值。
msetnx key1 value key2 value 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

2.list
它是一个字符串链表,left、right都可以插入添加; 如果键不存在,创建新的链表; 如果键已存在,新增内容; 如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。 它的底层实际是个链表 lpush key value1 value2 将一个或多个值加入到列表头部 rpush key value1 value2 将一个或多个值加入到列表底部 lrange key start end 获取列表指定范围的元素 (0 -1)表示全部 lpop key 移出并获取列表第一个元素 rpop key 移出并获取列表最后一个元素 lindex key index 通过索引获取列表中的元素 llen 获取列表长度 lrem key 0(数量) 值,表示删除全部给定的值。零个就是全部值 从left往right删除指定数量个值等于指定值的元素,返回的值为实际删除的数量 ltrim key start(从哪里开始截) end(结束位置) 截取指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引 3.set Redis的Set是string类型的无序,不能重复的集合。 sadd key value1 value 2 向集合中添加一个或多个成员 smembers key 返回集合中所有成员 sismembers key member 判断member元素是否是集合key的成员 scard key 获取集合里面的元素个数 srem key value 删除集合中指定元素 srandmember key 数值 从set集合里面随机取出指定数值个元素 如果超过最大数量就全部取出, spop key 随机移出并返回集合中某个元素 smove key1 key2 value(key1中某个值) 作用是将key1中执定的值移除 加入到key2集合中 sdiff key1 key2 在第一个set里面而不在后面任何一个set里面的项(差集) sinter key1 key2 在第一个set和第二个set中都有的 (交集) sunion key1 key2 两个集合所有元素(并集) 4.hash Redis hash 是一个键值对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 kv模式不变,但v是一个键值对 类似Java里面的Map hset key (key value) 向hash表中添加一个元素 hget key key 向hash表中获取一个元素 hmset key key1 value1 key2 value2 key3 value3 向集合中添加一个或多个元素 hmget key key1 key2 key3 向集合中获取一个或多个元素 hgetall key 获取在hash列表中指定key的所有字段和值 hdel key key1 key2 删除一个或多个hash字段 hlen key 获取hash表中字段数量 hexits key key 查看hash表中,指定key(字段)是否存在 hkeys key 获取指定hash表中所有key(字段) hvals key 获取指定hash表中所有value(值) hincrdy key key1 数量(整数) 执定hash表中某个字段加 数量 ,和incr一个意思 hincrdyfloat key key1 数量(浮点数,小数) 执定hash表中某个字段加 数量 ,和incr一个意思 hsetnx key key1 value1 与hset作用一样,区别是不存在赋值,存在了无效。 5.zset Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。 zadd key score 值 score 值 向集合中添加一个或多个成员 zrange key 0 -1 表示所有 返回指定集合中所有value zrange key 0 -1 withscores 返回指定集合中所有value和score zrangebyscore key 开始score 结束score 返回指定score间的值 zrem key score某个对应值(value),可以是多个值 删除元素 zcard key 获取集合中元素个数 zcount key 开始score 结束score 获取分数区间内元素个数 zrank key vlaue 获取value在zset中的下标位置(根据score排序) zscore key value 按照值获得对应的分数

二、Redis持久化机制(RDB、AOF)

2.1 Redis为什么需要进行文件的持久化?

Redis是基于内存运行的NoSQL数据库,一旦断电或者出现异常状况,如果不进行数据的持久化操作,内存中的数据将会丢失,无法恢复。

所以Redis在指定的时间间隔内,将内存当中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存。

2.2 Redis的持久化方式有哪些?

(1)RDB:内存写入磁盘,默认方式

(2)AOF:文件追加的形式  appendonly no 默认关闭:no  开启:yes 

2.3 Redis的持久化机制

RDB:(1)主进程Fork子进程  (2)子进程将数据写入临时文件夹 (3)持久化结束,临时文件夹替换原持久化文件,主进程不进行IO操作,保证高可用。
AOF:将Reids的操作日志以追加的方式写入文件,不记录读操作
持久化文件存放的位置:dir  ./(path)  ##path为文件存放目录,必须是一个目录,rdb、AOF都存放在改路径下

2.4 持久化触发的时机

RDB持久化文件触发机制
shutdown时,如果没有开启aof,会触发
配置文件中默认的快照配置
执行命令save或者bgsave save是只管保存,其他不管,全部阻塞;bgsave:redis会在后台异步进行快照操作,同时可以响应客户端的请求
执行flushall命令 但是里面是空的,无意义
AOF持久化文件触发机制(依据配置项决定) no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证) always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全) everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)

SAVE命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
一般来说,在生产环境很少执行SAVE操作,因为它会阻塞所有客户端,保存数据库的任务通常由BGSAVE命令异步地执行。
然而如果负责保存数据的后台子进程不幸出现问题时,SAVE可以作为保存数据的最后手段来使用。

BGSAVE命令执行之后立即返回OK,然后Redis fork出一个新子进程,原来的Redis进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
客户端可以通过LASTSAVE命令查看相关信息,判断BGSAVE命令是否执行成功。

执行一个AOF文件重写操作。重写会创建一个当前AOF文件的体积优化版本。
即使BGREWRITEAOF执行失败,也不会有任何数据丢失,因为旧的AOF文件在BGREWRITEAOF成功之前不会被修改。
重写操作只会在没有其他持久化工作在后台执行时被触发,也就是说:
如果 Redis 的子进程正在执行快照的保存工作,那么AOF重写的操作会被预定(scheduled),等到保存工作完成之后再执行AOF重写。
在这种情况下,BGREWRITEAOF的返回值仍然是OK,但还会加上一条额外的信息,说明BGREWRITEAOF要等到保存操作完成之后才能执行。
在Redis 2.6或以上的版本,可以使用INFO [section]命令查看 BGREWRITEAOF是否被预定。
如果已经有别的AOF文件重写在执行,那么BGREWRITEAOF返回一个错误,并且这个新的BGREWRITEAOF请求也不会被预定到下次执行。
从 Redis 2.4 开始, AOF重写由Redis自行触发,BGREWRITEAOF仅仅用于手动触发重写操作。

2.5.aof重写机制

当AOF文件增长到一定大小的时候Redis能够调用 bgrewriteaof对日志文件进行重写 。当AOF文件大小的增长率大于该配置项时自动开启重写(超过原大小的100%)。
auto-aof-rewrite-percentage 100

当AOF文件增长到一定大小的时候Redis能够调用 bgrewriteaof对日志文件进行重写 。当AOF文件大小大于该配置项时自动开启重写
auto-aof-rewrite-min-size 64mb

2.6.redis4.0后混合持久化机制

开启混合持久化:4.0版本的混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,5.0之后默认开启。
混合持久化是通过bgrewriteaof完成的,不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件,
然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。
简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据。 优点:混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。 缺点:兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,阅读性较差

三、总结

3.1 RDB和AOF性能对比

rdb 适合大规模的数据恢复,对数据完整性和一致性不高 , 在一定间隔时间做一次备份,如果redis意外down机的话,就会丢失最后一次快照后的所有操作
aof 根据配置项而定
官方建议 两种持久化机制同时开启,如果两个同时开启 优先使用aof持久化机制

3.2 性能建议(针对单机版性能提升) 

因为RDB文件只用作后备用途,只要15分钟备份一次就够了,只保留save 900 1这条规则。
如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。
代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。
默认超过原大小100%大小时重写可以改到适当的数值。

posted on 2019-12-28 11:49  VincentYew  阅读(285)  评论(0编辑  收藏  举报

导航