1. Redis简介数据库
Redis,一个开源的 key-value,内存中的数据结构存储系统,它能够用做数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。Redis 使用C语言开发,支持的客户端语言也很是丰富,如C、C#、C++、Object-C、PHP、Python、 Java、Perl、Lua等。Redis 支持 master-slave(主-从)模式应用,支持数据的持久化,能够将内存中的数据村春在硬盘中,重启、断电的时候并不会丢失数据。缓存
2. Redis经常使用的数据类型安全
String
经常使用命令:set/get/getset/mset/mget/setex/setnx/incr/decr/incrby/decrby/strlen/append
应用场景:String 最经常使用的一种数据类型,普通的key/value存储均可以归为此类。数据结构
Hashes
经常使用命令:hset/hget/hmset/hmget/hsetnx/hexists/hdel/hgetall/hkeys
应用场景:存储一个学生信息对象数据,字段包括:id、姓名、班级、年龄等,经过 id 能够获取/修改任意的字段。app
Lists
经常使用命令:lindex/lset/lrem/lange/llen/lpop/lpush/rpop/rpush/lpushx/rpushx
应用场景:关注列表、粉丝列表、队列。性能
Sets
经常使用命令:sadd/scard/spop/srem/smove/sdiff/sinter/sunion/smembers/sismember
应用场景:Sets 虽也是提供一个与 Lists 相似的列表功能,可是 Sets 是会自动排序、去重的,当须要存储一个列表数据,又不但愿有重复数据时,Sets 是一个很好的选择,还能够取交集、并集、差集,能够应用到好友推荐、共同好友列表等,利用惟一性,能够统计访问网站的全部独立 IP。网站
Sorted Sets
经常使用命令:zadd/zcard/zcount/zrem/zscore/zrank/zrevrank/zrange/zrevrange/zrangebyscore/zrevrangebyscore
应用场景:Sorted Sets 是根据 score 来排序的,而且是不重复的,能够应用于积分排行榜等。操作系统
3. Redis持久化
如下摘自连接描述
Redis虽然是基于内存的存储系统,可是它自己是支持内存数据的持久化的,并且提供两种主要的持久化策略:RDB快照和AOF日志。.net
RDB快照调试
Redis支持将当前数据的快照存成一个数据文件的持久化机制,即RDB快照。这种方法是很是好理解的,可是一个持续写入的数据库如何生成快照呢?Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,而后在子进程中循环全部的数据,将数据写成为RDB文件。
咱们能够经过Redis的save指令来配置RDB快照生成的时机,好比你能够配置当10分钟之内有100次写入就生成快照,也能够配置当1小时内有 1000次写入就生成快照,也能够多个规则一块儿实施。这些规则的定义就在Redis的配置文件中,你也能够经过Redis的CONFIG SET命令在Redis运行时设置规则,不须要重启Redis。
Redis的RDB文件不会坏掉,由于其写操做是在一个新进程中进行的,当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件 中,而后经过原子性rename系统调用将临时文件重命名为RDB文件,这样在任什么时候候出现故障,Redis的RDB文件都老是可用的。同时,Redis 的RDB文件也是Redis主从同步内部实现中的一环。
可是,咱们能够很明显的看到,RDB有他的不足,就是一旦数据库出现问题,那么咱们的RDB文件中保存的数据并非全新的,从上次RDB文件生成到 Redis停机这段时间的数据所有丢掉了。在某些业务下,这是能够忍受的,咱们也推荐这些业务使用RDB的方式进行持久化,由于开启RDB的代价并不高。 可是对于另一些对数据安全性要求极高的应用,没法容忍数据丢失的应用,RDB就无能为力了,因此Redis引入了另外一个重要的持久化机制:AOF日志。
AOF日志
AOF日志的全称是append only file,从名字上咱们就能看出来,它是一个追加写入的日志文件。与通常数据库的binlog不一样的是,AOF文件是可识别的纯文本,它的内容就是一个个 的Redis标准命令。固然,并非发送发Redis的全部命令都要记录到AOF日志里面,只有那些会致使数据发生修改的命令才会追加到AOF文件。那么 每一条修改数据的命令都生成一条日志,那么AOF文件是否是会很大?答案是确定的,AOF文件会愈来愈大,因此Redis又提供了一个功能,叫作AOF rewrite。其功能就是从新生成一份AOF文件,新的AOF文件中一条记录的操做只会有一次,而不像一份老文件那样,可能记录了对同一个值的屡次操 做。其生成过程和RDB相似,也是fork一个进程,直接遍历数据,写入新的AOF临时文件。在写入新文件的过程当中,全部的写操做日志仍是会写到原来老的 AOF文件中,同时还会记录在内存缓冲区中。当重完操做完成后,会将全部缓冲区中的日志一次性写入到临时文件中。而后调用原子性的rename命令用新的 AOF文件取代老的AOF文件。
AOF是一个写文件操做,其目的是将操做日志写到磁盘上,因此它也一样会遇到咱们上面说的写操做的5个流程。那么写AOF的操做安全性又有多高呢。实际上 这是能够设置的,在Redis中对AOF调用write(2)写入后,什么时候再调用fsync将其写到磁盘上,经过appendfsync选项来控制,下面 appendfsync的三个设置项,安全强度逐渐变强。
1)appendfsync no
当设置appendfsync为no的时候,Redis不会主动调用fsync去将AOF日志内容同步到磁盘,因此这一切就彻底依赖于操做系统的调试了。对大多数Linux操做系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上。
2)appendfsync everysec
当设置appendfsync为everysec的时候,Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。可是当这一次的 fsync调用时长超过1秒时。Redis会采起延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就无论会执行多 长时间都会进行。这时候因为在fsync时文件描述符会被阻塞,因此当前的写操做就会阻塞。因此结论就是,在绝大多数状况下,Redis会每隔一秒进行一 次fsync。在最坏的状况下,两秒钟会进行一次fsync操做。这一操做在大多数数据库系统中被称为group commit,就是组合屡次写操做的数据,一次性将日志写到磁盘。
3)appednfsync always
当设置appendfsync为always时,每一次写操做都会调用一次fsync,这时数据是最安全的,固然,因为每次都会执行fsync,因此其性能也会受到影响。