聊聊db缓存(redis和memcached)

目前最常用的数据库缓存是mysql查询缓存,memcachedredis

首先说下memcached,在php开发中经常会把memcachememcached搞混淆。
其实这2个不是同一个东西,长得像而已,memcached相当于memcache的升级版,效果更好。

memcache最早是在2004年2月开发的,最后更新是在2013年4月,而memcached最早是在2009年1月开发的,最后更新是在2014年1月。因此memcache的历史比memcached早。
所以在php早期版本中多半用的是memcache.
memcache:http://pecl.php.net/package/memcache
memcached:http://pecl.php.net/package/memcached

memcache是一个原生版本,完全是在php框架内开发的,支持OO(面向对象)和非OO两套接口并存,
memcached是建立在libmemcached的基础上的,只支持OO接口。
所以装memcache扩展的时候不要求按照其他的东西,但是memcached扩展是基于libmemcached,所以要先安装libmemcached
因为libmemcached具有低内存,线程安全等优点,在高并发下,稳定性很高。

比较尴尬的一点是 memcachedmemcache 对应的服务端名字都是 memcached,大家使用 ps aux | grep memcache 就会发现守护进程的名字是 memcached(我的环境是 ubuntu),其实后面的 d 可以理解为守护进程,因此网上有的人说 memcache 是客户端, memcached是服务端就是这个意思,大家不要将客户端的 memcached 和服务端的 memcached混淆了就好。

总之: memcachedmemcache 好,因此在以后的开发过程中,大家尽量使用 memcached

memcached

分布式的高速缓存系统,对大型的需要频繁访问数据库的网站提升很大。

工作原理

memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频,文件以及数据库检索的结果等。
简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度

工作流程

先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作。
如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存到memcached中

常用的方法有:

  • 获取 get(key)
  • 设置 set(key,val,expire)
  • 删除 delete(key)

redis

其实这篇文章真正的主角是redis。它是当红炸子鸡,几乎每个网站都在使用它。
任何新技术的诞生都是源于解决实际问题而产生的,redis也不例外。
redis常用于数据量较小的高性能和运算上。

redis的起源

redis源于redis之父Salvatore Sanfilippo在09年为了解决一个实际问题而创造出来的。
当时的问题是这样的:

1
2
3
4
5
6
当时我在尝试做一件使用硬盘存储关系数据库(on-disk SQL database)无法完成的事情-> 在一台我能够买得起的小虚拟机上处理大量写入负载。
具体点说就是这个场景:
多个网站会通过一个小型的javascript追踪器(tracker)连续不断地向我的服务器发送页面访问记录(page view),而我的服务器需要为每个网站保存一定数量的最新页面访问记录,并通过网页将这些记录实时地展示给用户观看。

在最大负载达到每秒数千条页面的情况下,无论我使用什么养的数据库模式,无论我如何进行优化,我所使用的关系数据库都没办法在这个小虚拟机上处理如此大的负载。因为囊中羞涩,我没办法升级虚拟机,并且我觉得应该有更简单的方法来处理一个由推入值组成的列表。
最终,我决定自己写一个实验性质的内存数据库原型(prototype),这个数据库使用列表作为基本数据类型,并且能够对列表的两端执行常数时间复杂度的弹出(pop)和推入(push)操作。长话短说吧,这个内存数据库的想法的确奏效了,于是我用c语言重写了原来最初的数据库原型,并给他加上了基于子进程实现的持久化特性,redis就这样诞生了。

redis与其他缓存服务器的比较

名称 类型 数据存储选项 查询类型 附加功能
redis 使用内存存储的非关系数据库 字符串、列表、集合、散列表,有序集合 每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持; 发布与订阅、主从复制(master/slavel replication)、持久化、脚本(存储过程,stored procedure)
memcached 使用内存存储的键值缓存 键值之间的映射 创建命令、读取命令、更新命令、删除命令以及其他的几个命令 为提升性能而设的多线程服务器
MySQL 关系数据库 每个数据库可以包含多个表,每个表可以包含多个行; 可以处理多个表的视图(view);支持空间(spatial)和第三方扩展 SELECT、INSERT、UPDATE、DELETE、函数、存储过程 支持ACID性质(需要使用InnoDB),主从复制和主主复制(master/master replication)
postgreSQL 关系数据库 每个数据库乐园包含多个表,每个表可以包含多个行; 可以处理多个表的视图;支持空间和第三方扩展; 可定制类型 SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程 支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication)
MongoDB 使用硬盘存储的非关系文档存储 每个数据库可以包含多个表,每个表可以包含多个无schema(schema-less)的BSON文档 创建命令、读取命令、更新命令、删除命令以及条件查询命令等 支持map-reduce操作,主从复制,分片,空间索引(spatial index)

在memcached里,用户只能用APPEND命令将数据添加到已由字符串的末尾。可以用APPEND命令来管理元素列表。
用户可以将元素追加到一个字符串的末尾,并将那个字符串当作列表来使用。
但随后如何删除这些元素呢?
memcached采用的方法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素进行读取、更新、写入(包括在一次数据库查询之后执行的memcached卸乳)的操作。
相反的,redis的listset运行用户直接添加或者删除元素。

redis的写法和思想 不仅可以让代码变得更简短、更易懂、更易维护,而且还可以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。

redis数据结构

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作:对整数和浮点数执行自增(increment) 或者 自减(decrement)操作
LIST 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素: 根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素
SET 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET(有序集合) 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

字符串命令

  • set 设置存储在给定键中的值
  • get 获取键值
  • del 删除键值(这个命令可以用于所有类型)
  • incr incr key-name —将键存储的值加上1
  • decr decr key-name —将键存储的值减去1
  • incrby incrby key-name —将键存储的值加上整数 amount
  • decrby decrby key-name —-将键存储的值减去整数 amount
  • incrbyfloat incrbyfloat key-name amount —-将键存储的值加上浮点数amount
  • append append key-name value -将值value追加到给定键key-name当前存储值的末尾
  • getrange getrange key-name start end –读取给定范围的字符串
  • setrange setrange key-name offset value -将从start偏移量开始的子串设置为给定值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> set key 15
OK
127.0.0.1:6379> incr key
(integer) 16
127.0.0.1:6379> decr key
(integer) 15
127.0.0.1:6379> incrby key 2
(integer) 17
127.0.0.1:6379> decrby key 10
(integer) 7

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> append hello nihao
(integer) 10
127.0.0.1:6379> get hello
"worldnihao"
127.0.0.1:6379> getrange hello 2 5
"rldn"
127.0.0.1:6379> setrange hello 4 --
(integer) 10
127.0.0.1:6379> get hello
"worl--ihao"

列表命令

  • rpush rpush key-name value [value …] –将一个或多个值推入列表的右端
  • lpush lpush key-name value [value …] –将一个或多个值推入列表的左端
  • rpop rpop key-name –移除并返回列表最右端的元素
  • lpop lpop key-name –移除并返回列表最左端的元素
  • lindex lindex key-name offset –返回列表中偏移量为offset的元素
  • lrange lrange key-name start end –返回列表从start偏移量到end范围内的所有元素
  • ltrim ltrim key-name start end – 对列表进行修剪,只保留从start到end范围内的元素
  • blpop blpop key-name [key-name …] timeout – 从第一个非空列表中弹出位于最左端的元素或者在timeout秒之内阻塞并等待可弹出的元素出现
  • brpop brpop key-name [key-name …] timeout – 从第一个非空列表中弹出位于最右端的元素或者在timeout秒内阻塞并等待可弹出的元素出现
  • rpoplpush rpoplpush source-key dest-key –从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
  • brpoplpush brpoplpush source-key dest-key timeout -从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
127.0.0.1:6379> rpush list-key last
(integer) 1
127.0.0.1:6379> lpush list-key first
(integer) 2
127.0.0.1:6379> rpush list-key 'new last'
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "first"
2) "last"
3) "new last"
127.0.0.1:6379> lpop list-key
"first"
127.0.0.1:6379> lrange list-key 0 -1
1) "last"
2) "new last"
127.0.0.1:6379> rpush list-key a b c
(integer) 5
127.0.0.1:6379> lrange list-key 0 -1
1) "last"
2) "new last"
3) "a"
4) "b"
5) "c"
127.0.0.1:6379> ltrim list-key 2 -1
OK
127.0.0.1:6379> lrange list-key 0 -1
1) "a"
2) "b"
3) "c"



//以下命令主要用于队列
//对于阻塞弹出命令和弹出并推入命令,最常见的就是消息传递(messaging)和任务队列(task queue)。
//blpop命令会从左到右检查传入的列表,并对最先遇到的非空列表进行弹出操作
127.0.0.1:6379> rpush list item1
(integer) 1
127.0.0.1:6379> rpush list item2
(integer) 2
127.0.0.1:6379> rpush list item3
(integer) 3
127.0.0.1:6379> brpoplpush list2 list 1
(nil)
(1.03s)
127.0.0.1:6379> brpoplpush list2 list 1
(nil)
(1.06s)
127.0.0.1:6379> lrange list 0 -1
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> brpoplpush list list2 1
"item3"
127.0.0.1:6379> blpop list list2 1
1) "list"
2) "item1"
127.0.0.1:6379> blpop list list2 1
1) "list"
2) "item2"
127.0.0.1:6379> blpop list list2 1
1) "list2"
2) "item3"
127.0.0.1:6379> blpop list list2 1
(nil)
(1.10s)

集合命令

  • sadd sadd key-name item [item …] –将一个或多个元素添加到集合里面,并返回被添加元素当中并不存在于集合里面的元素数量
  • srem srem key-name item [item …] – 从集合里面移除一个或多个元素,并返回被移除元素的数量
  • sismember sismember key-name item – 检查元素item是否存在于集合key-name里
  • scard scard key-name –返回集合包含的元素的数量
  • smembers smembers key-name – 返回集合包含的所有元素
  • srandmember srandmember key-name [count] –从集合里面随机的返回一个或多个元素,当count为正数时,命令返回的随机元素不会重复,当count为负数时,命令返回的随机元素可能会出现重复
  • spop spop key-name – 随机的移除集合中的一个元素,并返回被移除的元素
  • smove smove source-key dest-key item–如果集合source-key包含元素item,那么从集合source-key里面移除元素item,并将元素item添加到集合dest-key中,如果item被成功移除,那么命令返回1,否则返回0
  • sdiff sdiff key-name [key-name …] –返回那些存在于第一个集合,但不存在于其他集合中的元素(数学上的差集运算)
  • sdiffstore sdiffstore dest-key key-name [key-name …] –将那些存在于第一个集合但并不存在于其他集合中的元素(数学上的差集元素)存储到dest-key键里面
  • sinter sinter key-name [key-name …] –返回那些同时存在于所有集合中的元素(数学上的交集运算)
  • sinterstore sinterstore dest-key key-name [key-name …] –将那些同时存在于所有集合的元素(交集运算)存储到dest-key键里面
  • sunion sunion key-name [key-name …] –返回那些至少存在于一个集合中的元素(数学上的并集运算)
  • sunionstore sunionstore dest-key key-name [key-name …] –将那些至少存在于一个集合中的元素(并集运算)存储到dest-key键里面
    相当于php里的数组.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  127.0.0.1:6379> sadd set-key a b c
(integer) 3
127.0.0.1:6379> srem set-key c d
(integer) 1
127.0.0.1:6379> scard set-key
(integer) 2
127.0.0.1:6379> smembers set-key
1) "b"
2) "a"
127.0.0.1:6379> smove set-key set-key2 a
(integer) 1
127.0.0.1:6379> smembers set-key2
1) "a"

127.0.0.1:6379> sadd skey1 a b c d
(integer) 4
127.0.0.1:6379> sadd skey2 c d e f
(integer) 4
127.0.0.1:6379> sdiff skey1 skey2
1) "b"
2) "a"
127.0.0.1:6379> sinter skey1 skey2
1) "c"
2) "d"
127.0.0.1:6379> sunion skey1 skey2
1) "d"
2) "e"
3) "a"
4) "c"
5) "b"
6) "f"

散列

将一些相关的数据存储在一起,我们可以把这种数据聚集看作是关系数据库的行,或者文档数据库的文档。
用于记录文章投票次数
类似于mongodb

  • hmget hmget key-name key [key …] –从散列里面获取一个或多个键的值
  • hmset hmset key-name key value [key value …] –为散列里面的一个或多个键设置值
  • hdel hdel key-name key [key …] –删除散列里面的一个或者多个键值对,返回成功找到并删除的键值对数量
  • hlen hlen key-name –返回散列包含的键值对数量
  • hexists hexists key-name key –检查给定键是否存在于散列中
  • hkeys hkeys key-name –获取散列包含的所有键
  • hvals hvals key-name –获取散列包含的所有值
  • hgetall hgetall key-name –获取散列包含的所有键值对
  • hincrby hincrby key-name key increment –将键key存储的值加上整数increment
  • hincrbyfloat hincrbyfloat key-name key increment –将键key存储的值加上浮点数increment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
127.0.0.1:6379> hmset hast-key k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> hmset hash-key k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> hmget hash-key k2 k3
1) "v2"
2) "v3"
127.0.0.1:6379> hlen hash-key
(integer) 4
127.0.0.1:6379> hdel hash-key k1 k3
(integer) 2
127.0.0.1:6379> hlen hash-key
(integer) 2

127.0.0.1:6379> hmset hash-key2 short hello long 10000*1
OK
127.0.0.1:6379> hkeys hash-key2
1) "short"
2) "long"
127.0.0.1:6379> hexists hash-key2 num
(integer) 0
127.0.0.1:6379> hincrby hash-key2 num 1
(integer) 1
127.0.0.1:6379> hexists hash-key2 num
(integer) 1

有序集合

和散列存储键与值之间的映射类似。有序集合也存储着成员与分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序的获取(fetch)或扫描(scan)成员和分值的命令。
常用于:
基于发表时间排序的文章列表和基于投票数量排序的文章列表
存储cookie的过期时间

  • zadd zadd key-name score member [score member …] –将带有给定分值的成员添加到有序集合里面
  • zrem zrem key-name member [member …] –从有序集合里面移除给定的成员,并返回被移除成员的数量
  • zcard zcard key-name –返回有序集合包含的成员数量
  • zincrby zincrby key-name increment member – 将member成员的分值加上increment
  • zcount zcount key-name min max –返回分值介于min和max之间的成员数量
  • zrank zrank key-name member –返回成员member在有序集合中的排名
  • zscore zscore key-name member –返回成员member的分值
  • zrange zrange key-name start stop [withscores] –返回有序集合中排名介于start和stop之间的成员,如果给定了可选的withscores选项,那么命令会将成员的分值也一并返回
  • zrevrank zrevrank key-name member –返回有序集合里成员member的排名,成员按照分值从大到小排列
  • zrevrange zrevrange key-name start stop [withscores] –返回有序集合给定排名范围内的成员,成员按照分值从大到小排列
  • zrangebyscore zrangebyscore key min max [withscores] [limit offset count] –返回有序集合中,分值介于min和max之间的所有成员
  • zrevrangebyscore zrevrangebyscore key max min [withscores] [limit offset count] –获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回他们
  • zremrangebyrank zremrangebyrank key-name start stop –移除有序集合中排名介于start和end直接的所有成员
  • zremrangebyscore zremrangebyscore key-name min max –移除有序集合中分值介于min和max之间的所有成员
  • zinterstore ZINTERSTORE dest-key key-count key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] –对给定的有序集合执行类似于集合的交集运算
  • zunionstore zuninstore dest-key key-count key [key …] [weights wieght [weight …]] [AGGREGATE SUM|MIN|MAX] – 对给定的有序集合执行类似于集合的并集运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
127.0.0.1:6379> zadd zset-key 3 a 2 b 1 c
(integer) 3
127.0.0.1:6379> zcard zset-key
(integer) 3
127.0.0.1:6379> zincrby zset-key 3 c
"4"
127.0.0.1:6379> zscore zset-key b
"2"
127.0.0.1:6379> zrank zset-key c
(integer) 2
127.0.0.1:6379> zcount zset-key 0 3
(integer) 2
127.0.0.1:6379> zrem zset-key b
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "a"
2) "3"
3) "c"
4) "4"

//还可以把集合作为输入传给zinterstore和zunionstore。命令会将集合看作是成员分值全为1的有序集合来处理

127.0.0.1:6379> zadd zset-1 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> zadd zset-2 4 b 1 c 0 d
(integer) 3
127.0.0.1:6379> zinterstore zset-i 2 zset-1 zset-2
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> zrange zset-i 0 -1 withscores
1) "c"
2) "4"
3) "b"
4) "6"
127.0.0.1:6379> zunionstore zset-u 2 zset-1 zset2 AGGREGATE MIN
(integer) 3
127.0.0.1:6379> zrange zset-u 0 -1 WITHSCORES
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
127.0.0.1:6379> sadd set-1 a d
(integer) 2
127.0.0.1:6379> zunionstore zset-u2 3 zset-1 zset-2 set-1
(integer) 4
127.0.0.1:6379> zrange zset-u2 0 -1 withscores
1) "d"
2) "1"
3) "a"
4) "2"
5) "c"
6) "4"
7) "b"
8) "6"

发布与订阅

发布与订阅的特点是订阅者(lister)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message)。
每当有消息被发送到给定频道时,频道的所有订阅者都会收到消息。
我们也可以把频道看作是电台,其中订阅者可以同时收听多个电台,而发送者则可以在任何电台发送消息.

Redis 发布订阅(pub/sub)是一种消息通信模式,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。适宜做在线聊天、消息推送等。

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息,客户端可以订阅任意数量的频道

  • subscribe subscribe channel [channel …] –订阅给定的一个或多个频道
  • unsubscribe unsubscribe [channel] [channel …]] –退订给定的一个或多个频道,如果执行时没有给定任何频道,那么退订所有频道
  • publish publish channel message – 向给定频道发送消息
  • psubscribe psubscribe pattern [parrern …] –订阅与给定模式相匹配的所有频道
  • punsubscribe pubsubscribe [pattern [parrern …]] –退订给定的模式,如果执行时没有给定任何模式,那么退订所有模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
一、publish channel message:发布者向指定的频道发布消息
127.0.0.1:6379> publish mall:zouhongzhao 'redis study one'
(integer) 0

二、sbuscribe channel [channel2 ... n]:订阅者订阅某个或几个频道,监听channel的消息
订阅者订阅频道后,只能接收到之后发布者发布的消息
127.0.0.1:6379> subscribe mall:zouhongzhao
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mall:zouhongzhao"
3) (integer) 1
订阅后,发布者再发布消息,可以看到有一个客户端接收到消息了
127.0.0.1:6379> publish mall:zouhongzhao 'redis study two'
(integer) 1

127.0.0.1:6379> subscribe mall:zouhongzhao
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mall:zouhongzhao"
3) (integer) 1
1) "message"
2) "mall:zouhongzhao"
3) "redis study two"

三、psubscribe pattern [pattern2 .. n]:根据匹配模式订阅频道,可订阅多个匹配的频道
订阅所有redis频道
127.0.0.1:6379> psubscribe mall:redis*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "mall:redis*"
3) (integer) 1
我在发布一条消息
127.0.0.1:6379> publish mall:redis-client 'hello'
(integer) 3
可以看到接收到匹配频道的消息
127.0.0.1:6379> psubscribe mall:redis*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "mall:redis*"
3) (integer) 1
1) "pmessage"
2) "mall:redis*"
3) "mall:redis-client"
4) "hello"

四、pubsub channels [pattern]:列出活跃的频道
127.0.0.1:6379> pubsub channels
1) "mall:zouhongzhao"

五、pubsub subnum channel [channel2 .. n]:查询频道订阅者数量
127.0.0.1:6379> pubsub numsub mall:zouhongzhao
1) "mall:zouhongzhao"
2) (integer) 1

持久化

redis提供了两种不同的持久化方法来将数据存储在硬盘里。
一种叫 快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里面。相当于mysql里的复制原始数据,当宕机时,文件会丢失。
一种叫 只追加文件(append-only file),它会在执行写命令时,将被执行的写命令复制到硬盘里面。相当于mysql里的复制sql语句,再根据设置定时执行sql语句同步数据到硬盘,文件基本不会丢失,可靠性高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//快照持久化选项
save 60 1000 (表示如果60秒内至少有1000个key的值变化 就触发保存)
stop-writes-on-bgsave-error no (禁用报错,默认是开启的)
rdbcompression yes (默认开启压缩)
dbfilename dump.rdb

//AOF持久化选项
appendonly no
appendfsync everysec (每一秒写入aof文件,并完成磁盘同步)
no-appendfsync-on-rewrite no (如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no)
auto-aof-rewrite-percentage 100 (指定Redis重写AOF文件的条件,默认为100,表示与上次rewrite的AOF文件大小相比,当前AOF文件增长量超过上次AOF文件大小的100%时,就会触发background rewrite)
auto-aof-rewrite-min-size 64mb (指定触发rewrite的AOF文件大小。若AOF文件小于该值,即使当前文件的增量比例达到auto-aof-rewrite-percentage的配置值,也不会触发自动rewrite。即这两个配置项同时满足时,才会触发rewrite。)

//共同的选项,快照文件或者AOF文件的保存位置
dir ./
坚持原创技术分享,您的支持将鼓励我继续创作!