Redis是什么
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 是一个高性能的key-value数据库。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
数据库应用的发展历史
- 在互联网大数据时代来临之前,企业的一些内部信息管理系统,一个单一数据库实例可以应付系统的需求
- 单数据库实例
- 随着系统访问量用户的增多,数据量的增大,单个数据库实例已经瞒住不了系统读取数据的需求
- 缓存(memcache)+数据库实例
- 缓存可以缓解数据库的读取压力,但是数据量的写入压力持续增大,可以采取数据库主从进行读写分离
- 缓存+主从数据库+读写分离
- 数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈
- 缓存+主从数据库集群+读写分离+分库分表
- 互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性大,实时性高而且格式不固定的数据
- NoSQL+主从数据库集群+读写分离+分库分表
Redis优势
1、性能高,速度快
Redis命令执行速度非常快,官方给出的读写性能可以达到10W/秒。为什么会如此之快呢?有以下几个因素:
- 数据存储在内存中,直接与内存连接。
- 由相对底层的C语言实现,离操作系统更近。
- 实现源码很精湛,仅仅几万行代码,简单稳定。
- 使用了单线程模型,无多线程竞争、锁等问题。
2、丰富的数据结构
Redis与其他的内存数据库不同的是,Redis拥有丰富的数据类型,如字符串、哈希、列表、集合、有序集合等。正是因为Redis丰富的数据类型,所有它能应用的场景非常多。
3、丰富的特性
除了支持丰富的数据结构外,还支持以下高级功能。
- 支持键过期功能,可以用来实现定时缓存。
- 支持发布/订阅功能,可以有来实现消息队列。
- 支持事务功能,可以保证多条命令的事务性。
- 支持供管道功能,能够批量处理命令。
- 支持Lua脚本功能。
- 支持集群分片和数据复制功能。
- 支持内存数据持久化硬盘功能。
Redis应用
- 缓存
我们通常把Redis当作一个非本地缓存来使用,很少用到它的一些高级功能。在使用中最容易出问题的是用Redis来保存JSON数据,因为Redis不像Elasticsearch或者PostgreSQL那样可以很好地支持JSON数据。所以我们经常把JSON当作一个大的String直接放到Redis中,但现在的JSON数据都是连环嵌套的,每次更新时都要先获取整个JSON,然后更改其中一个字段再放上去。
一个常见的JSON数据的Java对象定义如下:
在海量请求的前提下,在Redis中每次更新一个字段,比如销量字段,都会产生较大的流量。在实际情况下,JSON字符串往往非常复杂,体积达到数百KB都是有可能的,导致在频繁更新数据时使网络I/O跑满,甚至导致系统超时、崩溃。
因此,Redis官方推荐采用哈希来保存对象,比如有3个商品对象,ID分别是123、124和12345,我们通过哈希把它们保存在Redis中,在更新其中的字段时可以这样做:
也就是说,用商品的类型名和ID组成一个Redis哈希对象的KEY。在获取某一属性时只需这样做就可以获取单独的属性:HGET commodity: 12345。
- 队列
使用Redis可以做的一个不太常见,但非常有用的事情是排队。无论是电子邮件队列还是其他应用程序使用的数据,你都可以在Redis中创建一个高效的队列。任何熟悉堆栈以及会push和pop项目的开发人员都可以轻松自然地使用此功能。
简单命令
- 排行榜
Redis令人耀眼的地方之一就是排行榜。由于Redis在内存中,因此可以非常快速和高效地处理递增和递减。将此与每个请求运行SQL查询比较,性能收益巨大!这与Redis的排序集相结合意味着你可以以毫秒为单位抓取列表中评分最高的项目,而且实现起来非常容易。
简单命令
目前使用Redis的公司非常多,国内外都有很多重量级的公司在用。所以,现在学习Redis是大势所趋,学好Redis能为自己在日后的工作谋生中增加一个强有利的竞争手段。