Redis设计与实现-附加功能

发布与订阅
  1. redis订阅分为精准的频道订阅与模糊匹配的模式订阅;
  2. redis将全部频道的订阅关系都保存在服务器状态pubsub_channels字典里,键是频道名,值是一个记录全部订阅此频道的客户端链表,退订则是今后链表中删除客户端,若是删除后链表为空,则在字典中删除此键;
  3. 全部模式订阅关系都保存在pubsub_patterns链表中,表中的每一个节点包含一个pubsub pattern结构,这个结构的client属性记录订阅的客户端,pattern属性记录被订阅的模式;
  4. 当客户端执行publish命令将消息发送给频道channel的时候,服务器须要执行如下动做:
    • 将该消息发送给对应该频道的全部订阅者;
    • 若是有一个或多个模式与频道匹配,则将消息也发送给这个pattern模式的订阅者
  5. redis 2.8新增pubsub命令,pubsub channel 查看当前被订阅的频道数量;pubsub numsub 查看具体频道对应的订阅客户端数;pubsub numpat 查看被订阅模式的数量
事务
  1. multi set exec 一次性按先进先出顺序执行一批命令;
  2. watch命令因为在exec执行前监视任意数量键的值变化状况,watched_keys字典中的键为被监视的键,而值为全部监视该键的客户端;
  3. 全部对数据库进行修改的命令如set、lpush、sadd、zrem、del、flushdb等在执行以后都会对watched_key字典中的键进行检查,若有有对应的键被修改,则会将监视该键的客户端的redis_dirty_cas标识打开,这样当服务器开始执行客户端发来的exec时会检查此标识,若是此标识被打开则拒绝执行事务;
  4. redis事务的acid特性:
    • 原子性:命令按FIFO顺序执行,包括保障原子性,可是若是中途某个命令出现错误,整个事务会不予理会,继续执行直到全部命令完成,不支持事务回滚;
    • 一致性:任务状态redis执行事务时都不会包含非法或无效的错误数据;
    • 隔离性:redis使用单线程方式来执行事务,保障隔离性;
    • 持久性:有redis的持久化模式决定
所以redis的事物老是具备acid中的原子性、一致性和隔离性,当服务器运行在aof持久化模式下而且appendfsync选项的值为always时,事务也具备持久性。
 
以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/ 
 
lua环境
  1. redis在服务器内对lua环境进行了一些修改,如建立环境、载入函数库、建立全局表格、改造随机函数、排序辅助函数、错误报告函数、保护全局环境参数等;
  2. lua环境经过伪客户端与命令执行器就行通讯;
  3. lua_scripts里存储了lua脚本的sha1校验和以及lua脚本体,使得被执行一次的eval的lua脚本能够经过evalsha直接调用sha1校验和就能再次执行;
  4. script flush 状况服务器lua_scripts字典中保存的脚本、script exists检查sha1校验和赌赢的脚本是否存在;script load为脚本建立函数并保存到lua_scripts中;
  5. 服务器在执行lua脚本前会设置一个超时钩子,当超时出现时能够电泳script kill让钩子来中止正在运行的脚本;
  6. eval、script flush、script load能够像普通redis命令同样传播到从服务器,而evalsha有可能会先转换成等效的eval命令后在传播到从服务器。
排序
  1. sort命令经过将被排序的键包含的元素载入到数据里,利用快速排序算法实现排序;
  2. sort 集合键 alpha(按字符串方式,默认为数字)asc/desc(升序/降序) by(其余键做为权重) limit(只保留排序结果集中指定的元素)get(根据模式过滤出匹配的键) store 键(将排序结果保存到指定的键里);
  3. 出get外,其余选项的摆放位置不影响sort命令的排序结果;
二进制位数组
  1. redis使用sds并逆序来保存位数;
  2. setbit key 偏移位置  0/1  设置指定偏移位置上的0或1;
  3. getbit key 偏移位置 获得指定偏移位置的0或1;
  4. bitcout使用查表算法以及swar算法来优化获取位数组中的非0二进制位的数量;
  5. bitop and/or/xor/not 使用C语言内置的位操做来实现
慢查询日志
  1. redis慢查询日志功能用于记录执行时间超过给定时长的命令请求,包括slowlog-log-slower-than微秒制定超过改值会被记录到日志上,slowlog-max-len指定服务器最多保存多少条慢查询日志;
  2. 慢查询日志被保存在slowlog链表中,表中的每一个节点包含一个slowlogEntry结构表明一条慢查询日志;
监视器
    1. 客户端执行monitor命令给服务器将本身变成一个监视器,服务器将这个客户端的redis_monitor标识打开并把客户端添加到monitors链表的表尾;
    2. 服务器在每次处理命令请求以前,都会调用replicationFeedMonitors函数将被处理的命令请求相关信息发送给monitors链表中的全部监视器;

以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/ redis

相关文章
相关标签/搜索