Redis:REmote DIctionary Server(远程字典服务)。是一款使用C语言编写的、开源的、基于内存的、高性能的、可持久化的非关系型Key-Value数据库。redis
string是redis最基本的数据类型,一个key对应一个value。string类型是二进制安全的,能够包含任何数据,包括图片、序列化的对象等,最大存储512MB。算法
经常使用命令:数据库
命令 | 描述 | 用法 |
---|---|---|
SET | 一、将value关联到key;二、key已关联则覆盖;三、本来key带有TTL(生存时间),那么TTL被清楚 | SET key value |
GET | 一、返回key所关联的字符串值;二、key不存在返回null; | GET key |
SETEX | 一、将value关联到key;二、设置key生存时间为seconds,单位为秒;三、若是key已关联则覆盖;四、原子操做,关联与设置生存时间同时完成 | SETEX key seconds value |
SETNX | 一、将value关联到key,当且仅当key不存在;二、若key已存在,不作任何动做 | SETNX key value |
hash是一个string类型的field和value的映射表,key 仍是key,可是value是多个键值对(key-value),比较适合存储对象。缓存
经常使用命令:安全
命令 | 描述 | 用法 |
---|---|---|
HSET | 一、将key中的field值设为value;二、filed已存在,被覆盖 | HSET key field value |
HGET | 一、返回key中给定域field中的值 | HGET key field |
HDEL | 一、删除key中的一个或多个指定域;二、不存在的域被忽略 | HDEL key field |
HEXISTS | 一、查看key中,给定域field是否存在,存在返回1,否,返回0 | HEXISTS key field |
HGETALL | 一、返回key中全部的域和值 | HGETALL key |
HLEN | 一、返回key中域的数量 | HLNE key |
list 列表,它是简单的字符串列表,按照插入顺序排序,你能够添加一个元素到列表的头部(左边)或者尾部(右边),它的底层其实是个链表。有序、能够重复。服务器
经常使用命令:app
命令 | 描述 | 用法 |
---|---|---|
LPUSH | 一、将一个或多个值value按顺序插入到key的表头;二、key不存在,则建立并插入;三、key存在但不是list类型,返回错误; | LPSUH key value |
LPUSHX | 一、将value插入到key的头部,当且仅当key存在且为list类型;二、key不存在,什么都不作; | LPUSHX key value |
LPOP | 一、移除并返回key的头元素; | LPOP key |
LRANGE | 一、返回key中指定区间的元素;二、可以使用负数下标,-1表示list最后一个元素;三、start大于list最大下标,返回空列表;四、stop大于list最大下标,stop=list最大下标; | LRANG key start stop |
LSET | 一、将key下标为index的元素值设为value;二、index超出范围或list为空,返回错误; | LSET key index value |
LINDEX | 一、返回key中,下标为index的元素; | LINDEX key index |
LLEN | 一、返回key的长度;二、key不存在,返回0; | LLEN key |
RPUSH | 一、将一个或多个值value按顺序插入到key的表尾; | RPUSH key value |
RPUSHX | 一、将value插入到key的尾部,当且仅当key存在且为list类型; | RPUSHX key value |
RPOP | 一、移除并返回key的尾元素; | RPOP key |
set 是 string 类型的无序集合。无序、不可重复异步
经常使用命令:函数
命令 | 描述 | 用法 |
---|---|---|
SADD | 一、将一个或多个元素加入key中,已存在的元素将返回0;二、key不存在,则建立并添加;三、key不是集合类型时,返回错误 | SADD key member |
SCARD | 一、返回key中对应的集合中的元素数量 | SCARD key |
Redis 有序集合和集合同样也是 string 类型元素的集合,且不容许重复的成员。性能
不一样的是每一个元素都会关联一个 double 类型的分数。redis 正是经过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是惟一的,但分数(score)却能够重复。
命令 | 描述 | 用法 |
---|---|---|
ZADD | 一、将一个或多个元素及其score值加入key中;二、若是已存在元素,则更新score值并从新插入; | ZADD key score member |
ZCARD | 一、返回key中元素个数 | ZCARD key |
ZRANGE | 一、返回key中指定区间类的成员,按score从小到大排序;二、相同score值按字典序排序;三、从大到小排序,使用ZREVRANGE命令;四、可经过WITHSCORES选项让成员和它的score值一并返回 | ZRANGE key start stop [WITHSCORES] |
ZRANK | 一、返回有序集中成员member的排名,按score从小到大排序;二、排名以0为底,score最小的排名0 | ZRANK key member |
Redis 是一个内存数据库将数据库中的内容保存在内存中,这与传统的MySQL等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率),这也是Redis如此之快的缘由。可是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会所有丢失。
为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,分别是RDB(Redis DataBase)和AOF(Append Only File)。
这5个过程是在理想条件下一个正常的保存流程,可是在大多数状况下,咱们的机器等等都会有各类各样的故障,这里划分了两种状况:
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。即将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务便可回复数据,redis就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工做完成为止。
把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中全部键值对数据)。恢复时是将快照文件直接读到内存里。也是Redis默认的持久化方式。
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其余命令,直到RDB过程完成为止。执行完成时候若是存在老的RDB文件,就把新的替代掉旧的。咱们的客户端可能都是几万或者是几十万,这种方式显然不可取。
“save m n”:表示m秒内数据集存在n次修改时,自动触发bgsave。
redis.conf中默认配置:
save 900 1:表示900 秒内若是至少有 1 个 key 的值变化,则保存 save 300 10:表示300 秒内若是至少有 10 个 key 的值变化,则保存 save 60 10000:表示60 秒内若是至少有 10000 个 key 的值变化,则保存
执行该命令时,Redis会在后台异步进行快照操做,快照同时还能够响应客户端请求。
具体操做是Redis进程执行fork操做建立子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,通常时间很短。基本上 Redis 内部全部的RDB操做都是采用 bgsave 命令。
优势
1.RDB是一个很是紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件很是适合用于进行备份和灾难恢复。
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理全部保存工做,主进程不须要进行任何磁盘IO操做。
3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点
1.RDB方式数据没办法作到实时持久化/秒级持久化。由于bgsave每次运行都要执行fork操做建立子进程,属于重量级操做,若是不采用压缩算法(内存中的数据被克隆了一份,大体2倍的膨胀性须要考虑),频繁执行成本太高(影响性能)
2.RDB文件使用特定二进制格式保存,Redis版本演进过程当中有多个格式的RDB版本,存在老版本Redis服务没法兼容新版RDB格式的问题(版本不兼容)
3.在必定间隔时间作一次备份,因此若是redis意外down掉的话,就会丢失最后一次快照后的全部修改(数据有丢失)
全量备份老是耗时的,AOF是一种更加高效的方式,工做机制很简单,redis会将每个收到的写命令都经过write函数追加到文件中。通俗的理解就是日志记录。
经过保存Redis服务器所执行的写命令来记录数据库状态。
好比对于以下命令
set str1 "123" sadd str2 "1" "2" "3" lpush str3 "1" "2" "3"
RDB 持久化方式就是将 str1,str2,str3 这三个键值对保存到 RDB文件中,而 AOF 持久化则是将执行的 set,sadd,lpush 三个命令保存到 AOF 文件中。
在redis.conf中,
优势
1.AOF能够更好的保护数据不丢失,通常AOF会每隔1秒,经过一个后台线程执行一次fsync操做,最多丢失1秒钟的数据。
2.AOF日志文件的命令经过很是可读的方式进行记录,这个特性很是适合作灾难性的误删除的紧急恢复。例如,若是咱们不当心错用了 FLUSHALL 命令,在重写还没进行时,咱们能够手工将最后的 FLUSHALL 命令去掉,而后再使用 AOF 来恢复数据。
缺点
1.对于具备相同数据的的 Redis,AOF 文件一般会比 RDF 文件体积更大。(当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留能够恢复数据的最小指令集)
2.RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,所以从理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一些 BUG,这些 BUG 在 RDB 没有存在。
若是能够忍受一小段时间内数据的丢失,毫无疑问使用 RDB 是最好的,定时生成 RDB 快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,并且使用 RDB 还能够避免 AOF 一些隐藏的 bug;不然就使用 AOF 重写。可是通常状况下建议不要单独使用某一种持久化机制,而是应该两种一块儿用,在这种状况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,由于在一般状况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。Redis后期官方可能都有将两种持久化方式整合为一种持久化模型。
若是有学到东西,请点赞给予鼓励,谢谢。