Redis详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

11.1.1什么是Redis2012-12-1416:48刘鑫人民邮电出版社我要评论(0)《高性能网站构建实战》第11章高性能的key-value数据库Redis上一章我们介绍了常用的数据缓存开源软件Memcache,该软件常用在要求快速、大量显示数据的环境中,比如需要时时显示数据的请求页面。Memcache可以池的方式进行扩展来存储更多的数据,经过二次开发,其持久化特性可以保证数据不会因为突发事故而丢失。本章介绍Redis数据库及其具体应用。11.1Redis简介11.1.1什么是RedisRedis是一种高性能的key-value数据库。和Memcached类似,不过Redis支持存储的value类型更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove、取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,Redis的数据都缓存在内存中。但是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步;而默认情况下,Memcache不会把数据写入文件中。11.1.2Redis的数据结构11.1.2Redis的数据结构下面分别介绍Redis支持的4种数据类型。1.string(字符串)string是最简单的类型,一个key对应一个value,支持的操作与Memcached支持的操作类似,但功能更加丰富。Redis采用sdshdr和sds结构封装字符串,字符串相关的操作在源文件sds.h/sds.c中实现。sdshdr数据结构定义如下:1.typedefchar*sds;2.structsdshdr{3.longlen;4.longfree;5.charbuf[];6.};list(双向链表)list是一个列表结构,主要功能是push、pop、获取一个范围的所有值等。操作中的key可以理解为链表的名字。对list的定义和实现在源文件adlist.h/adlist.c中进行,相关的数据结构定义如下:1.//list迭代器2.typedefstructlistIter{3.listNode*next;4.intdirection;5.}listIter;6.//list数据结构7.typedefstructlist{8.listNode*head;9.listNode*tail;10.void*(*dup)(void*ptr);11.void(*free)(void*ptr);12.int(*match)(void*ptr,void*key);13.unsignedintlen;14.listIteriter;15.}list;16.Setc(集合)set是集合,与数学中的集合概念相似,相关操作包括添加删除元素、对多个集合求交并差等。操作中的key可以理解为集合的名字。在源文件dict.h/dict.c中实现对hashtable的操作,数据结构定义如下:1.//dict中的元素项2.typedefstructdictEntry{3.void*key;4.void*val;5.structdictEntry*next;6.}dictEntry;7.//dict相关配置函数8.typedefstructdictType{9.unsignedint(*hashFunction)(constvoid*key);10.void*(*keyDup)(void*privdata,constvoid*key);11.void*(*valDup)(void*privdata,constvoid*obj);12.int(*keyCompare)(void*privdata,constvoid*key1,constvoid*key2);13.void(*keyDestructor)(void*privdata,void*key);14.void(*valDestructor)(void*privdata,void*obj);15.}dictType;16.//dict定义17.typedefstructdict{18.dictEntry**table;19.dictType*type;20.unsignedlongsize;21.unsignedlongsizemask;22.unsignedlongused;23.void*privdata;24.}dict;25.//dict迭代器26.typedefstructdictIterator{27.dict*ht;28.intindex;29.dictEntry*entry,*nextEntry;30.}dictIterator;dict中table是dictEntry指针的数组,数组中每个成员为hash值相同的元素的单向链表。set是在dict的基础上实现的,指定了key的比较函数为dictEncObjKeyCompare,若key相等则不再插入。zset(排序set)zset是set的升级版本,在set的基础上增加了一个顺序属性,这一属性可以指定添加修改元素的时候,每次指定后,zset会自动按新的值调整顺序。zset可被看作有两列数据的mysql表,一列数据存value,另一列数据存顺序。操作中的key可以理解为zset的名字。1.typedefstructzskiplistNode{2.structzskiplistNode**forward;3.structzskiplistNode*backward;4.doublescore;5.robj*obj;6.}zskiplistNode;7.typedefstructzskiplist{8.structzskiplistNode*header,*tail;9.unsignedlonglength;10.intlevel;11.}zskiplist;12.typedefstructzset{13.dict*dict;14.zskiplist*zsl;15.}zset;zset利用dict来维护key→value的映射关系,用zsl(zskiplist)保存value的有序关系。zsl实际是不稳定的多叉树,每条链上的元素从根节点到叶子节点保持升序排序。11.1.3Redis性能11.1.3Redis性能官方数据指出,SET操作每秒钟可进行110000次,GET操作每秒钟可进行81000次。实验中用20个客户端对Redis服务器进行写操作。当数据库中的数据达到GB数据级时,写速度有明显下降。可能的原因包括:1.Redis需要将数据同步到磁盘,占用了大量的CPU和内存;2.key的数量增大,需要重新布局;3.消息队列中还存在大量请求,致使请求阻塞。11.2.1Redis的安装11.2Redis的实践11.2.1Redis的安装先安装Tcl-8.5.10。tarxzftcl8.5.10-src.tar.gzcdunix./configure编译软件包:make安装软件包:sudomakeinstallRedis的代码遵循ANSI-C而编写,可以在所有POSIX系统(如Linux,*BSD,MacOSX,Solaris等)上安装运行。而且Redis并不依赖任何非标准库,也没有必需添加的编译参数,所以安装比较简单:tarxzfredis-2.8.8.tar.gzcdredis-2.8.8makesudomakeinstall使用make指令时有可能报错,提示没有安装Tcl-8.5.10,那以只需安装Tcl-8.5.10即可。把缺省配置文件cp到etc目录下,并编辑sudocpredis.conf/etc/sudogedit/etc/redis.confmake命令执行完成后,会在当前目录下生成若干个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,其作用如下。redis-server:Redis服务器的daemon启动程序。redis-cli:Redis命令行操作工具。当然,也可以用telnet根据纯文本协议来操作。redis-benchmark:Redis性能测试工具,测试Redis在系统及当前配置下的读写性能。redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。运行Redis前需要在/etc/sysctl.conf文件中添加vm.overcommit_memory=1代码,否则会出现如下警告:sudogedit/etc/sysctl.conf1.#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect.如果内存情况比较紧张,需要设定内核参数:echo1/proc/sys/vm/overcommit_emory,参数说明如下。overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。0表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请通过;否则,内存申请失败,并把错误信息返回给应用进程。1表示内核允许分配所有的物理内存,而不管当前的内存状态如何。2表示内核允许分配超过所有物理内存和交换空间总和的内存。11.2.2Redis的配置(1)11.2.2Redis的配置(1)以下是对Master服务器的配置。1.#Redisconfigurationfile2.daemonizeyes3.pidfileredis.pid4.port63795.bind10.13.25.126.#unixsocket/tmp/redis.sock7.timeout3008.loglevelnotice9.logfile./log/redis.log10.databases1611.save86400112.rdbcompressionyes13.dbfilenamedump.rdb14.dir./15.#slaveofmasteripmasterport16.#masterauthmaster-password17.slave-serve-stale-datayes18.#requirepassfoobared19.#Commandrenaming.20.#rename-commandCONFIG21.#maxclients12822.maxmemory5gb23.maxmemory-policyvolatile-lru24.maxmemory-samples325.appendonlyno26.#appendfilenameappendonly.aof27.#appendfsyncalways28.appendfsynceverysec29.#appendfsyncno30.no-appendfsync-on-rewriteno31.slowlog-log-slower-than1000032.slowlog-max-len102433.vm-enabledno34.#vm-enabledyes35.vm-swap-file/tmp/redis.swap36.vm-max-memory037.vm-page-size3238.vm-pages13421772839.vm-max-threads440.hash-max-zipmap-entries51241.hash-max

1 / 59
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功