当前位置:首页 > 经验 >

redis入门基础教程(redis简单入门和实例)

来源:原点资讯(www.yd166.com)时间:2022-10-31 23:03:36作者:YD166手机阅读>>

学会如何安装和运行Redis,并了解Redis的基础知识后,本章将详细介绍Redis的5种主要数据类型及相应的命令,带领读者真正进入Redis的世界。在学习的时候,手边打开一个redis-cli程序来跟着一起输入命令将会极大地提高学习效率。尽管在目前多数公司和团队的Redis的应用是以缓存和队列为主。

在之后的章节中你会遇到两个学习伙伴:小白和宋老师。小白是一个标准的极客,最近刚开始他的Redis学习之旅,而他大学时的计算机老师宋老师恰好对Redis颇有研究,于是就顺理成章地成为了小白的私人Redis教师。这不,小白想基于Redis开发一个博客,于是找到宋老师,向他请教。在本章中宋老师会向小白介绍Redis最核心的内容—数据类型,从他们的对话中你一定能学到不少知识!

3.2节到3.6节这5节将分别介绍Redis的5种数据类型,其中每节都是由4个部分组成,依次是“介绍”、“命令”、“实践”和“命令拾遗”。“介绍”部分是对数据类型的概述,“命令”部分会对“实践”部分将用到的命令进行介绍,“实践”部分会讲解该数据类型在开发中的应用方法,“命令拾遗”部分会对该数据类型其他比较有用的命令进行补充介绍。

3.1 热身

在介绍Redis的数据类型之前,我们先来了解几个比较基础的命令作为热身,赶快打开redis-cli,跟着样例亲自输入命令来体验一下吧!

1.获得符合规则的键名列表

KEYS pattern

pattern支持glob风格通配符格式,具体规则如表3-1所示。

表3-1 glob风格通配符规则

符 号含  义
?  匹配一个字符
*  匹配任意个(包括0个)字符
[]  匹配括号间的任一字符,可以使用“-”符号表示一个范围,如a[b-d]可以匹配“ab”、“ac”和“ad”
\x  匹配字符x,用于转义符号。如要匹配“?”就需要使用\?

现在Redis中空空如也(如果你从第2章开始就一直跟着本书的进度输入命令,此时数据库中可能还会有个foo键),为了演示KEYS命令,首先我们得给Redis加点料。使用SET命令(会在3.2节介绍)建立一个名为bar的键:

redis> SET bar 1 OK

然后使用KEYS *就能获得Redis中所有的键了(当然由于数据库中只有一个bar键,所以KEYS ba*或者KEYS bar等命令都能获得同样的结果):

redis> KEYS * 1) "bar"

注意

KEYS命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境中使用。

提示

Redis不区分命令大小写,但在本书中均会使用大写字母表示Redis命令。

2.判断一个键是否存在

EXISTS key

如果键存在则返回整数类型1,否则返回0。例如:

redis> EXISTS bar (integer) 1 redis> EXISTS noexists (integer) 03.删除键

DEL key [key …]

可以删除一个或多个键,返回值是删除的键的个数。例如:

redis> DEL bar (integer) 1 redis> DEL bar (integer) 0

第二次执行DEL命令时因为bar键已经被删除了,实际上并没有删除任何键,所以返回0。

技巧

DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键。比如要删除所有以“user:”开头的键,就可以执行redis-cli KEYS "user:*"|xargs redis-cli DEL。

另外由于DEL命令支持多个键作为参数,所以还可以执行redis-cli DEL``redis-cli KEYS "user:*" 来达到同样的效果,但是性能更好。

4.获得键值的数据类型

TYPE key

TYPE命令用来获得键值的数据类型,返回值可能是string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。例如:

redis> SET foo 1 OK redis> TYPE foo string redis> LPUSH bar 1 (integer) 1 redis> TYPE bar list

LPUSH命令的作用是向指定的列表类型键中增加一个元素,如果键不存在则创建它,3.4节会详细介绍。

3.2 字符串类型

作为一个爱造轮子的资深极客,小白每次看到自己博客最下面的“Powered by WordPress”{![即“由WordPress驱动”。WordPress是一个开源的博客程序,用户可以借其通过简单的配置搭建一个博客或内容管理系统。]}都觉得有些不舒服,终于有一天他下定决心要开发一个属于自己的博客。但是用腻了MySQL数据库的小白总想尝试一下新技术,恰好上次参加Node Party时听人介绍过Redis数据库,便想着趁机试一试。可小白只知道Redis是一个键值对数据库,其他的一概不知。抱着试一试的态度,小白找到了自己大学时教计算机的宋老师,一问之下欣喜地发现宋老师竟然对Redis颇有研究。宋老师有感于小白的好学,决定给小白开个小灶。

小白:

宋老师您好,我最近听别人介绍过Redis,当时就对它很感兴趣。恰好最近想开发一个博客,准备尝试一下它。有什么能快速学会Redis的方法吗?

宋老师笑着说:

心急吃不了热豆腐,要学会Redis就要先掌握Redis的键值数据类型和相关的命令,这些内容是Redis的基础。为了让你更全面地了解Redis的每种数据类型,接下来我会先讲解如何将Redis作为数据库使用,但是实际上Redis可不只是数据库这么简单,更多的公司和团队将Redis用作缓存和队列系统,而这部分内容等你掌握了Redis的基础后我会再进行介绍。作为开始,我先来讲讲Redis中最基本的数据类型—字符串类型。

3.2.1 介绍

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON 化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512 MB{![ Redis的作者考虑过让字符串类型键支持超过 512 MB大小的数据,未来的版本也可能会放宽这一限制,但无论如何,考虑到Redis的数据是使用内存存储的,512 MB的限制已经非常宽松了。]}。

字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。学习过本章后面几节后相信读者对此会有更深的理解。

3.2.2 命令1.赋值与取值

SET key value GET key

SET和GET是Redis中最简单的两个命令,它们实现的功能和编程语言中的读写变量相似,如key = "hello"在Redis中是这样表示的:

redis> SET key hello OK

想要读取键值则更简单:

redis> GET key "hello"

当键不存在时会返回空结果。

为了节约篇幅,同时避免读者过早地被编程语言的细节困扰,本书大部分章节将只使用redis-cli进行命令演示(必要的时候会配合伪代码),第5章会专门介绍在各种编程语言(PHP、Python、Ruby和Node.js)中使用Redis的方法。

不过,为了能让读者提前对Redis命令在实际开发时的用法有一个直观的体会,这里会先使用PHP实现一个SET/GET命令的示例网页:用户访问示例网页时程序会通过GET命令判断Redis中是否存储了用户的姓名,如果有则直接将姓名显示出来(如图3-1所示),如果没有则会提示用户填写(如图3-2所示),用户单击“提交”按钮后程序会使用SET命令将用户的姓名存入到Redis中。

redis入门基础教程,redis简单入门和实例(1)

3-2{441}

图3-1 设置过姓名时的页面

redis入门基础教程,redis简单入门和实例(2)

3-1{440}

              图3-2 没有设置过姓名时的页面

代码如下:

<?php // 加载Predis库的自动加载函数 require './predis/autoload.php'; // 连接Redis $redis= new Predis\Client(array(   'host'   => '127.0.0.1',   'port'   => 6379 )); // 如果提交了姓名则使用SET命令将姓名写入到Redis中 if ($_GET['name']) {   $redis->set('name', $_GET['name']); } // 通过GET命令从Redis中读取姓名 $name = $redis->get('name'); ?><!DOCTYPE html> <html>   <head>     <meta charset="utf-8" />     <title>我的第一个Redis程序</title>   </head>   <body>    <?php if ($name): ?>     <p>您的姓名是:<?php echo $name; ?></p>    <?php else: ?>     <p>您还没有设置姓名。</p>    <?php endif; ?>    <hr />    <h1>更改姓名</h1>    <form>     <p>      <label for="name">您的姓名:</label>      <input type="text" name="name" id="name" />     </p>     <p>      <button type="submit">提交</button>     </p>    </form>   </body> </html>

在这个例子中我们使用PHP的Redis客户端库Predis与Redis通信。5.1节会专门介绍Predis,有兴趣的读者可以先跳到5.1节查看Predis的安装方法来实际运行这个例子。

Redis的其他命令也可以使用Predis通过同样的方式调用,如马上要介绍的INCR命令的调用方法是$redis->incr(键名)。

2.递增数字

INCR key前面说过字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,Redis提供了一个实用的命令`INCR`,其作用是让当前键值递增,并返回递增后的值,用法为: redis> INCR num (integer) 1 redis> INCR num (integer) 2 当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。当键值不是整数时Redis会提示错误: redis> SET foo lorem OK redis> INCR foo (error) ERR value is not an integer or out of range 有些读者会想到可以借助`GET`和`SET`两个命令自己实现`incr`函数,伪代码如下: def incr($key)   $value = GET $key   if not $value       $value = 0   $value = $value 1   SET $key, $value   return $value

如果Redis同时只连接了一个客户端,那么上面的代码没有任何问题(其实还没有加入错误处理,不过这并不是此处讨论的重点)。可当同一时间有多个客户端连接到Redis时则有可能出现竞态条件(race condition){![竞态条件是指一个系统或者进程的输出,依赖于不受控制的事件的出现顺序或者出现时机。]}。例如有两个客户端A和B都要执行我们自己实现的incr函数并准备将同一个键的键值递增,当它们恰好同时执行到代码第二行时二者读取到的键值是一样的,如“5”,而后它们各自将该值递增到“6”并使用SET命令将其赋给原键,结果虽然对键执行了两次递增操作,最终的键值却是“6”而不是预想中的“7”。包括INCR在内的所有Redis命令都是原子操作(atomic operation){![原子操作取“原子”的“不可拆分”的意思,原子操作是最小的执行单位,不会在执行的过程中被其他命令插入打断。]},无论多少个客户端同时连接,都不会出现上述情况。之后我们还会介绍利用事务(4.1节)和脚本(第6章)实现自定义的原子操作的方法。

3.2.3 实践1.文章访问量统计

博客的一个常见的功能是统计文章的访问量,我们可以为每篇文章使用一个名为post:文章ID:page.view的键来记录文章的访问量,每次访问文章的时候使用INCR命令使相应的键值递增。

提示

Redis对于键的命名并没有强制的要求,但比较好的实践是用“对象类型:对象ID:对象属性”来命名一个键,如使用键user:1:friends来存储ID为1的用户的好友列表。对于多个单词则推荐使用“.”分隔,一方面是沿用以前的习惯(Redis以前版本的键名不能包含空格等特殊字符),另一方面是在redis-cli中容易输入,无需使用双引号包裹。另外为了日后维护方便,键的命名一定要有意义,如u:1:f的可读性显然不如user:1:friends好(虽然采用较短的名称可以节省存储空间,但由于键值的长度往往远远大于键名的长度,所以这部分的节省大部分情况下并不如可读性来得重要)。

2.生成自增ID

那么怎么为每篇文章生成一个唯一ID呢?在关系数据库中我们通过设置字段属性为AUTO_INCREMENT来实现每增加一条记录自动为其生成一个唯一的递增ID的目的,而在Redis中可以通过另一种模式来实现:对于每一类对象使用名为对象类型(复数形式):count{![这个键名只是参考命名,实际应用中可以使用任何容易理解的名称。]}的键(如users:count)来存储当前类型对象的数量,每增加一个新对象时都使用INCR命令递增该键的值。由于使用INCR命令建立的键的初始键值是1,所以可以很容易得知,INCR命令的返回值既是加入该对象后的当前类型的对象总数,又是该新增对象的ID。

3.存储文章数据

由于每个字符串类型键只能存储一个字符串,而一篇博客文章是由标题、正文、作者与发布时间等多个元素构成的。为了存储这些元素,我们需要使用序列化函数(如PHP中的serialize和JavaScript中的JSON.stringify)将它们转换成一个字符串。除此之外因为字符串类型键可以存储二进制数据,所以也可以使用MessagePack进行序列化,速度更快,占用空间也更小。

至此我们已经可以写出发布新文章时与Redis操作相关的伪代码首先获得新文章的ID

$postID = INCR posts:count alert("Hello CSDN"); 将博客文章的诸多元素序列化成字符串 $serializedPost = serialize($title, $content, $author, $time) 把序列化后的字符串存一个入字符串类型的键中 SET post:$postID:data, $serializedPost文章数据的伪代码如下(以访问ID为42的文章为例):

从Redis中读取文章数据 $serializedPost = GET post:42:data 将文章数据反序列化成文章的各个元素 $title, $content, $author, $time = unserialize($serializedPost) 获取并递增文章的访问数量 $count = INCR post:42:page.view

除了使用序列化函数将文章的多个元素存入一个字符串类型键中外,还可以对每个元素使用一个字符串类型键来存储,这种方法会在3.3.3节讨论。

3.2.4 命令拾遗1.增加指定的整数

INCRBY key increment

alert("Hello CSDN");

`INCRBY`命令与`INCR`命令基本一样,只不过前者可以通过`increment`参数指定一次增加的数值,如: redis> INCRBY bar 2 (integer) 2 redis> INCRBY bar 3 (integer) 5 alert("Hello CSDN");2.减少指定的整数

DECR key

DECRBY key decrement

DECR命令与INCR命令用法相同,只不过是让键值递减,例如:

redis> DECR bar (integer) 4

而DECRBY命令的作用不用介绍想必读者就可以猜到,DECRBY key 5相当于INCRBY key –5。

3.增加指定浮点数

INCRBYFLOAT key increment

INCRBYFLOAT命令类似INCRBY命令,差别是前者可以递增一个双精度浮点数,如:

redis> INCRBYFLOAT bar 2.7 "6.7" redis> INCRBYFLOAT bar 5E 4 "50006.69999999999999929"4.向尾部追加值

APPEND key value

APPEND作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于SET key value。返回值是追加后字符串的总长度。如:

redis> SET key hello OK redis> APPEND key " world!" (integer) 12

此时key的值是"hello world!"。APPEND命令的第二个参数加了双引号,原因是该参数包含空格,在redis-cli中输入需要双引号以示区分。

5.获取字符串长度

STRLEN key

STRLEN命令返回键值的长度,如果键不存在则返回0。例如:

redis> STRLEN key (integer) 12 redis> SET key 你好 OK redis> STRLEN key (integer) 6

前面提到了字符串类型可以存储二进制数据,所以它可以存储任何编码的字符串。例子中Redis接收到的是使用UTF-8编码的中文,由于“你”和“好”两个字的UTF-8编码的长度都是3,所以此例中会返回6。

6.同时获得/设置多个键值

MGET key [key …]

MSET key value [key value …]

MGET/MSET与GET/SET相似,不过MGET/MSET可以同时获得/设置多个键的键值。例如:

redis> MSET key1 v1 key2 v2 key3 v3 OK redis> GET key2 "v2" redis> MGET key1 key3 1) "v1" 2) "v3"7.位操作

GETBIT key offset

SETBIT key offset value

BITCOUNT key [start] [end]

BITOP operation destkey key [key …]

一个字节由8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。为了演示,我们首先将foo键赋值为bar:

redis> SET foo bar OK

bar的3个字母“b”“a”和“r”对应的ASCII码分别为98、97和114,转换成二进制后分别为1100010、1100001和1110010,所以foo键中的二进制位结构如图3-3所示。

redis入门基础教程,redis简单入门和实例(3)

3-3{513}

图3-3 bar的二进制存储结构

GETBIT命令可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始:

redis> GETBIT foo 0 (integer) 0 redis> GETBIT foo 6 (integer) 1

如果需要获取的二进制位的索引超出了键值的二进制位的实际长度则默认位值是0:

redis> GETBIT foo 100000 (integer) 0

SETBIT命令可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值。如我们要将foo键值设置为aar,可以通过位操作将foo键的二进制位的索引第6位设为0,第7位设为1:

redis> SETBIT foo 6 0 (integer) 1 redis> SETBIT foo 7 1 (integer) 0 redis> GET foo "aar"

如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位设置为0,同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0:

redis> SETBIT nofoo 10 1 (integer) 0 redis> GETBIT nofoo 5 (integer) 0

BITCOUNT命令可以获得字符串类型键中值是1的二进制位个数,例如:

redis> BITCOUNT foo (integer) 10

可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节(即"aa"):

redis> BITCOUNT foo 0 1 (integer) 6

BITOP命令可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。BITOP命令支持的运算操作有AND、OR、XOR和NOT。如我们可以对bar和aar进行OR运算:

redis> SET foo1 bar OK redis> SET foo2 aar OK redis> BITOP OR res foo1 foo2 (integer) 3 redis> GET res "car"

运算过程如图3-4所示。

redis入门基础教程,redis简单入门和实例(4)

栏目热文

redis 使用手册(redis使用手册)

redis 使用手册(redis使用手册)

墨墨导读:最近机械工业出版社华章分社出版了《Redis使用手册》,本书系统化介绍Redis命令及其应用场景,内容深入,图...

2022-10-31 23:00:16查看全文 >>

redis教程入门到实战(redis新手入门到精通)

redis教程入门到实战(redis新手入门到精通)

阅读本文大约需要 16 分钟。大家好,这里是 Java后端。这篇文章我想和你聊一聊 Redis 的最佳实践。你的项目或许...

2022-10-31 23:26:33查看全文 >>

redis超详细教程(redis详细图解)

redis超详细教程(redis详细图解)

在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没...

2022-10-31 22:43:17查看全文 >>

redis基础知识图解(redis入门手把手学习笔记超详细)

redis基础知识图解(redis入门手把手学习笔记超详细)

什么是哨兵?哨兵(Sentinel)是 Redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,但是单纯的...

2022-10-31 22:52:22查看全文 >>

redis菜鸟教程(redis入门教程超详细)

redis菜鸟教程(redis入门教程超详细)

实战:20200520验证OK1、宿主机霞新建目录#mkdir -p /opt/redis#mkdir -p /opt/...

2022-10-31 22:55:21查看全文 >>

使用redis的步骤(redis使用手册)

使用redis的步骤(redis使用手册)

启动Redis服务 systemctl start redis 或者systemctl restart redis ...

2022-10-31 22:44:20查看全文 >>

redis基本知识(redis十大基础知识)

redis基本知识(redis十大基础知识)

最近Redis差不多看完了,前面学的也忘了好多,所以正好写篇博客复习复习。此篇介绍的是redis的基础篇,希望这篇能帮到...

2022-10-31 23:05:23查看全文 >>

redis入门精通(redis零基础入门到精通)

redis入门精通(redis零基础入门到精通)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、H...

2022-10-31 23:22:24查看全文 >>

redis快速入门教程(redis入门教程超详细)

redis快速入门教程(redis入门教程超详细)

作者:民工哥链接:https://segmentfault.com/a/11900000223535941、redis简...

2022-10-31 22:45:18查看全文 >>

redis使用与学习

redis使用与学习

一、Redis介绍  Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日...

2022-10-31 22:43:53查看全文 >>

文档排行