在了解Redis之前,首先给自己提几个疑问:我们得知道Redis是用来做什么的?在什么时候能使用到?它得优势在什么地方?使用它又需要注意什么?接下来我们带着心中得疑问一步一步共同学习下。
简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis数据类型
String(字符串):Redis最基本的数据类型,一个键对应一个值,一个键值最大存储512MB
Hash(哈希):hash是一个键值对的集合,是一个String类型的field和value的映射表,适合用于存储对象
List(列表):是redis的简单的字符串列表,按插入顺序排序
Set(集合):是String字符串类型的无序集合,也不可重复
ZSet(sorted set 有序集合)是String类型的有序集合,也不可重复。有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序。
1.Redis是用来做什么的
缓存,内存作为数据存储介质,读写数据的效率极高,可设置持久化
消息通知(发布-订阅),是进程中的一种消息通信模式,发送者pub发送消息,订阅者sub接收消息,一对一相当于私聊,一对多相当于群聊
高速队列
2.什么时候能用到
2.1 缓存
高并发的数据,可以放入Redis缓存
频繁访问且变动较小的数据可以放入Redis缓存,减少db的io
分布式中可以用来缓存会话
排行版
购物车
...
2.2 发布-订阅
应用中聊天,消息交流
支付完成后,等待服务器通知支付结果
实时公告或通知
....
PS:如果数据量大,可以去看看Kafka
2.3 队列
支付系统,大量的下单,可以放入队列用于缓冲
注册、登录等待 发送短信
...
PS:量大可以使用RabbitMQ
3.Redis优点
1.基于内存,数据读写速度快,性能高
2.支持持久化存储
3.支持多种数据类型
4.丰富特性:过期策略,事务,支持多db
4.数据一致性问题
这里主要讨论下Redis作为缓存时数据一致性问题
在数据量不大的情况下,一般采用先访问Redis,如果Redis中不存在访问的数据,则去Db中查询,把查询的结果缓存到Redis,当有新数据来就直接写入Db
如果高并发的情况下
4.1 先更新Redis,Reids更新成功后,在更新Db
1) Redis写入成功,后续得Db写入由于某种原因更新失败,出现数据不一致
4.2 更新Db,删除Redis缓存
1) 当高并发得情况下,很可能在更新Db动作没完成时候出现一次新得查询请求
解决方案:
读取数据时,如果Redis中数据不存在,则去Db查询,更新缓存,但新得数据来得时候,我们先更新Db,如果Db数据更新成功,此时则让Redis缓存失效(或者删除对应Redis缓存),达到同步得效果,如果Db更新失败 则无需更新Redis。此时有朋友肯定会想,如果缓存失效(或者删除对应Redis缓存)没成功怎么办,这是一个疑问,在网上看到有人提出了,重试机制,诶,这个很可以,方案中再加入策略