动态字符串SDS 是 Redis 众多数据结构中最简单的一个,但其实也并不那么简单…
Redis 使用了自主定义的 SDS数据结构重新实现 字符串 相关操作,这一看似多此一举的操作,实际上设计及其精妙…
与 普通 C 字符串相比,其突出特点如下:
more >>☆☆ [正在找工作的程序猿] ☆☆ !~ 不懂健身的吉他手成为不了好的程序猿!!!
几乎所有主流编程语言都提供了与 REDIS 服务端交互的 cli 平台,基于 TCP 构建的 通讯协议 RESP…
本文我们从 redis-cli 原生客户端的角度进行剖析 Redis 客户端功能流程
以及 RESP 协议
另外,由于 redis-cli 使用了 linenoise库
( linenoise 是一个命令行编辑库,由 Redis 设计者 Antirez 发布的一个用于替代 readline 的工具库,广泛应用于 Redis、MongoDB、Android等 ),而其中有 tty 限制 不能直接使用 gdb/cgdb 进行调试,建议使用 打印调试数据至日志文件 的方式。
当然,也可以通过 固定 src/redis-cli.c: line 1445
变量值的方式跳过 linenoise 函数,再使用 gdb/cgdb 进行调试
linenoise
是一个命令行编辑库( line editing library ),由 Redis 设计者 Antirez 发布的一个用于替代 readline 的工具库。目前 linenoise 已经使用在 Redis、MongoDB、Android 等 应用上了
我们平时在使用 redis-cli 等工具的时候经常会发现输入命令的时候会有一些提示信息,这就是 linenoise 这个库比较直观的功能。我们这次主要探讨 linenoise 的 使用示例
以及 源码解析
工欲善其事,必先利其器
Redis 作为单进程网络编程的巅峰
, 除却 大家都已经熟知的 持久化高效缓存、丰富的存储结构、高可用集群、原子性操作、publish/subscribe、通知 等特性,另外还有很多值得借鉴的优秀设计,比如 hyperloglog(基量统计算法)
、zmalloc内存分配优化(jemalloc 和 tcmalloc)
、multi事务
、链地址 hash
、zskiplist 跳跃表
、ziplist 压缩表
等。
再加上 微博拥有国内最大的 Redis 集群资源(~手动狗头~)
和 平时的一些工作需求,不可避免对 Redis 产生极大的兴趣,更更更为优秀的是,redis 源码极其精简,整个核心源码只有 7~8w 行 ~~~
在之前的线程机制中我们提到辅助线程,其中
LRU
和ASSOC扩容
就是其中比较典型的辅助功能,分别 负责 缓存回收、存储扩容
LRU,Least Recently Used
最近最少使用的一种页面置换算法。算法根据数据的历史访问记录的时间来进行淘汰数据,其核心思想是 如果最近没有被访问过,那么将来被访问的概率也比较低,所以被删除的几率就更大
另外,除了 LRU 还有另外两种常用的缓存 页面置换算法:FIFO
(先进先出,先来先服务)、LFU
(最近最少使用算法,跟 LRU 的区别为 LFU是按照访问次数进行处理 而 LRU是访问时间)
LRU的实现原理比较简单:维护一个链表,INPUT操作的时候如果对应元素在链表已经存在,则把UPDATE后将该元素放到链表顶端,如果不存在则INSERT后将元素放到链表顶端;SELECT操作的后将查询到的元素移动到链表顶端;这样就能确保不常用的数据在链表底端。
但是如果你觉得 MEMCACHED的LRU机制 也是这么单纯的话,就 too young, too simple...
作为 缓存,永远都脱离不了 增删改查 这一基本的 API,而这点儿也正是好多人刚开始看源码最感兴趣的部分,此次我们就
消息解析
、增删改查
、消息响应
等方面进行分析
本章承接 状态机 conn_read
逻辑(不熟悉的可以先查看 http://www.web-lovers.com/memcached-source-threads.html 状态机
部分),功能型的代码逻辑比较清晰,我们此次跟随着代码逻辑进行解析
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true