发布与订阅
  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设计与实现-附加功能的更多相关文章

  1. Redis设计与实现——独立功能的实现

    发布和订阅 频道的订阅和退订 struct redisServer{ //键是被订阅者频道 ,键是一个链表,记录所有订阅这个频道的客户端 dict *publish_channels } 订阅实现: ...

  2. Redis(三)Redis附加功能

    一.慢查询分析 许多存储系统(例如MySql)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息 ...

  3. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

  4. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

  5. Redis设计思路学习与总结

    版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qclo ...

  6. 《Redis设计与实现》读书笔记

    <Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...

  7. 如何使用redis设计关系数据库

    目录 redis设计关系数据库 前言 设计用户信息表结构 hash存储记录 set存储id 图示 索引/查询: 1.select 查询所有记录 : 类似sql的select from table_na ...

  8. Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...

  9. 《Redis设计与实现》

    <Redis设计与实现> 基本信息 作者: 黄健宏 丛书名: 数据库技术丛书 出版社:机械工业出版社 ISBN:9787111464747 上架时间:2014-6-3 出版日期:2014 ...

随机推荐

  1. Chrome谷歌浏览器首页被改为Hao123导航怎么办|附各类解决方法【转】

    软件小子:昨天偶然间发现自己的chrome浏览器的首页被篡改成hao123导航了,要是自己设置的还无所谓,但是后面还有尾巴.顿时就火了,又是哪款软件这么流氓,太无良了,我非常确定我肯定是没有勾选什么设 ...

  2. [AYUI]QQ管家源码已经开源

    (0-50元 黑色字体     享受AY 1周的 ayui 技术问答) (50-100元 绿色字体 享受AY 15天的 ayui 技术问答) (100-150元 蓝色字体 享受AY 20天的 ayui ...

  3. 超棒的 15 款 Bootstrap UI 编辑器

    自从 2011 年 Mark Otto 和 Jacob Thornton 开发了  Bootstrap,我们第一次接触并熟知了 Bootstrap .这些都归功于  Twitter!从那以后,它就非常 ...

  4. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  5. Promising Linking

    Future/Promise 执行逻辑 scala Future 有几个要点,第一个是 tryAwait 需要借助 CowndownLatch 实现,第二个是可以在 Promise 挂载回调函数 首先 ...

  6. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  7. 专访Linux嵌入式开发韦东山操作系统图书作者--转

    CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...

  8. [PaPaPa][需求说明书][V0.2]

    PaPaPa软件需求说明书V0.2 前   言 经过第一版本的需求说明书之后,我发现博客园不让我把文章发到首页,那么对于这种情况该怎么办呢?我决定立马发布V0.2版本来挑战一下博客园的审核制度,嘿嘿 ...

  9. TP-Link路由器刷dd-wrt的linux,无线信号增强不少

    家里面TP-LINK WR841ND v3老路由器各方面都不错,双天线,300M,用了好几年了,但摆在客厅里面,最远的卧室处无线就不是很稳定了,想了各种增强解决办法: 1.更换天线.        一 ...

  10. php读取csv文件,在linux上出现中文读取不到的情况 解决方法

    今,php读取csv文件,在linux上出现中文读取不到的情况,google,后找到解决办法<?phpsetlocale(LC_ALL, 'zh_CN');$row = 1;$handle = ...