很多小伙伴在花时间学redis的时候,很迷茫.感觉很空虚,不知道自己为什么学redis,学完之后能做什么,其实这种想法错的离谱,redis作为现在最流行的NoSQL数据库,现在各大厂都会要求程序员会redis,掌握了redis就等于一只脚迈入了大厂的门槛。
为了能够让大家在学习redis的道路上继续前行我觉得很有必要为大家整理一份简单实用的redis实战宝典希望这份资料能让各位在即将来临的秋招上拿到自己喜欢的offer!
限于文章篇幅原因,只能以截图的形式展示出来,有需要的小伙伴可以文末获取↓↓↓
目录概览
内容概览
入门
初识Redis
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redlis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
Redis数据结构简介
大部分程序员应该都不会对Redis的STRING、LIST、HASH这3种结构感到陌生,因为它们和很多编程语言内建的字符串、列表和散列等结构在实现和语义(semantics)方面都非常相似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。2SET在某种程度上是一种Redis特有的结构,但是当你熟悉了它之后,就会发现它也是一种非常有用的结构。
使用Redis构建Web应用
使用Redis实现购物车
因为我们在前面已经使用Redis实现了会话cookie和记录用户最近浏览过的商品这两个特性,所以我们决定将购物车的信息也存储到Redis里面,并且使用与用户会话cookie相同的cookieID来引用购物车。
网页缓存
在动态生成网页的时候,通常会使用模板语言(templating language)来简化网页的生成操作。需要手写每个页面的日子已经一去不复返——现在的Web页面通常由包含首部、尾部、侧栏菜单、工具条、内容域的模板生成,有时候模板还用于生成JavaScript。
数据行缓存
到目前为止,我们已经将原本由关系数据库和网页浏览器实现的登录和访客会话转移到了Redis 上面实现;将原本由关系数据库实现的购物车也放到了Redis上面实现;还将所有页面缓存到了Redis里面。这一系列工作提升了网站的性能,降低了关系数据库的负载并减少了网站成本。
Redis命令
字符串
用户可以通过给定一个任意的数值,对存储着整数或者浮点数的字符串执行自增(inerement)或者自减(deerement)操作,在有需要的时候,Redis还会将整数转换成浮点数。整数的取值范围和系统的长整数(long integer)的取值范围相同(在32位系统上,整数就是32位有符号整数,在64位系统上,整数就是64位有符号整数),而浮点数的取值范围和精度则与IEEE754标准的双精度浮点数(double)相同。Redis明确地区分字节串、整数和浮点数的做法是一种优势,比起只能够存储字节串的做法,Redis的做法在数据表现方面具有更大的灵活性。
集合
Redis的集合以无序的方式来存储多个各不相同的元素,用户可以快速地对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合里。第1章曾经对集合进行过简单的介绍,并在构建文章投票网站时,使用集合记录文章以及投票用户名单以及群组属下的所有文章。
基本的Redis事务
有时候为了同时处理多个结构,我们需要向Redis发送多个命令。尽管Redis有几个可以在两个键之间复制或者移动元素的命令,但却没有那种可以在两个不同类型之间移动元素的命令(虽然可以使用ZUNIONSTORE命令将元素从一个集合复制到一个有序集合)。为了对相同或者不同类型的多个键执行操作,Redis有5个命令可以让用户在不被打断(interruption)的情况下对多个键执行操作,它们分别是WATCH、MULTI、EXEC、UNWATCH和DISCARD。
数据安全与性能保障
持久化选项
Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面。一种方法叫快照(snapshoting)它可以将存在于某一时刻的所有数据都写入硬盘里面。另一种方法叫只追加文件(append-only file,AOF),它会在执行写命令时,将被执行的写命令复制到硬盘里面。这两种持久化方法既可以同时使用,又可以单独使用,在某些情况下甚至可以两种方法都不使用,具体选择哪种持久化方法需要根据用户的数据以及应用来决定。
复制
对于有扩展平台以适应更高负载经验的工程师和管理员来说,复制(replication)是不可或缺的。复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。关系数据库通常会使用一个主服务器(master)向多个从服务器(slave)发送更新,并使用从服务器来处理所有读请求。Redis也采用了同样的方法来实现自己的复制特性,并将其用作扩展性能的一种手段。本节将对Redis的复制配置选项进行讨论,并说明Redis在进行复制时的各个步骤。
Redis事务
为了保证数据的正确性,我们必须认识到这一点:在多个客户端同时处理相同的数据时,不谨慎的操作很容易会导致数据出错。本节将介绍使用Redis事务来防止数据出错的方法,以及在某些情况下,使用事务来提升性能的方法。
使用Redis构建支持程序
将计数器存储到Redis里面
知道我们的网站在最近5分钟内获得了10000次点击,或者数据库在最近5秒内处理了200次写入和600次读取,是非常有用的。通过在一段时间内持续地记录这些信息,我们可以注意到流量的骤增或渐增情况,预测何时需要对服务器进行升级,从而防止系统因为负荷超载而下线。
查找IP所属城市以及国家
通过将统计数据和日志存储到Redis里面,我们可以收集访客在系统中的行为信息。但是直到目前为止,我们都忽略了访客行为中非常重要的一个部分,那就是——这些访客是从哪里来的?为了回答这个问题,在这一节中,我们将构建一系列用于分析和载人IP所属地数据库函数,并编写一个可以根据访客的IP地址来查找访客所在城市、行政区(州)以及国家的函数。
使用Redis构建应用程序组件
自动补全最近联系人
因为服务器上的数百万用户都需要有一个属于自己的能够快速向列表里面添加用户或者删除用户的前提下,尽量减少存储这些联系人列表带来的内存消耗。因为Redis的列表会以有序的方式来存储元素,并且和Redis提供的其他结构相比,列表占用的内存是最少的,所以我们选择使用列表来存储用户的联系人信息。可惜的是,Redis列表提供的功能并不足以让我们在Redis内部完成自动补全操作,因此实际的自动补全操作将会放到Redis之外的Python 里面执行,这种做法使得程序可以尽量减少Redis存储和更新用户最近联系人列表所需的内存数量,并将较为简单的过滤工作交给Python来执行。
基于搜索的应用程序
使用Redis进行搜索
当用户在文本编辑器或者文字处理软件中搜索一个单词或者句子的时候,软件就会对文件进行扫描并寻找那个单词或者句子。如果读者曾经使用过Linux、Unix或者OS X的grep程序,或者曾经使用过Windows内置的文件搜索功能来查找包含特定单词或者句子的文件,那么应该就会注意到,被搜索文件的数量越多、体积越大,搜索花费的时间也会越长。
构建简单的社交网站
用户和状态
在用户与Twitner进行交互时,用户和状态消息这两类对象是最为重要的。用户对象存储了用户的基本身份标识信息、用户的关注者人数、用户已发布的状态消息数量等信息。用户对象对于社交网站来说非常重要,因为它是构建其他可用并且有趣的数据的起点。除了用户对象以外,状态消息也同样重要,因为它记录了不同的用户都说了些什么,以及不同用户之间进行了什么交流,这些由用户创建的状态消息是社交网站真正的内容。
降低内存占用
打包存储二进制位和字节
本节将使用分片Redis字符串,为大量带有连续ID的用户存储位置信息,并研究如何对被存储的数据进行聚合计算。本节的例子展示了如何使用分片Redis字符串去存储诸如Twitter用户的位置信息这样的数据。
扩展Redis
扩展写性能和内存容量
第2章中曾经构建过一个系统,它可以自动将已渲染的Web页面缓存到Redis里面,从而减少页面的载人时间并降低处理页面所需的资源消耗。随着被缓存的数据越来越多,当数据没办法被存储到一台机器上面的时候,我们就需要想办法把数据分割存储到由多台机器组成的群组里面。
Redis的Lua脚本编程
使用Lua重写锁和信号量
加锁操作首先生成了一个ID,然后使用SETNX命令对键进行了有条件的设置操作,并在设置操作执行成功的时候,为键设置了过期时间。尽管加锁操作在概念上并不复杂,但程序还是需要处理各种失败和重试的情况,最终得出的就是代码清单11-4展示的加锁实现的原代码。
限于文章篇幅原因,就展示到这里了,有需要的小伙伴可以查看下方名片↓↓↓