首页 > 代码库 > Redis cluster学习
Redis cluster学习
Redis中的5种数据类型String、Hash、List、Set、Sorted Set。
Redis源码总代码一万多行。
这篇文章有一些Redis “常识” http://www.searchdatabase.com.cn/showcontent_70423.htm
key可以是任意类型,最后都存成byte[];作者建议用 : 分隔表名,用.作为单词间的连接。(据我所知,redis只有库没有表)
针对KEY的操作:
命令 sort(按某个key从小到大排序,desc则是从大到小):
参考 http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135921.html
10.117.146.16:8379> lpush price 30 1.5 10 8 (integer) 4 10.117.146.16:8379> sort price 1) "1.5" 2) "8" 3) "10" 4) "30" 10.117.146.16:8379> sort price desc 1) "30" 2) "10" 3) "8" 4) "1.5"
1.还可以使用alpha修饰符对字符串进行排序
2.使用limit修饰符限制返回结果
3.使用外部key进行排序
4.get有一个额外的参数规则,那就是可以用#获取被排序键的值。
5.通过将一个不存在的键作为参数传给 by 选项, 可以让 sort 跳过排序操作,直接返回结果。
6.这种用法在单独使用时,没什么实际用处。不过,通过将这种用法和get选项配合,就可以在不排序的情况下,获取多个外部键,相当于执行一个整合的获取操作(类似于 sql数据库的join关键字)。
保存排序结果
10.117.146.16:8379> sort price store ordered_price (integer) 4 10.117.146.16:8379> lrange ordered_price 0 -1 1) "1.5" 2) "8" 3) "10" 4) "30" 返回值: 没有使用 store 参数,返回列表形式的排序结果。 使用 store 参数,返回排序结果的元素数量。
其他命令还有:KEYS
这一篇讲Redis Cluster的原理还比较清晰 http://www.cnblogs.com/foxmailed/p/3630875.html
Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,
集群中的每个Redis Instance负责其中的一部分的Slot的读写。
集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,
会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。
一个Key到底属于哪个Slot由crc16(key) % 16384 决定。 关于负载均衡,集群的Redis Instance之间可以迁移数据,以Slot为单位,但不是自动的,需要外部命令触发。 关于集群成员管理,集群的节点(Redis Instance)和节点之间两两定期交换集群内节点信息并且更新,从发送节点的角度看,这些信息包括:
集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(比如OK,PFAIL,FAIL,后面详述)是什么,包括节点角色(master 或者 slave)等。 关于可用性,集群由N组主从Redis Instance组成。主可以没有从,但是没有从
意味着主宕机后主负责的Slot读写服务不可用。一个主可以有多个从,主宕机时,某个从会被提升为主,具体哪个从被提升为主,协议类似于Raft,参见这里。
如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会定期给其他所有的节点发送Ping,
cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。
通过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,
并且将其发送给其他所有节点,其他所有节点收到后立即认为该节点宕机。
从这里可以看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。
这里有一些使用Redis遇到的坑和经验 http://www.360doc.com/content/16/0425/23/16915_553797555.shtml
疑似 Cluster 脑裂?(这个名称好可怕。。)
脑裂在所谓的分布式系统中很常见,大家也不陌生,做为DBA最怕的就是Mysql keepalived 脑裂,造成主库双写。难道 Redis Cluster中也会有脑裂么?
凌晨5点接到电话,发现应用看到数据不一致,偶尔是无数据,偶尔有数据,很像读到了脏数据。
登上 Redis, Cluster Nodes, Cluster Config,确实发现不同 Redis 实例配置了不同的Cluster Nodes。
想起了昨天有对该集群迁移,下掉了几个实例,但是在 PHP 配置端没有推送配置,导致 PHP 可能读到了旧实例数据,马上重新推送一遍配置,问题解决。
Redis cluster学习