1、Redis简介git
1.什么是Redisgithub
Redis 是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。从2010 年3 月15 日起,Redis 的开发工做由VMware 主持。redis
Redis 是一个Key-Value 存储系统。和Memcached 相似,它支持存储的value 类型相对更多, 包括string(字符串)、hash(散列)、list(链表)、set(集合)和zset(有序集合)。这些数据类型支持push/pop、add/remove 及取交集并集和差集和更丰富的操做,并且这些操做都是原子性的。在此基础上,Redis 支持各类不一样方式的排序。与memcached 同样,为了保证效率,数据都是缓存在内存中。区别的是Redis 会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。数据库
2.Redis思想缓存
Redis 的做者antirez(Salvatore Sanfilippo)曾经发表了一篇名为Redis 宣言(Redis Manifesto) 的文章,文中列举了Redis 的七个原则,以向你们阐明Redis的思想。服务器
一、Redis 是一个操做数据结构的语言工具,它提供基于TCP 的协议以操做丰富的数据结构。在Redis 中,数据结构这个词的意义不只表示在某种数据结构上的操做,更包括告终构自己及这些操做的时间空间复杂度。网络
二、Redis 定位于一个内存数据库,正是因为内存的快速访问特性,才使得Redis 可以有如此高的性能,才使得Redis 可以轻松处理大量复杂的数据结构,Redis 会尝试其它的存储方面的选择,可是永远不会改变它是一个内存数据库的角色。数据结构
三、Redis 使用基础的API 操做基础的数据结构,Redis 的API 与数据结构同样,都是一些最基础的元素,你几乎能够将任何信息交互使用此API 格式表示。做者调侃说,若是有其它非人类的智能生物存在,他们也能理解Redis 的API。由于它是如此的基础。架构
四、Redis 有着诗通常优美的代码,常常有一些不太了解Redis 有的人会建议Redis 采用一些其它人的代码,以实现一些Redis 未实现的功能,但这对咱们来讲就像是非要给《红楼梦》接上后四十回同样。分布式
五、Redis 始终避免复杂化,咱们认为设计一个系统的本质,就是与复杂化做战。咱们不会为了一个小功能而往源码里添加上千行代码,解决复杂问题的方法就是让复杂问题永远不要提复杂的问题。
六、Redis 支持两个层面的API,第一个层面包含部分操做API,但它支持用于分布式环境下的Redis。第二个层面的API 支持更复杂的multi-key 操做。它们各有所长,可是咱们不会推出二者都支持的API,但咱们但愿可以提供实例间数据迁移的命令,并执行multi-key 操做。
七、咱们以优化代码为乐,咱们相信编码是一件辛苦的工做,惟一对得起这辛苦的就是去享受它。若是咱们在编码中失去了乐趣,那最好的解决办法就是停下来。咱们决不会选择让Redis 很差玩的开发模式。
Redis 的做者antirez 曾笑称Redis 为一个数据结构服务器(data structures server),其实能够认为这是一个很是准确的表述,Redis 的全部功能就是将数据以其固有的几种结构来保存,并提供给用户操做这几种结构的接口。本文将介绍Redis 支持的各类数据类型及其操做接口。
3.Key-Value 存储系统简介
Key-Value Store 是当下比较流行的话题,尤为在构建诸如搜索引擎、IM、P2P、游戏服务器、SNS 等大型互联网应用以及提供云计算服务的时候,怎样保证系统在海量数据环境下的高性能、高可靠性、高扩展性、高可用性、低成本成为全部系统架构们挖苦心思考虑的重点,而怎样解决数据库服务器的性能瓶颈是最大的挑战。
按照分布式领域的CAP 理论(Consistency、 Availability、Tolerance to network Partitions 这三部分在任何系统架构实现时只可能同时知足其中二点,无法三者兼顾)来衡量,传统的关系数据库的ACID 只知足了Consistency、Availability,所以在Partition tolerance 上就很难作得好。另外传统的关系数据库处理海量数据、分布式架构时候在Performance、Scalability、 Availability 等方面也存在很大的局限性。
而Key-Value Store 更加注重对海量数据存取的性能、分布式、扩展性支持上,并不须要传统关系数据库的一些特征,例如:Schema、事务、完整SQL 查询支持等等,所以在分布式环境下的性能相对于传统的关系数据库有较大的提高。
图1.一些数据库和缓存服务器的特性与功能
4.Redis 实际应用案例
目前全球最大的Redis 用户是新浪微博,在新浪有200 多台物理机,400 多个端口正在运行着Redis, 有+4G 的数据跑在Redis 上来为微博用户提供服务。
图2.新浪微博Redis应用
在新浪微博Redis 的部署场景不少,大概分为以下的2 种:
第一种是应用程序直接访问Redis 数据库
图3. 应用程序直接访问Redis 数据库
第二种是应用程序直接访问Redis,只有当Redis 访问失败时才访问MySQL
图4. 应用程序访问Redis和MySQL数据库
2、初识Redis
1.数据类型
做为Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。可是,除了常规的数值或字符串,Redis 的键值还能够是如下形式之一:
-Lists (列表)
-Hash (散列)
-Sets (集合)
-Sorted sets (有序集合)
-Hashes (哈希表)
图5.Redis提供的五种结构
键值的数据类型决定了该键值支持的操做。Redis 支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操做;同时,若是键值的类型是普通数字,Redis 则提供自增等原子操做。
2.持久化
一般,Redis 将数据存储于内存中,或被配置为使用虚拟内存。经过两种方式能够实现数据持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用相似MySQ-的日志方式, 记录每次更新的日志。前者性能较高,可是可能会引发必定程度的数据丢失;后者相反。
3.主从同步
Redis 支持将数据同步到多台从库上,这种特性对提升读取性能很是有益。
4.性能
相比须要依赖磁盘记录每一个更新的数据库,基于内存的特性无疑给Redis 带来了很是优秀的性能。读写操做之间有显著的性能差别。
5.提供API的语言
-C
-C++
-C#
-Clojure
-Common Lisp
-Erlang
-Haskell
-Java
-Javascript
-Lua
-Objective-C
-Perl
-PHP
-Python
-Ruby
-Scala
-Go
-Tcl
6.适用场合
毫无疑问,Redis 开创了一种新的数据存储思路,使用Redis,咱们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis 灵活多变的数据结构和数据操做,为不一样的大象构建不一样的冰箱。但愿你喜欢这个比喻。
下面是Redis 适用的一些场景:
1、取最新N 个数据的操做
好比典型的取你网站的最新文章,经过下面方式,咱们能够将最新的5000 条评论的ID 放在Redis 的List 集合中,并将超出集合部分从数据库获取。
使用LPUSH latest.comments<ID>命令,向list 集合中插入数据
插入完成后再用LTRIM latest.comments 0 5000 命令使其永远只保存最近5000 个ID。
若是你还有不一样的筛选维度,好比某个分类的最新N 条,那么你能够再建一个按此分类的List,只存ID 的话,Redis 是很是高效的。
2、排行榜应用,取TOP N 操做
这个需求与上面需求的不一样之处在于,前面操做以时间为权重,这个是以某个条件为权重, 好比按顶的次数排序,这时候就须要咱们的sorted set 出马了,将你要排序的值设置成sorted set 的score,将具体的数据设置成相应的value,每次只须要执行一条ZADD 命令便可。
3、须要精准设定过时时间的应用
好比你能够把上面说到的sorted set 的score 值设置成过时时间的时间戳,那么就能够简单地经过过时时间排序,定时清除过时数据了,不只是清除Redis 中的过时数据,你彻底能够把Redis 里这个过时时间当成是对数据库中数据的索引,用Redis 来找出哪些数据须要过时删除,而后再精准地从数据库中删除相应的记录。
4、计数器应用
Redis 的命令都是原子性的,你能够轻松地利用INCR,DECR 命令来构建计数器系统。
5、Uniq 操做,获取某段时间全部数据排重值
这个使用Redis 的set 数据结构最合适了,只须要不断地将数据往set 中扔就好了,set 意为集合,集合中的元素是惟一的,因此会自动排重。
6、实时系统,反垃圾系统
经过上面说到的set 功能,你能够知道一个终端用户是否进行了某个操做,能够找到其操做的集合并进行分析统计对比等。没有作不到,只有想不到。
7、Pub/Sub 构建实时消息系统
Redis 的Pub/Sub 系统能够构建实时的消息系统,好比不少用Pub/Sub 构建的实时聊天系统的例子。
8、构建队列系统
使用list 能够构建队列系统,使用sorted set 甚至能够构建有优先级的队列系统。
9、缓存
这个没必要说了,性能优于Memcached,数据结构更多样化
3、推荐一些Redis学习资源
1.网站
http://redis.io Redis官网
https://github.com/antirez/redis Redis源代码
https://github.com/huangz1990/redis-3.0-annotated 注释版的Redis 3.0源码
http://doc.redisfans.com Redis命令参考中文翻译版
2.书籍
《redis入门指南(第2版)》 一本适合Redis入门的书籍
《Redis 设计与实现》 剖析了Redis的源码
《Redis实战》 Redis在实战中的应用
上面这三本书分别从入门、源码、 实战三个维度讲解了Redis,这也是我认为Redis很是值得学习的三个方面。redis的源码只有三万多行,很值得研究学习下,同时也方便本身团队在使用过程当中去根据业务需求量身打造Redis。
参考资料:部分文字内容或插图来自于以上书籍或网络搜集