redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是默认方式 Snapshotting(快照),另一种是Append-only file的方式。
一、Snapshotting(快照)
1)、redis调用fork,现在有了子进程和父进程。
2)、子进程开始将数据写到临时RDB文件中。
3)、当子进程完成写RDB文件,用新文件替换老文件。
4)、这种方式可以使Redis使用copy-on-write技术。
二、AOF日志
1)、redis调用fork,现在有了子进程和父进程。
2)、子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3)、父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
4)、当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
5)、现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。
三、配置redis磁盘写入方式和时机
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
四、redis数据类型
1)、String(get、set、incr、decr mget)
set msg "hello word";
set number 10086;
get msg;
get number;
2)、hash(hget,hset,hgetall)
hset key field value 设置hash field为指定值,如果key不存在,则先创建。
hset message "id" 100001; //键入key-value
hset message "name" "jack";
hget key field 获取指定的hash field。
hget message "id"; //通过key获得value
hdel message "id"; //通过key删除
hlen message; //获取哈希键值对的数量
hgetall 返回hash的所有filed和value
3)、list(lpush,rpush,lpop,rpop,lrange)
lpush key string 在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型。
lpush message "topic";
rpush key string 同上,在尾部添加。
rpush content "admin"'
lpop key 从list的头部删除元素,并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list返回错误
rpop key 同上,但是从尾部删除
4)、set(sadd,srem,spop,sdiff ,smembers,sunion)
sadd key member 添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误
srem key member 从key对应set中移除给定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set 类型的值返回错误
spop key 删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil
srandmember key 同spop,随机取set中的一个元素,但是不删除元素
smove srckey dstkey member 从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的。成功返回1,如果member 在srckey中不存在返回0,如果key不是set类型返回错误
5)、sort set(zadd,zrange,zrem,zcard)
zadd key score member 添加元素到集合,元素在集合中存在则更新对应score
zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
zrem key member 删除指定元素,1表示成功,如果元素不存在返回0
zcard key 返回集合中元素个数