The Little Redis Book

By Karl Seguin

关于本书:本书全然免费下载。你能够任意转载,复制。但请你注明作者。Karl Seguin。译者,WY。

以及不要用于商业用途。

关于作者:Karl 同志是广大屌丝IT码农中的一员。

但经验丰富,不仅活好并且跨领域甚广。

闲暇之余,跟笔者一样闲的蛋疼,写了几本小书。没想到还挺受欢迎,特别是The Little MongoDb Book。风靡码农界。

很多其它资讯看他的个人博客http://openmymind.net 。

本书最新版本号: http://github.com/karlseguin/the-little-redis-book

简单介绍:

近期几年,用于数据持久化查询的的技术和工具到一个突飞猛进的地步。但能够打包票的说。关系型数据也就那样了,同一时候。环绕数据的那套系统却肯定会是大不一样的。

在全部的工具和技术解决方式中,Redis 是最令我虎躯一震的。

第一是由于它太TMeasy上手了。

你仅仅需花费几小时的时间就能够上手使用了。

第二,它用一种很通用的方法攻克了一系列特殊问题。为什么呢?由于他并不是全部的东西都是有关数据的。

你了解的越多,对这句话的理解就会越深刻。

当你能仅用Redis 完毕一个系统时,我想你已经找到它提供的最普遍的解决方式——无论该系统是传统的关系型数据库。还是一个基于文档的系统。

在这方面,它有点像是一个索引引擎。只是你无须将全部应用构建在Lucene(由apache公布的著名的全文检索引擎工具包)上。当然,也就这一点相似而已。

本书的目的是介绍Redis 的一些基础。我们会把重点放在Redis 的五种数据结构以及不同的数据建模方法。

当然还会接触一些关键的管理方法以及调试技巧。

開始:

学习的方法不同,有人喜欢上手,有人喜欢看视频,也有人喜欢看书。

只是最有效的方法只是直接试用一下了。在学习下面内容时,最好先安装一个Redis,灰常简单的哦。

Redis是不支持Widows的。但这妨碍不了万能的码农们假设仅仅是玩票的话。用https://github.com/MSOpenTech/redis

*nix下的安装就自行谷歌下吧。

安装完毕后,以Linux 下为例,执行./redis-server.启动server,然后执行./redis-cli。将以默认接口(6379)连接本地服务.你能够在命令行下输入info 測试server的状态。

第一章   基础

  在研究Redis的时候首先我们要知道Redis是什么。他是为解决什么样的问题而出现的。

Redis常被描写叙述为一种常驻内存的的持续性的key_value存储。我觉得这样描写叙述有失精准,Redis的确是将全部数据存储在内存中,它也的确持续性的写入磁盘,但他绝不仅是简单的key_value存储。

认识到这个偏见很重要,否则你用它解决的问题就会大大变少。

其实Redis公布了五种不同的数据结构,仅仅有一种是典型的key_value结构。理解这五种结构。他们怎样工作,对应的内嵌方法,以及依据他们怎样建模才是重中之重。首先,

让我们理清数据结构的用途吧。

假设我们打算使用数据结构的概念到这个关联世界中,我们首先想到的就是数据库的一种简单数据结构——表(tables).表是一种既复杂又非常灵活的结构。差点儿全部的东西都能够用表来模拟。存储。然而他也并不是没有缺点。由于并不是全部的东西都像我们想的那样简单。假设我们用到的结构就是这样的特殊的,无法用普遍方法解决的话怎么办呐?

对特殊的问题应用特殊的数据结构。我们编码不就是这样吗?你不会为每一条数据使用哈希表。你自然也不会用一个标量变量。

对我来说。这就是Redis的用途。

假设你是跟scalars,lists,hashes,或者sets打交道,为什么不把他们存储为这样的形式呢。

基本模块:

1,数据库

Redis也有你所熟悉的数据库的概念,一个数据库包括一系列数据。数据库的经典用途就是将一个应用的全部数据组合在一起,将它与其它的应用分离开。

在Redis里,数据库被简单地用一个数字来识别。比方用0来表示默认的数据库。你过你想换一个不同的数据库,能够在命令行里使用select命令。

比方:select1.Redis会回复OK 。表示你改动成功。

假设想换回来,仅仅须要输入select0 就可以。

2,命令行,Keys 和 Values

由于Redis不不过key_value存储服务,并且Redis的五种数据结构至少有一个key和一个value.这样我们理解key_value就显得尤为重要了。

Keys是你识别一段数据的根据。我们以后会常常跟keys打交道。但如今,你仅仅需了解一个key大概是长这样就能够了:user:leto .我们能够推測这是一个username为leto的用户信息。冒号没有不论什么特殊意义。仅仅是作为一个分隔符。

Values 代表与keys相关联的实际信息。

他们能够是不论什么东西。能够是字符串。整数,甚至序列化对象(JSON,XML等)。对Redis来说。无论他们是什么格式,只是是一系列的字节而已。

注意不同的驱动会处理不同格式的对象,所以本书我们仅仅讨论字符串,整数以及JSON。

好了,如今開始动手。输入下面命令:

set  users:leto ‘{“name”:”leto”,”planet”:”dune”,”likes”:[“spice”]}’

这是Redis最主要的操作。首先是set 命令,后边是两个參数。

第一个是要设定的keys參数,第二个是values參数。

很多命令(并不是所有)是仅仅有一个key參数。那怎样获取数据呢。例如以下:

get users:leto

    如今能够自己尝试下其它的组合。

Keys和values是最主要的概念,而get和set是操作他们最简单的方式。

       3。查询

由上文我们能够看到。对于Redis而言,keys代表一切。而values无法查询到不论什么东西。比方:上文中。我们无法通过属性planet 的dune 值查询到不论什么东西。

很多人觉得这将导致非常多不便。由于我们知道数据查询要求灵活。强大,而Redis的方法显得有些原始,不切实际。不要为这点耿耿于怀。

记住,Redis不是一种万能的方法。查询的限制是Redis本身具有的。

4,内存和持久化

我们之前提过Redis是常驻内存的持久化存储。Redis会根据有多少keys改变而将对应的数据库输出到磁盘。默认配置。假设有超过1000个keys改变,Redis每60秒做一次存储。

同一时候,Redis还有append模式。

当一个key改变时,磁盘上的append_only_file会对应更新。有些情况下会丢失60秒的数据的代价来换取性能,当然。这会导致一些硬件或者软件的问题。有些情况下这个代价是无法接受的。Redis将选择权交给我们。第六章的时候,还会有第三种选项,将持续性交给slave进程处理。

Redis将全部数据存储在内存里。最明显的代价就是:占领太多RAM,而这仍然是server硬件中最贵的部分。

我认为有些开发人员可能忘了数据所占的空间事实上不大。莎士比亚的全集才仅占不到5.5M的内存。并且。其它的解决方式无非是通过不断IO或者大量消耗CPU,也是得不偿失的。所以除非是存储很大的多媒体文件,内存方面真不是问题。

Redis的确是支持虚拟内存的。可是这个特点已被证实是个败笔,不被推荐。

(提示:5.5M的莎士比亚全集能够被压缩为2M。尽管Redis不提供自己主动压缩功能。可是由于它把values看做字节,所以对此数据进行压缩是很可行的。

  5。标题串联

     最后我想把全部的小标题串联起来。特别是。查询限制,数据结构,Redis的内存存储方式。

当你把这些东西结合起来的时候。就会得出一个灰常牛逼的结果:速度。

一些人可能会想,“当然了,一切都在内存中必须快啊”。

这仅仅是一部分而已。Redis优于其它解决方式的真正原因是他的特殊的数据结构。

有多快?这取决于非常多因素——所用的命令,数据类型。等等。

Redis的性能趋向于每秒以万记甚至以十万计数。你能够执行 redis_benchmark (与redis-server,redis-cli同一目录下)来測试。

以上这些是很重要的由于它会影响你以后将怎样使用Redis。

有SQL使用背景的开发人员趋向于降低訪问数据库的次数。这对于不论什么系统来说都是一个好建议,包含Redis。

可是,由于我们常常跟简单的数据结构打交道。我们也须要多次訪问才干达到目的。

刚開始我们可能不适应。但对照曾经的方法这样的代价还是值得的。

6。小结

虽然我们没怎么实际操作Redis。但我们已经了解了非常多必要的知识。可能有些地方还不是非常清楚。不要紧,接下来的章节你可能会不经意间发现答案。

本章重要内容例如以下:

.key是识别value数据的一个字符串标示。

.对Redis而言,value仅仅是一系列字节,无论是何种格式。

.Redis有五种特殊的数据结构。

.综上所述,Redis即快又易用。但并不适合全部场合。

第二章   数据结构

   接下来我们開始学习五种数据结构。

我们会解释每一种数据结构,涉及到的方法,以及它使用的场景。

迄今为止我们还没有接触数据结构的概念。

当我们使用“set”命令的时候。Redis怎么会知道我们使用哪种数据结构呢?事实上每条命令都是针对特定的一种数据结构。比如,当你使用“set”的时候。针对的就是string这样的数据结构。。当你使用“hset”的时候就是针对hash。

各种数据结构具体的方法本书就不再一一列举。感兴趣的能够自行查阅手冊。

只是,不论什么时候,你都能够用“flushdb”来清除全部数据。

1,       Strings

Strings是Redis中最主要的数据结构。当你想到key_value对的时候。正是String结构。

不要被他的名字迷惑,value值能够是不论什么形式。

我们已经见过经常使用的形式了。以下的形式是我们以后会经经常使用到的:

Setusers:leto ‘{“name”:leto,”palnet”:dune,”likes”:[“spice”]}’

另外,Redis提供一些普遍的操作方法。比如。 strlen<key> 用于获取某个key相应的value的长度。getrange<key> <start><end>返回value相应范围的值;append <key><value>将value加到相应的value值后面。

示比例如以下:

如今,你或许会说,非常好,可是这也没什么用啊。你不能有意义的拉出JSON中的值以及附加value值啊。的确,本节内容不过解说一些命令,尤其是对于string的。

前面的时候我们说过Redis是不关心values值的形式的。这句话大部分情况下是正确的。

然而。有些针对String的命令对value的类型还是敏感的。比如incr,incrby,decr,decrby.示比例如以下:

试一下 incr users:leto,会返回一个错误。



        2, Hashes

人们常常说。hash是Redis作为一个key_value存储器的最好的样例。事实上这样的说法有失公允。你看,非常多时候,hashes结构非常像是Strings结构。最重要的差别就是,他们提供了一个额外的间接寻址方式:一个字段。

所以hash的get和set方法例如以下:

我们也能够同一时候设置,获取或者删除多个字段。示比例如以下:

能够看出,hash给我们很多其它可控制的简单字符串。

比起将信息存储到简单的序列化字符串中,我们能够用hash得到更加精确地表示。优点就是比較灵活的得到或者改动,删除特定数据,而不用先获取全部数据。

从一个定义好的对象的视角来看待hash结构。是理解他工作方式的重点。从性能角度讲,细粒度的控制是很实用的。下一章我们会解说hash怎样用来组织数据令查询更加实用。我认为,这才是让hash结构发光的原因。



      3。       LISTS

     Lists同意你针对一个给定的key来存储和操作一个数组value。

你能够依据给定的key添加value,获取第一个或者最后一个value值。

Lists会保持插入顺序。我们能够用一个newusers 的list来追踪最新注冊的用户。

首先我们把一个新用户push进list里面。然后对他进行裁剪使其最多包括50个user。这是一种很普遍的方式。ltrim是一个复杂度为O(n)的操作,很高效。

(这一段实在不知怎样翻译,摘抄例如以下:)(大致意思就是用list存储其它数据结构的key.代码是用ruby写的)

This is also the first time that we are seeing a valuein one key referencing a value in another. If we wanted to get the details ofthe last 10 users, we’d do the following combination:

ids =redis.lrange('newusers', 0, 9)

redis.mget(*ids.map {|u|"users:#{u}"})

The above is a bit of Ruby which shows the type ofmultiple roundtrips we talked about before.

当然,lists不不过善于存储其它keys的引用。它的values也能够是不论什么东西。你能够用它来存储日志,或者用户的訪问网站的动作记录。假设是在游戏中,你能够用来追踪玩家的行为。

4,Sets

Sets数据结构存储无反复的value值。并且是无顺序的,但他提供的基于value值的查询速度很快。示比例如以下:

无论这个用户的朋友有多少,我们都能够在O(1)的时间复杂度内查询出某人是否是它的朋友:

甚至于我们也能够得到两个人是否有同样的朋友:

sinter friends:letofriends:duncan

或者将他们共同的朋友存到还有一个新键值中。

sinterstorefriends:leto_duncan friends:leto friends:duncan

sets集合经常使用于不同意值反复的情况(或者是有inter(取交集),union(取合集)操作的数据)。

       5,  Sorted Sets

最后一个强大的数据结构就是sorted sets,假设说hash是带字段的string结构。那么sorted set 就是带score(分数)的set。

Score提供了排序,比較的功能。比方,我们要做一个朋友的排行榜:

zadd friends:duncan 70ghanima 95 paul 95 chani 75 jessica 1 vladimir

我们要找出score>90(如果score最高为100)的朋友有几个。能够例如以下操作:

zcount friends:duncan 90 100

找出chani 的排名:

zrevrank friends:duncan chani

我们用zrerank 而不是使用zrank 的原因是Redis默认的排序策略是由小到大。而此处须要从大到小排序。故用zrerank。对于sorted sort。最经常使用的样例就是排行榜系统了。

实际上,不论什么须要用一系列整数进行排序,或者须要对score进行一系列操作的都非常适用sorted set结构。

        小结

本节大致了解了一下五种数据结构。比較清楚地是,Redis能做的要比你想到的多。或许如今还有非常多对string或者sorted set的应用没有人想到。

仅仅要你懂得了一些经常用法,就会发现Redis的目的是作为一种解决这个问题的通用方法。当然,不要想当然的觉得Redis提供了五中数据结构以及相应的方法,你就要必须所实用他们。

第三章   数据结构进阶

曾经的章节中我们讨论了数据结构以及他们能解决的问题实例。

如今应该涉及一些比較高级可是通用的设计方法模式了。(待续)

Redis入门经典——The Little Redis Book (翻译)的更多相关文章

  1. redis入门(15)redis的数据备份和恢复

    redis入门(15)redis的数据备份和恢复

  2. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  3. SpringBoot开发二十-Redis入门以及Spring整合Redis

    安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...

  4. redis入门(05)redis的key命令

    一.什么是redis键命令 Redis 键(key):Redis 键命令用于管理 redis 的键. Redis 键命令的基本语法: redis 127.0.0.1:6379> COMMAND ...

  5. redis入门(03)redis的配置

    一.配置文件 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf.你可以通过 CONFIG 命令查看或设置配置项. 二.查看修改 1.查看配置 1.1.vi redis ...

  6. redis入门(02)redis的常见问题

    一.常见问题 1.安装遇到/bin/sh: cc: command not found 解决办法:安装gcc yum install gcc 2.后台启动server端 2.1.问题现象 2.2.解决 ...

  7. <Redis> 入门四 Jedis操作Redis

    pom依赖 <dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> < ...

  8. Redis入门(三)-Redis的安装及操作key的命令介绍

    前两节对Redis做了一些详细的介绍,那么接下来开始我们就正式进入Redis的学习阶段. 安装Redis Windows下安装redis非常方便, 下载压缩包解压即可使用. 链接:https://pa ...

  9. Redis入门到放弃系列-redis安装

    Redis是什么? Redis is an open source (BSD licensed), in-memory data structure store, used as a database ...

随机推荐

  1. @requestBody注解的使用(上)

    1.@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是ap ...

  2. TabHost

    (一) 知识点:id使用系统自带 1.效果图: 2.布局 activity_main.xml <?xml version="1.0" encoding="utf-8 ...

  3. Android之Activity 生命周期

    作用:用户界面的组件,主要用于和用户进行交互.可以理解为手机屏幕的一屏. 生命周期: Resume:“继续”的意思. 由此可见, Activity有四种基本状态: 1) Running:位于屏幕最前端 ...

  4. 关于spring-data-jpa的排序问题

    本测试基于springBoot框架实现. pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  5. touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

    问题:在从 https://c.163.com/hub#/m/repository/?repoId=3093 下载镜像 docker pull hub.c.163.com/library/jenkin ...

  6. js同比例缩放图片

    function DrawImage(ImgD, FitWidth, FitHeight) { var image = new Image(); image.src = ImgD.src; if (i ...

  7. Hibernate 参数匹配查询

    第一种: public User validate(String userName, String password) { String hql = "from User where use ...

  8. 通过案例对SparkStreaming透彻理解三板斧之三

    本课将从二方面阐述: 一.解密SparkStreaming Job架构和运行机制 二.解密SparkStreaming容错架构和运行机制 一切不能进行实时流处理的数据都将是无效的数据.在流处理时代,S ...

  9. iOS适配整理

    iOS12适配问题 1.StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecogn ...

  10. 【Java】Java_05 标识符与字符集

    1.标识符 用作给变量.类和方法命名.注意: 表示类名的标识符用大写字母开始.如:Man, GoodMan 表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始.green(),greenC ...