目录
1. 什么是redis?
Redis,就是一种特别快的“数据库”,它把数据存在内存里,让你能超级快地存和取数据。其实就是缓存。
举2个例子:
— Redis,就像是一个超快速的记事本,它能够帮你快速地记录和查找信息。
— 比如说,你去超市购物,每买一样东西就记在记事本上。这样,当你需要知道买了什么或者花了多少钱时,只需要打开记事本一看就清楚了,而不需要翻遍所有的购物袋。
— 再比如,你在网上看视频,Redis就像是一个智能的“最近播放”列表,能记住你最近看过哪些视频,这样下次想看时就能快速找到,而不需要从一大堆视频中慢慢搜索。
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
Redis 虽说是内存数据库,但是 Redis 其实是会把缓存数据保存到硬盘的,只要保存缓存数据的文件没有丢,缓存数据自然就能恢复。
Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。
1.1 为什么使用redis作为缓存?
缓存技术确实有很多种,比如Memcached、Varnish等,但选择Redis作为缓存解决方案的原因有多个,比较一下各种缓存技术。
1.1.0 数据库(MySQL)与 redis
Redis能够提供比传统数据库更快的数据读取速度,主要是由于存储介质差异、数据结构优化、I/O模型差异、CPU缓存友好性、单线程与多线程差异、持久化与缓存差异以及主从复制与分布式差异等多方面因素共同作用的结果。
1. 存储介质不同(408选手应该都懂hh)
从计算机组成原理的角度来看:Redis作为内存数据库,将数据直接存储在RAM中,而RAM的访问速度远高于磁盘。数据库通常将数据存储在磁盘上,即使是内存数据库,也可能需要将数据同步到磁盘以确保持久性。因此,从Redis中读取数据时,可以避免磁盘I/O的延迟,从而提高性能。
2. 数据结构优化
Redis使用高效的数据结构来存储数据,如哈希表、跳跃表等,这些数据结构能够快速地进行数据的查找、插入和删除操作。相比之下,数据库可能使用更为复杂的数据结构(如B树、索引等),在数据操作上可能不如Redis高效。
3. I/O模型差异
Redis采用非阻塞I/O模型(如epoll、kqueue等),能够处理大量并发连接,同时保持较低的系统开销。这种模型使得Redis能够在高并发环境下保持较低的延迟。而数据库通常采用阻塞I/O模型,在高并发场景下可能会受到I/O瓶颈的限制,导致性能下降。
4. CPU缓存友好性
Redis的设计注重CPU缓存的利用,尽量减少CPU缓存的 miss rate(未命中率),从而提高数据访问性能。而数据库系统可能更注重数据的持久性和一致性,导致其设计可能不是那么CPU缓存友好。
5. 单线程与多线程差异
Redis采用单线程模型处理请求,避免了多线程环境下的线程切换和竞态条件问题,简化了开发和维护的复杂性。这种模型减少了上下文切换的开销,提高了CPU的利用率。而数据库系统通常采用多线程模型,在处理请求时可能会涉及到线程切换和锁竞争等问题,影响性能。
6. 持久化与缓存差异
Redis作为缓存系统,主要承担数据读写和缓存任务,可以通过合理的配置和策略,将持久化操作的影响降到最低。而数据库系统通常承担着数据持久化的任务,需要在保证数据安全性和一致性的同时进行数据读写操作。
7. 主从复制与分布式差异
Redis支持主从复制和哨兵模式,可以实现数据的复制和故障恢复,提高了系统的可用性和容错能力。这种模式在Redis中实现得更为简单和高效。而数据库在分布式环境下可能需要更复杂的数据同步和一致性保障机制,这可能会增加额外的性能开销。
1.1.1 Redis 与 Memcached
1. 共同点
1.都是基于内存的数据库,一般都用来当做缓存使用。
2.都有过期策略。
3.两者的性能都非常高。
2. 区别
1.速度快:Redis基于内存操作,读写速度非常快,能够显著提升数据访问性能。
2.Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
3.Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
4.Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
5.高可用和分布式:Redis可以通过主从复制、哨兵模式和集群等方式实现高可用性和水平扩展,满足大规模部署的需求。
6…Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持;
1.2 为什么用 Redis 作为 MySQL 的缓存?
主要是因为 Redis 具备**「高性能」和「高并发」**两种特性。
1.2.1 高性能
假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。
如果 MySQL 中的对应数据改变的之后,同步改变 Redis 缓存中相应的数据即可,不过这里会有 Redis 和 MySQL 双写一致性的问题,后面我们会提到。
1.2.2 高并发
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。
所以,直接访问 Redis 能够承受的请求是远远大于直接访问 MySQL 的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
Redis的高并发性能得益于其高效的数据结构、非阻塞I/O模型、单线程处理、管道化和批量操作、持久化机制、主从复制和哨兵模式以及集群模式等多方面的设计和优化。这使得Redis成为构建高并发应用场景(如缓存、消息队列、实时分析等)的理想选择。
2. redis数据结构
Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
2.1 String(字符串)
字符串是Redis最基本的数据类型,可以存储文本、数字或者二进制数据。常用操作包括设置值、获取值、追加值、截取值等。应用场景包括计数器、标签、配置信息等。
2.2 Hash(哈希)
哈希是键值对的集合,适合存储对象。常用操作包括设置键值对、获取键值对、删除键值对等。应用场景包括用户信息、商品信息、缓存数据等。
2.3 List(列表)
列表是简单的字符串列表,按插入顺序排序。常用操作包括从左侧或右侧插入元素、获取指定范围的元素、删除元素等。应用场景包括消息队列、日志记录、时间线等。
2.4 Set(集合)
集合是无序且唯一的字符串集合,适合存储去重后的数据集。常用操作包括添加元素、删除元素、判断元素是否存在等。应用场景包括标签系统、好友关系、去重统计等。
2.5 Zset(有序集合)
有序集合是带有分数的字符串集合,按分数排序。常用操作包括添加元素、删除元素、获取指定分数范围的元素等。应用场景包括排行榜、地理位置信息、时间事件等。
3. 总结
未完,更新中,还要学一下redis的持久化。