标签:主从 size 结构 开发 条件 可能性 多个 upd run
Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统。由于 Redis 的键包括 string,hash,list,set,sorted set,bitmap 和 hyperloglog,所以常常被称为数据结构服务器。
你可以在这些类型上面运行原子操作,例如,追加字符串,增加哈希中的值,加入一个元素到列表,计算集合的交集、并集和差集,或者是从有序集合中获取最高排名的元素。
为了满足高性能,Redis 采用内存 (in-memory) 数据集 (dataset)。根据你的使用场景,你可以通过每隔一段时间转储数据集到磁盘,或者追加每条命令到日志来持久化。
Redis 还支持主从异步复制,非常快的非阻塞初次同步、网络断开时自动重连局部重同步。 特性包括:
你可以通过多种语言来使用 Redis。
Redis 是由 ANSI C 语言编写的,在无需额外依赖下,运行于大多数 POSIX 系统,如 Linux、*BSD、OS X。Redis 是在 Linux 和 OS X 两款操作系统下开发和充分测试的,我们推荐 Linux 为部署环境。Redis 也可以运行在 Solaris 派生系统上,如 SmartOS,但是支持有待加强。没有官方支持的 Windows 构建版本,但是微软开发和维护了一个 64 位 Windows 的版本。
api文档: http://www.redis.cn/commands.html#generic
支持以下几种:
http://www.redis.cn/commands.html#string
http://www.redis.cn/commands.html#list
以例子来说明:
我们以一些例子来说明list结构是如何自动创建key和删除的。
lpush mylist 1 2 3
192.168.0.211:6379> lpop mylist "3" 192.168.0.211:6379> lpop mylist "2" 192.168.0.211:6379> lpop mylist "1" 192.168.0.211:6379> lpop mylist (nil) 192.168.0.211:6379> exists mylist (integer) 0
http://www.redis.cn/commands.html#hash
作为最常用的redis结构,一般有2种设计的思路,多个key和单个key。
hmset user:1000 username antirez birthyear 1977 verified 1 hmset user:1001 username jerry birthyear 1971 verified 1
hset users 1000 "{username:antirez,birthyear:1977,verified:1}" hset users 1001 "{username:jerry,birthday:1971,verified:2}"
http://www.redis.cn/commands.html#set
http://www.redis.cn/commands.html#sorted_set
这是一个简单的例子,只包含4张表:用户(user)、关注(following)、粉丝(followers)、帖子(updates)
#1. 使用字符串产生唯一user_id INCR next_user_id => 1000 #2. 使用hash结构的第一种设计来存储用户名密码 HMSET user:1000 username antirez password p1pp0
如果要支持getUserIdByUsername(String username)类似的操作:
# 使用hash结构一个key方式存储username->id HSET users antirez 1000
每个用户可能有多个粉丝,用户->粉丝的映射关系可以使用有序集合来存储,使用时间来作为score
# user1000的粉丝增加了一个是:user1234,时间是...
ZADD followers:1000 1401267618 1234
关注也一样:
# user1000也可以关注对方1234 ZADD followering:1000 1401267618 1234
这里不搞的太麻烦,帖子就是唯一的更新,也就是posts
这里最适合的结构是列表List,使用栈,把最新的放在栈顶
再利用列表的LLEN和LRange进行排序,这里不演示:
posts:1000 => a List of post ids - every new post is LPUSHed here.
redis和memcached最大不同之处就在于redis既可以做缓存,又可以做存储。存储便依赖于redis的持久化机制。
支持2种:rdb和aof。
save 60 1000
",亦可手动SAVE或者BGSAVE命令。Redis 对数据备份非常友好,因为你可以在数据库运行时拷贝 RDB 文件:RDB 文件一旦生成就不会被修改,文件生成到一个临时文件中,当新的快照完成后,将自动使用 rename(2) 原子性的修改文件名为目标文件。
这意味着,在服务器运行时拷贝 RDB 文件是完全安全的。以下是我们的建议:
有可能在写 AOF 文件时服务器崩溃(crash),文件损坏后 Redis 就无法装载了。如果这个发生的话,你可以使用下面的步骤来解决这个问题:
一种使用和配置都非常简的主动(master-slave)复制,允许Redis从服务器成本主服务器的精确副本。
(1).我们设置节点 A 作为主服务器,关闭了持久化,节点 B 和节点 C 从节点 A 复制。
(2).A 崩溃了,但是它拥有某个自动重启系统,重启了这个进程。但是,由于持久化是被关闭的,这个节点以空的数据集重启。
(3). 节点 B 和节点 C 从空的 A 复制,于是它们完全销毁了他们的数据拷贝。
当开启了哨兵时,关闭主服务器的自动重启就明智的,防止哨兵没有检测到Master的自动重启。
- 是通过命令流完成的,和Redis协议是一样的格式。
- 可以用telnet给一台正在工作的Redis端口发送 SYNC命令,然后会看到大量的传输。
- 当主从链路断开,从服务器可以自动重连。如果主服务器收到多个并发的同步请求,只会执行一个后台来保存服务所有的服务器。
- 当重连后,总是执行一个全量同步,在2.8之后,可以选择执行部分同步.(partial resynchronization)
即在复制中途断开,再重连之后,可以继续复制过程,而不需要一次完整的重新同步。
通过在主服务器上创建一个复制流的内存缓冲区(in-memory backlog)实现。主服务器和所有从服务器记录一个复制偏移量(offset)和一个主服务器的ID(run id),当链接断掉时,从服务器会重链接,并且请求服务器继续恢复复制。
如果满足以下条件:
就可以继续增量复制,否则执行完整重同步。
完整的全量同步需要在磁盘上创建一个RDB文件,然后从磁盘加载同一个RDB给从服务器,性能一般。
因此在2.8.18版本后试验性的支持无盘复制。
原理是:子进程通过线路(write)发送RDB给从服务器,而且不需要使用磁盘作为中间存储。
在2.6版本在在之后默认从服务器默认开启只读模式。
这个行为由conf中的slave-read-only所控制
而且支持运行时通过CONFIG SET修改,在某些failover策略中关闭read-only使用有意义的。
举个例子:可以考虑使用传统的高可用模型来建立架构,比如说使用keep-alived来保持高可用,这就需要slave也支持写模式了。
即在master上配置一个健康监测机制,当成功检测到有N个健康的slave才允许写操作。
在Redis主服务器上设置:
min-slaves-to-write <number of slaves>
min-slaves-max-lag <number of seconds>
(1) Redis主服务器每秒钟Ping主服务器,上报处理完的复制流的数据量。
(2) Redis主服务器记录上一次从每一个从服务器中收到ping 的时间,健康监测
(3) 用户配置最小的从服务器数量,每台从服务器拥有一个不大于最大秒数的滞后lag.
标签:主从 size 结构 开发 条件 可能性 多个 upd run
原文地址:http://www.cnblogs.com/carl10086/p/6149735.html