Redis精品PPT课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Redis精品PPT课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Redis 精品 PPT 课件
- 资源描述:
-
1、redis目录 背景 Redis简介 Redis是什么 功能与特点 内部实现(单机) 整体数据框架 基本数据结构 优化机制 索引优化 内存优化 持久化 主从备份 集群 Key-value数据库设计 与其他数据库对比 Redis不足 应用场景 国际上最大的redis用户是谁?在众多的NOSQL数据库与传统的关系数据库中为什么会出现redis? 传统的key-value数据库(文档,string类型)有什么不足?-数据结构需求 传统的关系型数据库IO操作性能问题?-性能需求 传统的内存数据库有什么不足?-可靠性需求背景背景 传统MySQL+ Memcached架构遇到的问题 1.MySQL需要不断
2、进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。 2.Memcached与MySQL数据库数据一致性问题。 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。 4.跨机房cache同步问题。 Redis是一个开源的使用c语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value,多种数据结构的数据库,并提供多种语言(c,c#,java,javascript,perl,php,python,ruby,scala,erlang等)的API,仅有1万行代码。 稳定版本发布于2011年3月4日。从2010年3月15日
3、起,Redis的开发工作由VMware主持。 应用场景: 1.memory cache+mysql不能完全解决web2.0 需求 (mc穿透,跨机房问题,数据一致性 2.大量数据高速读写,数据结构需求。Redis简介功能特点数据库数据存储持久化高速读写集群部署动态扩展数据一致性事务性操作主从备份Sche-me free数据结构高并发vmredis支持支持目前仅单实例部署,但通过客户端做pre-sharding方案可搭建伪集群支持支持但不支持回滚支持,但是主机迭机后,不能自动选举丛机位为主机Key-value模型,支持支持(单线程的IO复用模型)支持一定量的并发数支持 性能测试:CPU为Xeon
4、 2.80GHz *4内存为4G硬盘为一块400G SATA盘操作系统为64位CentOS 5.3版本写测试:写入500万条记录,共耗时524秒,平均每秒写入数据9542笔。磁盘上的数据文件大小134M。读测试:成功读出500万条记录,共耗时184秒,平均每秒读出数据27174笔。整体数据结构redisServerredisDB *db.01.nredisDBint iddict *dict.redisDBint iddict *dict.redisDBint iddict *dict. 结构体redisServer对应服务器,字段db指向一个指针数组,数组元素值即各个数据库的入口地址。 结构
5、体redisDB对应数据库,用以保存数据库id,字典等信息。redisDBredisDBint iddict *dict.dictdictType *typedictht *ht0dictht *ht1.dicthtdictEntry *tableusigned long sizeusigned long used.dictTypeint (*hashFunc)(void *key).dicthtdictEntry *tableusigned long sizeusigned long used. dict即字典,type是字典类型,ditcht是哈希表。 函数指针hashFunc记录用以计算
6、hash值的hash函数。DictdictdictType *typedictht *ht0dictht *ht1.dicthtdictEntry *tableusigned long sizeusigned long used.01.size-1dictEntryvoid *keyvoid *val*nextNULLNULL 双重指针table指向一个数组,该数组记录各个dictEntry (条目?)的入口地址。size为table的大小,used是dictEntry的个数。 每个dictEntry对应一个存储对象,通过key和val指针可找到对应对象的key和value。used就是存储的
7、对象总数。key和value的值存在哪?dictEntryvoid *keyvoid *val*nextredisObjectunsigned type:4void *ptr.redisObjectunsigned type:4void *ptr.keyvalue redisObject可以看成是对要存储的各种对象(如String、List、Set等)的抽象,type(长4bit的整数)用于标识该对象所属的数据结构的种类,ptr指向对象在内存中的地址。一次查询流程 由key找到碰撞链入口的时间性能是O(1)。 在碰撞链中遍历查询的时间性能是O(n)。 Redis并不是简单的key-value存
8、储,它实际上是一个数据结构服务器。不仅可以用数据库预定义的数据结构存储的value,还支持这些数据结构的基本操作。预定义的数据结构有: String List of String Set of String Sorted Set of String HashTable of String基本数据结构String String是最简单的类型,值可以是任何种类的字符串(包括二进制数据)。 String的长度是int类型,最大长度为1GB 每个对象的key都以String存储 若数据库中所有value都为String,则Redis就像一个可持久化的memcachedstruct sdshdrint
9、lenint freechar bufredisObjecttype=stringvoid *ptr.List of StringListlistNode *headlistNode *tailunsigned int len.listNodeprev = nulllistNode *nextvoid *valuelistNodelistNode *prevlistNode *nextvoid *value List基于双向链表实现。 在头部或尾部添(删)一个结点,时间复杂度为常数级别 用List支持的一些操作,如lpush(头添加)、lpop(头删除),rpush、lpop可以很容易地实现栈
10、和队列 redis向外部提供的list中listNode保存的value是String类型的listNodelistNode *prevNext = nullvoid *valueHashTable of StringdictEntryvoid *keyvoid *val*nextredisObjecttype=stringvoid *ptr.redisObjecttypehashvoid *ptr.keydictdictType *typedictht *ht0dictht *ht1. redis数据组织的整体框架就是hashtable,hashtable of string只不过将hash
11、table特例化。 它还是以key-value形式存储,对hashtable of string中对象的一次成功查询要经过两次hash。set redis支持的集合有两种,无序集合set和有序集合zset。zset的数据结构比较复杂,尚未弄懂。暂时只知道它基于有序链表和hashtable实现(用hashtable组织元素,链表实现排序),set又是基于zset实现。 zset中的元素有一个权重参数score,使得集合中的元素能够按score进行有序排列 忽略zset的权重score就可以得到set的实现 集合提供了求交集、并集、差集等操作优化机制 索引优化 随着hashtable中key-va
12、lue对的不断增多,碰撞也越来越多,碰撞链越来越长,势必会影响到查询效率。为了保持查询效率,必须调整hashtable的索引结构,使每个索引上的碰撞链长度不至于太长。 内存优化 redis是个内存数据库,同等业务量下redis占用的内存越小越好。为了占用更小的内存,必须对内存进行优化。索引优化 rehash是在hashtable大小不能满足需求,造成过多碰撞后需要进行扩容时的操作。基本思想: 新建一张索引表,新表的索引空间为原表的两倍 遍历旧表中的所有dictEntry,调用hash函数计算得到每个dictEntry在新表中的索引,并添加到新表上。当所有dictEntry都添加到新表中,启用新
13、表,丢弃旧表 索引通过hashFunc(key)%size算得,因为新表索引空间是原来的两倍,在新表中发生碰撞的概率将会小于原表。这样原本在一个碰撞链上的多个dictEntry就可能分布到不同的新索引上,新表碰撞链的平均长度(dictEntry个数/size)理论是旧表的一半rehashdictdictType *typedictht *ht0dictht *ht1.dicthtdictEntry *tablesize0usigned long used.dicthtdictEntry *tablesize=2*size0usigned long used.01.size0-1dictEntr
14、yNULLNULLdictEntry01.size-1 ht1在平时为NULL,只有当rehash时用于指向新建的table。 当在rehash时如果有新的key-value要添加到数据库,添加到新表ht1中。hashFunc(key)%sizerehashdictdictType *typedictht *ht0dictht *ht1.dicthtdictEntry *tablesize2*size0usigned long used.01.size-1dictEntryNULLNULLdictEntryNULL 当旧表ht0中的所有dictEntry都rehash到新表后,让ht指向新表,
展开阅读全文