认识redis

一:redis简介

redis是一个开源、遵守BSD协议的基于内存的数据结构存储系统,可用作数据库、缓存和消息代理。redis支持的数据结构包括string, hashes, lists, sets, sorted sets(可范围查询), hyperloglogs, geospatial indexes(可半径查询和支持流)。redis包含内置复制,Lua脚本,LRU驱逐,事务以及不同级别的硬盘持久化,并通过Redis Sentinel提供高可用性,使用Redis Cluster自动分区。

为了保证redis杰出的性能,redis使用内存数据集。根据使用场景不同,你可选择每隔一段时间将数据持久化到硬盘或者通过追加日志的方式实现持久化。不过,如果你只需要功能丰富的网络化内存存储,可以禁用持久化选项。

redis支持主从异步复制,快速且非阻塞的首次同步,以及网络分割部分数据重新同步时可实现自动重连。

二、redis与memcached

redis和memcached都属于in-memory和key-value型数据库,二者都主要用于分布式缓存服务中,memcached由Brad Fitzpatrick于2003年开发,redis由Salvatore Sanfilippo于2009年开发,在一定程度上,redis借鉴了memcached的开发经验,因此在功能多样性和灵活性上要优于memcached,但是redis的复杂度也要高于memcached。redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较:

  1. Redis支持服务器端的数据操作
    Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

  2. 内存使用效率对比
    使用简单的key-value存储的话,Memcached内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

  3. 性能对比
    由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

三、redis源码结构

redis源码目录

图片.png

deps

depends的缩写,依赖库

图片.png

Hiredis是Redis数据库的C接口。这块和Redis相关性比较大。

Jemalloc是内存管理库。很多开源项目不使用glibc自带的ptmalloc,而是使用Jemalloc或者Tcmalloc这类更高效的内存管理库。

Linenoise是一个命令行编辑库。这个正是我们之前预估的Redis基础功能之一。它的相关资料可见https://github.com/antirez/linenoise

Lua脚本引擎。Redis内嵌Lua脚本引擎,那么说明Redis需要Lua语言的解析能力。那么可以进一步猜测应该是用户可以定制Lua脚本让Reids去执行,这相当于Redis开放了一个非常自由的接口供外部使用。

src

redis源码目录

tests

它是测试相关的目录。里面都是各种测试Redis的脚本。可见测试脚本是一些后缀为tcl的文件。它的内容这是一种被广泛使用的脚本测试语言——TCL语言

utils

从名称看出为一些工具

相关文件

00-RELEASENOTES
非稳定版本redis的占位符文件

BUGS
内置向redis提bug的链接

CONTRIBUTING
相关社区链接

COPYING
版权声明

install,readme.md
redis的安装和使用命令简介

redis.conf,sentinel.conf
Redis的配置和主从配置

Runtest、Runtest-cluster、Runtest-sentinel
分别对应于“整体测试”、“分布式测试”和“主从切换测试”的脚本

MANIFESTO
Redis 宣言,Redis 的作者 antirez(Salvatore Sanfilippo)列举了 Redis 的七个原则,以向大家阐明 Redis 的思想。

makefile

makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.
在makefile文件中我们可以看到

图片.png

即核心文件为src/Makefile文件,执行命令为进去src然后make命令

在src中的makefile文件中,最开始是一些编译参数和依赖项的定义,然后是内存分配

图片.png

非ARM系统下,linux默认选择的内存管理库是jemalloc

核心为

图片.png

上面脚本可以见这个Makefile可以编译出6个不同的最终产物。
其中最核心的应该是REDIS_SERVER_NAME对应的编译内容。我们从其需要链接的文件(REDIS_SERVER_OBJ中的内容)来看,程序的入口函数main应该位于server.o文件中。

你可能感兴趣的:(认识redis)