加载中…
个人资料
梁喜健
梁喜健
  • 博客等级:
  • 博客积分:0
  • 博客访问:87,224
  • 关注人气:46
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
新浪微博
我去过的地方
国内 (8篇)
国外 (0篇)
站在小丘我四下望
我的音乐
评论
加载中…
留言
加载中…
访客
加载中…
好友
加载中…
博文
(2014-11-20 15:07)
    自Redis增加Sentinel集群工具以来,本博主就从未尝试过使用该工具。最近在调研目前主流的Redis集群部署方案,所以详细地看了一遍官方对于Sentinel的介绍并在自己的台式机上完成了三Redis实例+三Sentinel实例的部署,这里做一下简单的总结。
    首先,下载安装Redis。目前随Redis 2.8发布的Sentinel版本被antirez称为Sentinel 2,是在Sentinel 1的基础上重写的。因为Sentinel 1已经废弃而且BUG太多,所以antirez强烈建议将Redis和Sentinel均升级到2.8版本,本博主安装的版本为最新的2.8.17。
    其次,配置并启动Redis实例。分别在6379、6380和6381三个本地端口上启动三个Redis实例,其中6379为Master,其余两个为Slave。关于Redis的主从配置这里就不再赘述了,但其中需要指出的是两个Slave在配置参数slave-priority上的区别:6380实例该配置参数为50,6381实例该配置参数
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    去年本博主发表了一篇关于Redis Cluster搭建的博文,因为当时没有找到任何官方的说明文档,所以只能根据Redis主页上的Redis cluster Specification一步步地摸索出了一种搭建方法,可以说是彻彻底底的野路子。后来自己怕误人子弟,还很自觉地在原文中对这一点作了说明。后来某位网友发来一篇博文的链接:http://no-fucking-idea.com/blog/2012/04/16/setting-up-redis-cluster/,其中就是介绍如何使用redis源码包中的redis-trib.rb工具来实现Redis Cluster的搭建,不仅实现方法异常简单而且发表时间也早了一年有余,由此可知自己的那篇博文确实是闭门造车了。最近Redis官网正式推出了支持Redis Cluster的3.0 Beta版,我在官网上也找到了关于Redis Cluster搭建的tutorial,今天按照上面的步骤尝试了一把,果真是极好的!于是乎赶紧发一篇博文,希望已经被俺前一篇博文毒害的弟兄们早日悬崖勒马,回归正道!
    首先,下载支持Redis Cluster的源码包,最方便的当然就是直接下载3.0 Beta版,其链接地址为:https://github.com/antirez/redis/archive/3.0.0-beta1.tar.gz。解压安装后,对Redis进行配置,主要就是
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
Slowlog是Redis从2.2.12版本引入的一条命令,用于查询和重置Redis内部维护的慢查询日志,其中每条日志的内容均由四部分组成:1)慢查询日志Id,该Id对于每条日志来说都是唯一的;2)慢查询日志被记录的Unix时间戳;3)慢查询的执行时间,以微秒计;4)查询本身,包括命令以及一系列参数。
    需要说明的是,所谓慢查询指的就是内部执行时间超过某个指定时限的查询,而控制该指定时限的就是Redis配置文件中的配置项slowlog-log-slower-than。除了slowlog-log-slower-than外,在配置文件中还有另外一个参数与慢查询日志有关,那就是slowlog-max-len,该配置项控制了Redis系统最多能够维护多少条慢查询日志。因为虽然我们这里称之为日志,但实际上它们仅维护在内存中而不会写出到磁盘的日志文件上去,所以slowlog-max-len的作用就是控制慢查询日志的内存占有量。
    Slowlog可用的命令形式有三种:1)slowlog get [number],返回最近的number条慢查询日志,如果不提供number参数则返回全部慢查询日志;2)slowlog len,返回当前已有慢查询日志的条数;3)slowlog
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
在上一篇博文中,我们介绍了Cursor类的一个重要子类BasicCursor。作为Cursor类的子类,BasicCursor实现了游标中断机制,但却没有实现Cursor类中另外一个重要的纯虚函数Next,所以我们可以把BasicCursor看成是个半成品,任何不想自己实现中断机制的游标都可以通过继承BasicCursor来自动获取中断机制,这样它们只需要实现Next函数就可以成为一个完整可用的游标了。事实上,Supersonic中继承BasicCursor类的游标实现非常多,这里我们不妨看一个简单的来感受一下Supersonic中一个完整可用的游标究竟是怎样实现。

代码段五:

class ViewCursor : public BasicCursor {

    public:

  static Cursor* Create

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
众所周知,在传统的关系型数据库中用于处理查询结果最常用的一种机制就是游标。当用户使用SQL语句从数据库中检索数据后,结果会放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。作为面向列存储的查询库,Supersonic同样支持游标,这样当查询结果包含了很多条记录时,用户就可以通过Supersonic提供的游标API逐条读取和处理查询结果。实际上,Supersonic中大部分查询API的执行结果都需要使用游标来处理。接下来,我们就来分析一下Supersonic中实现游标的源码,从而对其实现原理一探究竟。
在开始对游标部分的源码进行分析前,我们首先来看一个使用Supersonic游标的测试用例,这可以帮助我们对游标的使用建立起一个直观的印象。代码段一给出了一个简单的测试用例,用于实现类似于“SELECT SUM(b) FROM table GROUP BY a”的查询,其中查询结果使用游标来读取。由代码段一可知,用于实现分组SUM查询的函数GroupedSums自动返回一个游标并赋值给了类型为Cursor的变量result_cursor
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids也不例外。在Redis提供的诸多命令中,EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT以及SETEX和PSETEX均可以用来设置一条Key-Value对的失效时间,而一条Key-Value对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确)。可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到Redis中又是如何呢?最近本博主就对Redis中的主键失效机制产生了几个疑问,并根据这些疑问对其进行了仔细的探究,现总结所得如下,以飨各位看客。
    一、除了调用PERSIST命令外,还有没有其他情况会撤销一个主键的失效时间?答案是肯定的。首先,在通过DEL命令删除一个主键时,失效时间自然会被撤销(这不是废话么,哈哈)。其次,在一个设置了失效时间的主键被更新覆盖时,该主键的失效时间也会被撤销(这貌似也是废话,哈哈)。但需要注意的是,这里所说的
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    在上一篇博文中,本博主介绍了Redis Cluster的搭建方法,从中可以看出其使用方法与单机版Redis确实存在着不小的差异。实际上,除了搭建配置方法以外,Redis Cluster还具有一些其他方面的不同,譬如它不支持多个数据库,不支持select命令等等,但其中最大的不同还是Redis Cluster不支持复杂的多主键操作。关于这一点,Redis Cluster的官方文档有这样一段描述,现摘录如下:Commands performing complex multi key operations like Set type unions or intersections are not implemented, and in general all the operations where in theory keys are not available in the same node are not implemented。由这段描述可知,在Redis Cluster中任何跨节点的命令都是不允许的,但是落实到具体的系统实现中,Redis Cluster又是如何去处理这些命令的呢?我们不妨通过两种典型的命令来验证一下,其中一种是MULTI/EXEC事务命令,该命令可以将多条Redis命令一次执行,所以这类命令可能同时操作多个主键,另外一种是本身就支持多主键的命令如mset和mget等。下面,本博主就在之前搭建的Redis Cluster上,分别尝试了以上两类命令的不同执行场景,以此来感性地认识Redis Cl
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    Redis Cluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅功能,官方声明将会在今年第三季度发布Redis Cluster的beta版并在年底发布第一个稳定版本。当前,虽然Redis的稳定版本里还没有集成分布式功能,但实际上在开发版中Redis Cluster的开发已经取得了长足的进展,我们已经可以搭建Redis集群并使用其部分功能了。今天,本博主基于最新的开发版代码尝试着搭建了一个三节点的Redis集群,这里不妨把过程简单总结一下,希望能对各位看客们有所帮助!(注:本篇博文中的搭建方法是彻彻底底的野路子,Redis官方已正式发布Redis Cluster搭建方法,链接如下:http://redis.io/topics/cluster-tutorial。)
    首先,下载最新的Redis开发版源码包。这个再简单不过了,大家既可以去Redis在github上的主页下载,也可以直接运行“git clone git://github.com/antirez/redis.git”克隆整个Redis代码库,当然前提是你已经安装了git。
    其次,安装Redis。因为本博主要搭建一个三节点的Redis集群,所以在这三个节点上都要安装好Redis,我们这里姑且将这三个节点命名
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    为了实现对内存管理器的控制,Supersonic设计了一个协调器,该协调器使用类Mediator来实现。该协调器的设计思想十分简单,那就是每次内存管理器需要分配一个指定大小的内存空间时都需要先询问一下这个协调器,譬如内存管理器向协调器说“我要分配一段长度为50字节的内存,如果没有50个字节,那么最少也要40个字节”,这时协调器就会根据自己的内部实现来计算是否要满足内存管理器的请求,如果协调器说“我不能让你分配50个字节,但是你可以分配45个字节”,那么内存管理器就会分配45个字节的内存空间,但如果协调器说“我最多只能让你分配30个字节”,那么内存管理器就认为此次申请被拒绝,从而返回NULL。此外协调器还负责监管内存管理器释放的内存空间,即内存管理器每次释放内存空间都要告诉协调器自己释放了多少空间,这样协调器便将这部分空间的大小回收,留作下次分配。

代码段五:
 
class Mediator {
 public:
  Mediator() {}
  virtual ~Mediator() {}
&nb
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
    在之前对Supersonic列存储相关的数据结构中,我们介绍了一种特殊类型的列,实现该类型列的类为OwnedColumn。这个类不同于Column的地方就在于它可以使用内存分配器来重新分配列数据所占用的内存空间,实现内存分配器的类就是BufferAllocator,接下来我们就来分析一下BufferAllocator这个类及其相关子类,借此来了解一下Supersonic是如何实现内存管理的。

    代码段一:

    class Buffer {
      public:
       void* data() const { return data_; }
       size_t size() const { return size_; }
      private:
       friend class BufferAllocator;
       Buffer(void* data, size_t size, BufferAllocator* allocat
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有