redis设计与实现概要.ppt

  1. 1、本文档共87页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
redis设计与实现概要

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 迭代器首先迭代字典的第一个哈希表, 然后,如果 rehash 正在进行的话, 就继续对第二个哈希表进行迭代。 当迭代哈希表时, 找到第一个不为空的索引, 然后迭代这个索引上的所有节点。 当这个索引迭代完了, 继续查找下一个不为空的索引, 如此循环, 一直到整个哈希表都迭代完为止。 * * * * * * * * * * * 有序集 编码的切换 对于一个 REDIS_ENCODING_ZIPLIST 编码的有序集, 只要满足以下任一条件, 就将它转换为 REDIS_ENCODING_SKIPLIST 编码: ziplist 所保存的元素数量超过服务器属性 server.zset_max_ziplist_entries 的值(默认值为 128 ) 新添加元素的 member 的长度大于服务器属性 server.zset_max_ziplist_value 的值(默认值为 64 ) SKIPLIST编码的有序集 zset 同时使用字典和跳跃表两个数据结构来保存有序集元素。 typedef struct zset { dict *dict; // 字典 zskiplist *zsl; // 跳跃表 } zset; 有序集 SKIPLIST编码的有序集 有序集 SKIPLIST编码的有序集 通过使用字典结构, 并将?member?作为键,?score?作为值, 有序集可以在?O(1)?复杂度内: 检查给定?member?是否存在于有序集(被很多底层函数使用); 取出?member?对应的?score?值(实现?ZSCORE?命令)。 另一方面, 通过使用跳跃表, 可以让有序集支持以下两种操作: 在?O(logN)?期望时间、?O(N)?最坏时间内根据?score?对?member?进行定位(被很多底层函数使用); 范围性查找和处理操作,这是(高效地)实现?ZRANGE?、ZRANK?和ZINTERSTORE等命令的关键。 通过同时使用字典和跳跃表, 有序集可以高效地实现按成员查找和按顺序查找两种操作。 redis功能实现 内部运作机制 Redis功能 Redis功能实现 Redis功能实现 事务; 订阅与发布。 事务 Redis事务介绍 事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。 Redis 通过?MULTI?、DISCARD?、EXEC和WATCH四个命令实现事务功能。 事务 开始事务 MULTI 命令的执行标记着事务的开始。 这个命令唯一做的就是, 将客户端的 REDIS_MULTI 选项打开, 让客户端从非事务状态切换到事务状态。 事务 命令入队 当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行。 但是, 当客户端进入事务状态之后, 服务器在收到来自客户端的命令时, 不会立即执行命令, 而是将这些命令全部放进一个事务队列里, 然后返回 QUEUED , 表示命令已入队。 事务 执行事务 如果客户端正处于事务状态, 那么当 EXEC 命令执行时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令: 最先入队的命令最先执行, 而最后入队的命令最后执行。 事务 带 WATCH 的事务 WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。 事务 WATCH 命令的实现 在每个代表数据库的 redis.h/redisDb 结构类型中, 都保存了一个 watched_keys 字典, 字典的键是这个数据库被监视的键, 而字典的值则是一个链表, 链表中保存了所有监视这个键的客户端。 事务 WATCH 的触发 如果某个客户端对 key1 进行了修改(比如执行 DEL key1 ), 那么所有监视 key1 的客户端, 包括 client2 、 client5 和 client1 的 REDIS_DIRTY_CAS 选项都会被打开, 当客户端 client2 、 client5 和 client1 执行 EXEC 的时候, 它们的事务都会以失败告终。 订阅与发布 频道的订阅与信息发送 订阅:

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档