一、为什么使用Redis
"为什么会有Redis呢?我放在map里面、list里面不是一样的嘛?反正都是放在内存里边。"
在早期单体应用时确实如此,只有一台服务进程,我们放在map中、list中都可以顺利的拿到内存中的数据,并且应用不依赖于NoSql中间件。
早期架构是非常简单的,不依赖任何中间件就可以工作,但是当应用的访问量逐渐增大时,单体应用因为承受不住大量并发访问而崩溃、故障,我们开始想办法解决这些问题,秉着人手不够就加人的办法,我们机器不够就加机器,于是出现了这样的架构
使用多台服务器来分摊用户的请求,让每台服务器都能处理与之对应的请求来提高我们程序的可用性,这样做使我们的系统可用性增强了,但问题也随之而来,在web app中,user如果首先访问application0,并在application中做完了登录;此时user的第二个请求被负载均衡到application1,我们照着原来的业务逻辑从Session中拿取user登录的信息,由于user是在application0机器登录的,appcation1能获取到application0的内存数据吗?明显不能,所以我们要在这种架构中保证每一个应用程序拿到的session都是一致的,也就是说,为了程序的正确性(用户只需要登录一次),我们必须要把这些共享的数据放在一个地方存储,所以Redis来帮助我们解决这个问题。也许你会说,"那mysql/oracle也可以做存储啊,为什么不用mysql呢?",的确,mysql也可以做到这种功能,但像这种经常访问的实时数据,更适合放在内存中,而不是放在磁盘中,要知道mysql的瓶颈就是磁盘I/O,此举无疑会增大mysql的压力,Redis作用是读写内存,内存读写速度对比磁盘读写速度不用说,那是一个天上一个地下,所以使用Redis的理由是:
1.中心化存储,用于管理所有应用程序的共享数据。
2.为关系型数据库缓解压力,因为Redis的吞吐量比mysql吞吐量大得多,热点数据、实时数据都可以用 Redis缓存。
---------------------------------------------------------------------------------------------------------------------------------
Redis的特点
- 数据都在内存中操作,适合海量数据读写
- 支持持久化,Redis可以将内容持久化到磁盘中,就算故障重启数据也能回复
- Redis支持String、List、Set、Hash、zSet数据结构
---------------------------------------------------------------------------------------------------------------------------------
Redis的五大数据结构
1. String:
Redis最基本的数据类型,使用k-v键值的形式存储数据,一个key对应一个value,单个string的最大储存值为512M,使用set与get命令操作String类型的值。
其中key=k1,value=v1。
应用场景:一般用于存储图片或序列化后的对象以及简单的串。
2.Hash
Hash是一个key-value的集合,用于存储多个k-v键值对,一个hash可以存储2的32次方-1个键值对(反正很多)。使用HMSET, HGET命令操作hash类型的值。
应用场景:hash适合存储对象(对象名:field:value,...)
3.List
List是string的集合,用于存储多个string,存储上限与hash一致(反正很多)。使用lpush往集合左边添加数据,使用rpush往集合右边添加数据,使用lrange start(开始下标) stop(结束下标)来获取list中的数据,也可以用lpop、rpop来单个取数据。
可以看到我们在使用lrange时必须加上start stop,如果不加上就会报错
应用场景:可以当作一个消息队列使用(除非你对消息的丢失与重复不是很在意,否则不要用它),生产者使用lpush、rpush来生产消息,消费者使用lpop、rpop来消费消息。
4.Set
Set 相对于List来说是无序的string集合,且里面不会包含等值的数据,使用sadd来添加一个元素到set中,如果成功返回1,如果该元素已经存在set中则返回0;使用smembers来获取set的所有数据
应用场景:只要需要唯一值的场景都可以用set存储(例如统计在某个时间段点击了某按钮的用户啦等等等等~)。
5.zset
带分数的set,分数可以重复,value不能重复,可用于实现排行榜。使用zadd来添加一个元素到set中,使用zrange key start stop或者zrangebyscore key start stop来获取一个zset中的范围数据。
应用场景:排行榜(一个用户的排行、或一些事件的排行),因为zset可以根据分数排序~所以用此功能可以非常方便的做出排行统计。
下一章我们对Redis的持久化策略与缓存雪崩、缓存穿透、缓存击穿等问题做深入研究!