有了innodb buffer pool还要有redis的原因:1、redis数据结构更丰富;2、redis支持更多的数据类型;3、redis有更高的性能;4、redis有更大的内存容量。redis数据结构更丰富是指redis支持多种复杂的数据结构。
一、有了innodb buffer pool还要有redis的原因
1、redis数据结构更丰富
Redis支持多种复杂的数据结构(如哈希、链表等),并且它支持复杂的操作和查询,比如可以对哈希对象进行增删改查操作,而InnoDB buffer pool只能缓存表数据和索引,不支持多种不同的数据结构和操作。
2、redis支持更多的数据类型
除了表数据之外,InnoDB buffer pool无法缓存许多其他类型的数据,而Redis可以缓存多种类型的数据,比如完整的数据结构,甚至包括文件和任何二进制数据。
3、redis有更高的性能
因为Redis是一个容纳在内存中的数据结构服务器,所以它比InnoDB buffer pool更快。Redis能够执行复杂的操作,并且在处理大型数据集时表现得更加出色。
4、redis有更大的内存容量
Redis需要的内存大小远高于InnoDB buffer pool,但它的内存控制更灵活而且容量也更大。如果要缓存的数据量很大,Redis需要的内存超过物理内存的话,还可以采用分布式架构的方式来进行横向扩展。
二、innodb buffer pool介绍
1、简介
innodb buffer pool是MySQL的内存缓存技术之一,用于缓存热数据;它可以帮助减少磁盘I/O并提高查询性能。InnoDB buffer pool不仅缓存了表数据,还缓存了索引、锁、MVCC和插入缓冲等数据;它主要适用于事务性较高的场景,如交易系统、OLTP等。
2、缓冲池Buffer Pool的作用
InnoDB 存储引擎是基于磁盘存储的。以页为单位存储数据。我们进行的增删改查操作本质上都是在操作数据页(包括读页、写页、创建新页)。由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库通常使用缓冲池来提高数据库的整体性能。Buffer Pool 就是把磁盘上的页,缓存到内存中,用于降低与磁盘直接进行IO的成本。
InnoDB 引擎在处理客户端请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中。之后就可以对页进行读写访问了。操作完页之后并不会立即释放掉其内存空间,而是将其缓存起来,将来有请求再次访问该页数据时,就可以省去磁盘IO的开销了。
3、Buffer Pool缓存什么
MySQL启动时, InnoDB 引擎向操作系统申请一块连续的内存空间,然后按照页的大小(默认16KB)划分出一个个空页,当磁盘上的页缓存到内存的 Buffer Pool 中会对空页进行填充。
缓冲池中的数据页类型有:数据页、索引页、插入缓冲(insert buffer)、自适应哈希索引、锁信息、数据字典信息等。数据页和索引页是缓冲池中的主要内容。
4、查看设置缓冲池大小
InnoDB 引擎通过 innodb_buffer_pool_size 变量查看缓冲池的大小。一般建议设置成可用物理内存的60%~80%。下面是代码示例:
mysql > show variables like 'innodb_buffer_pool_size'
通过 set global innodb_buffer_pool_size 可以修改缓冲池大小。
三、redis介绍
1、定义
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
2、作者
redis的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。
3、常用命令
就DB来说,Redis成绩已经很惊人了,且不说memcachedb和Tokyo Cabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …… 当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。值得一说的是它的少数功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。不介绍mc里面已经有的内容,只列出特殊的:
- TYPE key:用来获取某key的类型
- KEYS pattern:匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)
- RANDOMKEY:返回随机的一个key
- RENAME oldkeynewkey:key也可以改名
- RPUSH key string:将某个值加入到一个key列表末尾
- LPUSH key string:将某个值加入到一个key列表头部
- LLEN key:列表长度
- LRANGE key start end:返回列表中某个范围的值,相当于mysql里面的分页查询那样
- LTRIM key start end:只保留列表中某个范围的值
- LINDEX key index:获取列表中特定索引号的值,要注意是O(n)复杂度
- LSET key index value:设置列表中某个位置的值
延伸阅读1:redis的文件格式
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。