一、Redis简介
1. 什么是Redis
Redis是一个开源的、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、高性能(NoSQL)Key-Value数据库。
2. NoSQL
2.1 NoSQL是什么
NoSQL:泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起,非关系型数据库现在成了一个及其热门的新领域。
2.2 NoSQL的作用
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
2.3 NoSQL的类别
键值(Key-Value)存储数据库
Key-Value使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:键值对
优势:快速查询
劣势:存储的数据缺少结构化
列存储数据库
列存储数据库通常是用来应对分布式存储的海量数据。键依然存在,但是它们的特点是指向了多个列。
相关产品:Cassamdra、Hbase、Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,value是结构化的)
数据模型:键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库
相关产品:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
2.4 总结
- 数据模型比较简单
- 需要灵活性更强的IT系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定key,比较容易映射复杂值的环境
3. Redis的特点
- 性能极高:Redis读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型:Redis支持的类型:String、Hash、List、Set及Ordered Set
- 原子性:Redis的所有操作都是原子性的,即要么成功,要么失败
- 丰富的特性:Redis还支持publish/subscribe、通知、key过期等等特性
- 高速读写:Redis使用自己实现的分离器,代码量很短,没用使用lock,因此效率非常高
4. Redis的应用场景
可以用作数据库、缓存、热点数据(经常会被查询,但是不经常被修改或者删除的数据)和消息中间件等大部分功能。
redis常用的场景示例如下:
-
缓存
缓存几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能提升网站的访问速度,还能打打降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略。
-
排行榜
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类能实现复杂的排行榜应用。
-
计数器
什么是计数器?如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时性,每次浏览都得+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计算器功能,内存操作,性能非常好,非常适用于这些计数场景。
-
分布式会话
集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
-
分布式锁
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但是在并发量高的场合中,利用数据库锁来控制资源的并发访问是不理想的,大大影响了数据库的性能。可以使用Redis的setnx功能来编写分布式的锁,通过设置返回1说明获取锁成功,否则获取锁失败。
-
社交网络
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构就能很方便的实现这些功能。
-
最新列表
Redis列表结构,LPUSH可以在列表头部插入一个内容,使用ID作为关键字,LTRIM可以用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去找到对应的内容也即可。
-
消息系统
5. Redis总结
5.1 Redis优势
- 性能极高:Redis读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型:Redis支持的类型:String、Hash、List、Set及Ordered Set
- 原子性:Redis的所有操作都是原子性的,即要么成功,要么失败
- 丰富的特性:Redis还支持publish/subscribe、通知、key过期等等特性
- 高速读写:Redis使用自己实现的分离器,代码量很短,没用使用lock,因此效率非常高
5.2 Redis劣势
-
持久化:Redis直接将数据存储到内存中,要将数据保存到磁盘上,Redis可以使用两种方式实现持久化过程。
- 定时快照(snapshot):每隔一段时间将整个数据库写到磁盘上,每次均是写全部数据,代价非常高
- 基于语句追加(aof):只追踪变化的数据,但是追加的log可能过大,同时所有的操作均重新执行一遍,回复速度慢
-
耗内存:占用内存过高