CreateArtTechnology / Blog
  • Jedis集成与踩坑经历
     18     2019-07-25 19:27:12

    Jedis简介Jedis是Redis的Java客户端实现,封装了对Redis的通信和命令处理等。Jedis提供了资源池,可以很方便地实现对Redis的API调用。
    Jedis集成目标之前是通过组内对Jedis封装的Spring Bean来获取和使用Jedis的,现在希望自行实现类似功能,设计目标如下:
    封装为Spring FactoryBean集成目前自行实现的基于ZooKeeper的配置中心组件获取单个连接,避免每次调用需要从资源池中获取一个连接的额外操作(其实还有归还操作)实现在服务启动依赖注入后配置变更仍然能生效
    思路具体思路就是针对设计目标而定的:
    实现FactoryBean接入Config组件DCL单例生成资源池JedisPool,并通过动态代理提供Jedis连接,连接从JedisPool中获取配置变更后使用新的JedisPool替换旧的
    具体实现由于需求比较基础,还没有太多应用场景,实现也没考虑太复杂。整体逻辑不到50行,可以在我的GitHub上大致看一下。后续使用可以直接使用Spring将Bean注入。
    ......


  • 发布订阅Redis的发布订阅功能可以实现一个简单的消息队列。Redis客户端可以通过命令SUBSCRIBE、PSUBSCRIBE等命令实现订阅频道,成为该消息队列的消费者,在Redis中对该频道建立或添加一个链表保存该客户端节点。其中SUBSCRIBE是直接添加客户端到对应的频道链表中,而PSUBSCRIBE是添加到pattern链表中,在产生消息时通过正则匹配确认是否是消费者。当订阅该频道的客户端执行PUBLISH命令,会在频道中产生消息,发送给所有订阅该频道的消费者。
    事务MULTI命令会启用该客户端的事务队列,后续该客户端的合法命令都会入队列但不执行。当执行EXEC命令时,服务器执行该客户端队列的所有已入队命令,中途不会切换处理其他客户端命令,保证事务的原子性。事务中任何一个命令执行失败,不会影响其前后命令的执行,不会引起事务回滚。如果客户端有执行WATCH命令监视一些key,那么在EXEC命令执行前会检查其监视的key在WATCH期间是否被其他客户端修改过。一旦任何key被修改过,可认为事务不再安全,整个事务将不会执行。Redis事务的ACID:
    原子性:命令执行失败不会引起事务中断,其他命令仍然会执行。事务的前置条件有问题,那么事务不会执行。要么全执行,要么全不执行一致性:Redis在入队、执行时都检查了命令,且故障时可通过RDB或AOF文件恢复,数据库中不会保存错误、不合法的数据隔离性:Redis是单线程处理事件的,在事务执行期间不会中断事务去执行其他客户端的命令,保证事务之间是隔离的耐久性:Redis基本没提供相应的保证
    为什么 Redis 不支持回滚(roll back)如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。
    以下是这种做法的优点:
    Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
    ......


  • 主从复制模式通过简单的命令可以设置几个Redis服务器之间的主从关系。主服务器保存了一个复制积压缓冲区和复制偏移量,并通过心跳检测机制来发现主从服务器断连或者命令丢失的问题。当出现主从数据不一致时,主服务器可以根据缓冲区和偏移量重发丢失的命令。
    复制积压缓冲区,实际上就是一个队列,按字节将所有需要同步的命令一一保存复制偏移量,保存接收了多少字节命令,主从偏移量不一致说明数据不同步
    哨兵(Sentinel)哨兵是一个特殊的Redis服务器,不进行数据存储服务,只负责保证Redis主从模式的高可用性。哨兵监测并记录每个主从服务器的工作状态,并对服务器进行故障转移,尤其是对主服务器故障进行特殊处理。
    哨兵与所有主从服务器都建立“命令连接”和“订阅连接”订阅连接用来发现其他的哨兵哨兵与其他哨兵之间建立命令连接,不需要建立订阅连接
    Leader Sentinel选举哨兵也可以采用主从模式配置,主服务器是通过分布式一致性协商算法——Raft算法选举产生的。Raft动画详见参考资料,浅显易懂。Leader选举是采用先占坑先得的选举方式,每次选举时直接向其他哨兵申请成为该哨兵唯一的局部leader,成为半数以上哨兵局部leader的哨兵将会成为新leader。如果没有选出leader,则进行下一轮选举。Leader选举实现的核心思想是谁最先发现主服务器下线,综合其与其他哨兵的传输延迟低,谁就最可能成为下一任主服务器。
    主从模式故障转移监测到主服务器故障时,哨兵询问其他监视这个服务器的其他哨兵,并收集下线投票,确认其是否下线。当确认主服务器下线后,哨兵从这个主服务器的从服务器中挑选一个成为新的主服务器。筛选的核心思想是服务正常,最近有通信,数据较新。筛选条件:
    ......

    共8张


  • 键空间Redis的数据库包含了键空间结构,可以理解为JVM保存了所有对象的引用。键空间是一个字典结构dict,包含了所有key的引用,每个key有指针指向对应的value,value可以是string、list、hash等类型的对象。
    过期数据库包含expires字典,保存了所有key的过期时间。Redis采用惰性删除+定期删除处理过期的key:
    惰性删除 在任何命令执行前确认是否已过期,如果过期了就先把key(和value)删除定期删除 定期随机从expires字典中抽取一定数量key检查是否过期,并删除过期keyexpire、expireat等命令最终都会被转为pexpireat命令。
    持久化RDB持久化本质上就是将内存中的Redis数据dump出来一份文件,一般定期执行,恢复时可能会丢一些数据。AOF持久化本质上是命令重放,但也不是实时写入,如果服务挂了会丢失写缓冲区里的命令,写入频率比RDB高,丢失的数据相对很少。还可以通过AOF重写,直接根据数据库内容“生成”命令,压缩命令数量(如将多条SADD命令合并,或将数据的写入、删除命令抵消)。也就是说,不是持久化命令,而是持久化状态。
    RDB 的优点
    RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
    ......


  • 基础字符串结构SDS我们知道,Redis数据结构中最基础的内容是字符串,而字符串的基础结构是字符数组。由于Redis中可以被修改的字符串通常使用一种名为简单动态字符串(simple dynamic string, SDS)的结构。SDS的结构
    struct sdshdr {
    // 已使用长度
    int len;
    // 未使用长度
    int free;
    ......

  • Redis介绍
     3     2019-02-14 15:52:23

    Redis
    Redis是什么
    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。——搜狗百科
    日常工作(不包括优化、策略选择、异常排查等)可以不用过于深入了解,只需要把Redis理解为:一个高性能、适用于多种数据类型但容量相对较小的存储系统;数据保存在内存中,能很好地支持数据过期;单进程,所有命令都是原子操作,可以搭建分布式集群;支持主从同步,可保存二进制数据。
    官方网站https://redis.io/
    Redis的适用场景Redis最大的特点就是高性能、容量相对小、原生支持失效,因此最常用的场景是用于缓存,在进行读写频繁或写少读多的操作时加在核心存储之前,如:
    ......


  • Redis部署
     3     2018-09-22 01:35:52

    环境Linux(CentOS)系统tcl工具(否则后期make test时报错:You need tcl 8.5 or newer in order to run the Redis test),tcl安装过程:
    wget http://downloads.sourceforge.net/tcl/tcl8.6.3-src.tar.gz // 下载,注意版本
    tar -zxvf tcl8.6.3-src.tar.gz // 解压
    cd tcl8.6.3/unix/
    ./configure // 检查配置
    make && make install // 编译、安装,可以切换目录
    ......