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

  • 工作过程
  1. 检查用户请求的数据在缓存中是否存在,如果存在的话直接把请求的数据返回,无需查询数据库
  2. 如果请求的数据在缓存中找不到,这时候再去查询数据库,返回请求数据的同时,把数据存储到缓存中一份
  3. 保持缓存的“新鲜性”,每当数据发生变化的时候(修改、删除),要同步更新缓存信息,确保用户不会取到旧的数据
  • 特点
  • 协议简单
  • 基于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