Redis实战(一)Redis简介

关于Redis

Redis是一款开源的高性能键值对数据库,
最初的作者是意大利的Salvatore Sanfilippo,
他的github是 antirez ,Redis的源码同样托管在Git上:
https://github.com/antirez/redis
目前,Vmware在资助着redis项目的开发和维护。

Redis的特性

键值对如dict["key"]="value"中,"key"是键名,"value"是键值,
Redis的键值不仅可以是字符串,还可以是多种数据类型,包括字符串类型,散列类型,列表类型,集合类型,有序集合类型。

Redis所有数据都存储在内存中,但同时也提供了对持久化的支持,可以将内存中的数据异步写入到硬盘中。
Redis可以为每个键设置生存时间(Time To Live,TTL),生存时间到后键会自动被删除,因此Redis可以作为缓存系统使用。

Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定的规则自动淘汰不需要的键。

Redis的列表类型键支持阻塞读取,可以实现一个高性能的优先级队列。

Redis支持"Publish/subscribe"的消息模式,可以在很多的消息场景中应用。

Redis和Memcached的区别(转自谈谈Memcached与Redis

对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的 malloc/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易 造成内存泄露;其次,频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;最后,作为系统调用,其系统开销远远大于一般函数调用。所以,为了提 高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。Redis和Memcached均使用了自身设计的内存管理机制,但是 实现方法存在很大的差异。

Memcached的内存管理机制

Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响

Slab Allocation的原理相当简单。 如图所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定Figure 1中Growth Factor的取值为1.25,所以如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。


 Memcached内存管理架构

当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添 加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个 Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如下图所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了。


 Memcached的存储空间浪费

 Redis的内存管理机制

Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将 这块内存的大小存入内存块的头部。如图 5所示,real_ptr是redis调用malloc后返回的指针。redis将内存块的大小size存入头部,size所占据的内存大小是已知的,为 size_t类型的长度,然后返回ret_ptr。当需要释放内存的时候,ret_ptr被传给内存管理程序。通过ret_ptr,程序可以很容易的算出 real_ptr的值,然后将real_ptr传给free释放内存。


Redis块分配

Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。在源码中,这个数组为zmalloc_allocations。 zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量 used_memory用来记录当前分配的内存总大小。所以,总的来看,Redis采用的是包装的mallc/free,相较于Memcached的内存管理方法来说,要简单很多。

Redis和Memcached整体对比

Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较,总结如下:

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

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

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

时间: 2024-10-07 07:36:08

Redis实战(一)Redis简介的相关文章

Redis实战之Redis + Jedis[转]

http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] 一简单使用Jedis 二池化使用Jedis 三一致性哈希 四Spring封装参考 用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redis + Jedis R

Redis实战之Redis命令

阅读目录 1. 字符串命令 2. 列表命令 3. 集合命令 4. 散列命令 5. 有序集合命令 6. 发布与订阅命令 7. 小试牛刀 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串),list(列表),set(集合),hash(散列),zset(有序集合),下面将分别对这5种数据类型的控制命令进行总结,熟话说好记性不如烂笔头,方便以后查看. 回到顶部 1. 字符串命令 Redis种的字符串有三种类型的值:字节,整数和浮点数 (1)命令列表 SE

Redis实战之征服 Redis + Jedis + Spring (二)

不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实战之Redis + Jedis Redis实战之征服 Redis + Jedis + Spring (一) Redis实战之征服 Redis + Jedis + Spring (二) Redis实战之征服 Redis + Jedis + Spring (三) 一.预期 接上一篇,扩充User属性:

Redis实战之征服 Redis + Jedis + Spring (三)

一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完成LINDEX, LLEN, LPOP, LPUSH, LRANGE, LREM, LSET, LTRIM, RPOP, RPUSH命令.其实还有一些命令,当前版本不支持.不过,这些List的操作方法可以实现队列,堆栈的正常操作,足够用了. 相关链接: Redis实战 Redis实战之Redis +

Redis实战之征服 Redis + Jedis + Spring (一)

相关链接: Redis实战 Redis实战之Redis + Jedis Redis实战之征服 Redis + Jedis + Spring (一) Redis实战之征服 Redis + Jedis + Spring (二) Redis实战之征服 Redis + Jedis + Spring (三) 前文有述,Spring提供了对于Redis的专门支持:spring-data-redis.此外,类似的还有: 我想大部分人对spring-data-hadoop.spring-data-mongodb

《Netty Zookeeper Redis 高并发实战》 图书简介

<Netty Zookeeper Redis 高并发实战> 图书简介 ## 重要的重复3遍: 本书 面试必备 + 面试必备 + 面试必备 购买链接 京东商城<Netty Zookeeper Redis 高并发实战 > <Netty Zookeeper Redis 高并发实战> 图书简介 机械工业出版社出版,尼恩编著的<Netty Zookeeper Redis 高并发实战>一书, 从操作系统底层的IO原理入手,同时提供高性能开发的实战案例,是一本高并发Jav

redis实战_01_yucong_redis基础

redis实战概要: redis简介 redis的五种数据类型: 2.1 String类型 String类型是包含很多种类型的特殊类型,并且是二进制安全的. 比如序列化的对象进行存储,比如一张图片进行二进制存储, 比如一个简单的字符串,数值等等. set和get方法: 设置值: set name yucong 取值 get name (说明 设置name多次会覆盖) 删除值:del name 使用setnx (not exist) name 如果不存在进行设置,存在就不需要进行设置了,返回0,

Redis 实战篇之搭建集群

Redis 集群简介 Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案.完全去中心化,由多个节点组成,所有节点彼此互联.Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点. Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接. 在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和

redis实战 pdf 完整版 PDF高清下载

<redis实战>深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法. 除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用 Redis 来说不可多得的参考书籍.<redis实战>一共由三个部分组成. 部分对Redis进行了介绍,说明了Redis的基本使用方法.它拥有的5种数据结构以及操作这5种数据结构的命令,并讲解了如何使用Redis去构建文章展示网站.cookie.购物车.网页缓存.数据库行缓存等一系列程序. 第二部分对R