一、Redis简介

1.什么是Redis

Redis 是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。从2010 年3 月15 日起,Redis 的开发工作由VMware 主持。

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的思想。

1、Redis 是一个操作数据结构的语言工具,它提供基于TCP 的协议以操作丰富的数据结构。在Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。

2、Redis 定位于一个内存数据库,正是由于内存的快速访问特性,才使得Redis 能够有如此高的性能,才使得Redis 能够轻松处理大量复杂的数据结构,Redis 会尝试其它的存储方面的选择,但是永远不会改变它是一个内存数据库的角色。

3、Redis 使用基础的API 操作基础的数据结构,Redis 的API 与数据结构一样,都是一些最基础的元素,你几乎可以将任何信息交互使用此API 格式表示。作者调侃说,如果有其它非人类的智能生物存在,他们也能理解Redis 的API。因为它是如此的基础。

4、Redis 有着诗一般优美的代码,经常有一些不太了解Redis 有的人会建议Redis 采用一些其它人的代码,以实现一些Redis 未实现的功能,但这对我们来说就像是非要给《红楼梦》接上后四十回一样。

5、Redis 始终避免复杂化,我们认为设计一个系统的本质,就是与复杂化作战。我们不会为了一个小功能而往源码里添加上千行代码,解决复杂问题的方法就是让复杂问题永远不要提复杂的问题。

6、Redis 支持两个层面的API,第一个层面包含部分操作API,但它支持用于分布式环境下的Redis。第二个层面的API 支持更复杂的multi-key 操作。它们各有所长,但是我们不会推出两者都支持的API,但我们希望能够提供实例间数据迁移的命令,并执行multi-key 操作。

7、我们以优化代码为乐,我们相信编码是一件辛苦的工作,唯一对得起这辛苦的就是去享受它。如果我们在编码中失去了乐趣,那最好的解决办法就是停下来。我们决不会选择让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数据库

二、初识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 命令来构建计数器系统。

5Uniq 操作,获取某段时间所有数据排重值

这个使用Redis 的set 数据结构最合适了,只需要不断地将数据往set 中扔就行了,set 意为集合,集合中的元素是唯一的,所以会自动排重。

6、实时系统,反垃圾系统

通过上面说到的set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。

7Pub/Sub 构建实时消息系统

Redis 的Pub/Sub 系统可以构建实时的消息系统,比如很多用Pub/Sub 构建的实时聊天系统的例子。

8、构建队列系统

使用list 可以构建队列系统,使用sorted set 甚至可以构建有优先级的队列系统。

9、缓存

这个不必说了,性能优于Memcached,数据结构更多样化

三、推荐一些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。

参考资料:部分文字内容或插图来自于以上书籍或网络搜集

Redis初识、设计思想与一些学习资源推荐的更多相关文章

  1. springboot 学习资源推荐

    springboot 是什么?对于构建生产就绪的Spring应用程序有一个看法. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.(这是springboot的官方介绍) 我们为什么要学 ...

  2. Spring Boot和Spring Cloud学习资源推荐

    Spring Boot和Spring Cloud学习资源推荐   比较好的学习资源,分享一下. 1.Spring Boot官方文档:http://projects.spring.io/spring-b ...

  3. Python 0(安装及初步使用+学习资源推荐)

    不足之处,还请见谅,请指出不足.本人发布过的文章,会不断更改,力求减少错误信息. Python安装请借鉴网址https://www.runoob.com/python/python-install.h ...

  4. Java/C++ 学习资源推荐

    列举一下我所知道的一些学习资源,希望能对大家有所帮助 Java学习资源资源: 1.尚学堂 Java300集 链接:https://study.163.com/course/introduction.h ...

  5. AI入门丨开源学习资源推荐

    现在AI大热,网上的资源也非常多,让人眼花缭乱.非科班的我,经过半年的摸索,也算马马虎虎入了坑.下面整理了我认为不错的学习资源,大部分我都看过,以分享给更多的人.我会不断保持更新,也欢迎大家补充. P ...

  6. (干货)Linux学习资源推荐

    源地址 国内的专业Linux网站(GB) ChinaUnix Linux中国 实验楼: 免费提供了Linux在线实验环境,不用在自己机子上装系统也可以学习Linux,超方便实用!. 国内的专业Linu ...

  7. 十个优秀的C语言学习资源推荐

    学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.-- Boatman Yang 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程序员不得不跟 ...

  8. Git学习资源推荐

    Git在线练习 http://pcottle.github.io/learnGitBranching/ https://try.github.io/levels/1/challenges/1 Git入 ...

  9. Linux学习笔记——重点推荐的Linux网络在线学习资源

     首先非常感谢百度,感谢网络的搜索引擎技术,也非常感谢学习资源的贡献者和组织! 1:http://billie66.github.io/TLCL/book/zh/ 2:http://www.ha97. ...

随机推荐

  1. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  2. react-native的tabbar和navigator混合使用

    前段时间搭建项目使用了navigator和react-native-tab-navigator,现在我教大家搭建一个通用的简单框架. 先把几张图贴在这里,这就是我们今天要搭建的东西,别看页面简单,但是 ...

  3. mongo DB for C#

    (1)Download the MongoDB C#驱动. http://www.nuget.org/packages/mongocsharpdriver/. (2) Add Reference to ...

  4. ASP.NET MVC——URL路由

    在MVC之前,ASP.NET假设请求的URL与服务器上的文件之间有关联,服务器接受请求,并输出相应的文件.而在引入MVC后,请求是由控制器的动作方法来处理的.为了处理URL,便引入了路由系统. 首先我 ...

  5. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  6. PHP 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问. [代理模式中主要角色] 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实 ...

  7. 脚本化CSS类-HTML5 classList属性

    HTML元素可以有多个CSS类名,class属性保存了一个用空格隔开的类名列表.标识符class在JavaScript中是保留字,所以在JavaScript中可以用className. //如下代码设 ...

  8. Css3新特性总结之边框与背景(一)

    本系列主要总结Css3一些新特性的认识,来源于<css揭秘>书. 一.半透明边框 css3最好用hsla,而不是rgba,hsla是:h:颜色值(0~360):s:饱合度(0%~100%) ...

  9. arcgis 许可异常的解决

    异常现象: arcgis 许可服务管理器中无法重新读取许可,许可服务启动后立即停止.         解决方法: 1.卸载license:安装新的license!重新破解,替换license文件夹BI ...

  10. Android Support 包知识

    Android Support Library包是一组代码库, 它提供了向后版本的framework API的兼容, 这些代码库实现的效果和只能在指定版本中使用的API一样好. 每个Support L ...