文章目录
Redis 简介
一、什么是Redis
简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
二、为什么要用 redis/为什么要用缓存
主要从“高性能”和“高并发”这两点来看待这个问题。
高性能:
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
三、redis 和 memcached 的区别
Memcached
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
- redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
- 集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
- Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。
来自网络上的一张图,这里分享给大家!
四、为什么要用 redis 而不用 map/guava 做缓存?
缓存分为本地缓存和分布式缓存两种类型。
以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
使用 Redis 或 Memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。
缺点是需要保持 Redis 或 Memcached服务的高可用,整个程序架构上较为复杂。
| Redis | Map |
|---|---|
| Redis 可以用几十 G 内存来做缓存 | Map 不行,一般 JVM 也就分几个 G 数据就够大了而且JVM 内存太大很容易挂掉的 |
| Redis 的缓存有着集群模式、持久化等更多特性 | Map 是内存对象,程序一重启数据就没了 |
| Redis 可以实现分布式的缓存,有丰富工具管理缓存数据 | Map 只能存在创建它的程序里,本地缓存也不方面查看及修改 |
| Redis 可以处理每秒百万级的并发,是专业的缓存服务,有丰富的 API | Map 只是一个普通的对象 |
| Redis 缓存有过期机制,redis 是 C 写的,稳定性和性能更好 | Map 不行,一般 JVM 也就分几个 G 数据就够大了 |
在结合场景来说
redis可以独立部署,这样网站代码更新后redis缓存的数据还在,本地内存每次网站更新重启项目都会释放掉,并且数据存到redis,多个项目间可以共享缓存数据,如果是本地内存是无法跨项目共享的。redis提供的有很多数据结构,方便操作,比如 hash set list sort-set等,在某些场景下操作起来比map方便。
五、 Redis 为什么是单线程的
官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)Redis利用队列技术将并发访问变为串行访问
1)绝大部分请求是纯粹的内存操作(非常快速)2)采用单线程,避免了不必要的上下文切换和竞争条件
3)非阻塞IO优点: