Redis工作原理
Redis
- 介绍
- Redis是一个key-value存储系统,它支持的value类型相对较多,包括string、list、set和zset,这些数据都支持push/pop/add/remove及交并补等操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序。为了保证效率,数据是缓存在内存中的,Redis会周期性的把数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步
- Redis支持丰富的数据类型,最为常用的数据类型主要有五种:String、Hash、List、Set和Sort Set,Redis通常将数据存储到内存中,或被配置为使用虚拟内存,Redis有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化,一是RDB快照方式,将内存中的数据不断写入磁盘, 二是使用类似MySql的AOF日志方式,记录每次更新的日志,前者性能较高,但是可能会引起一定程度的数据丢失,后者相反,Redis支持即将数据到多台子数据库上,这种特性提高读取数据性能非常有益
- 工作方式
- 多样的数据模型
- 持久化
- 主从同步
- 分布式可扩展性
- 刚开始的版本可以在客户端实现,也可以使用代理;后来Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。Redis Cluster的分布式存储结构,其中节点与节点之间通过二进制协议进行通讯,节点与客户端之间通过ascii协议进行通信,在数据的放置策略上,Redis Cluster将整个key的数值域分成16384个哈希槽。每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点就是16384
扩展之Memcached
- 工作过程
- 检查用户请求的数据在缓存中是否存在,如果存在的话直接把请求的数据返回,无需查询数据库
- 如果请求的数据在缓存中找不到,这时候再去查询数据库,返回请求数据的同时,把数据存储到缓存中一份
- 保持缓存的“新鲜性”,每当数据发生变化的时候(修改、删除),要同步更新缓存信息,确保用户不会取到旧的数据
- 特点
- 协议简单
- 基于libevent(Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库)的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
- 分布式的可拓展性
- Memcached的分布式不是在服务端实现的,而是在客户端的应用中实现的,即通过内置算法制定目标数据的节点
Memcached与redis对比
对比内容 | 具体阐述 |
性能 | 平均每一个核Redis在存储小数据时比Memcached性能更高,100k以上时Memcached性能高于redis |
内存空间和数据量大小 | Memcached可以修改最大内存,采用LRU算法,Redis增加了VM的特性,突破了物理内存的限制 |
操作方便性 | MemCached结构数据单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端进行丰富的操作,这样可以减少网络IO次数和数据体积 |
可靠性 | Memcached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的,Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价 |
应用场景 | Memcached:动态系统中减轻数据库的负载,提升性能,作缓存,适合多读少写,大数据量的情况 Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统 |
单个key-value的大小 | Memcached最大支持1MB;Redis最大支持512MB |