Redis安装和使用(Ubuntu系统)

大数据学习路线图

本节内容包括Redis简介、安装Redis和Redis实例演示等,Redis在Window系统安装教程可参考http://dblab.xmu.edu.cn/blog/131/#more-131

Redis简介

Redis是一个键值(key-value)存储系统,即键值对非关系型数据库,和Memcached类似,目前正在被越来越多的互联网公司采用。Redis作为一个高性能的键值数据库,不仅在很大程度上弥补了memcached这类键值存储的不足,而且在部分场合下可以对关系数据库起到很好的补充作用。Redis提供了Python、Ruby、Erlang、PHP客户端,使用很方便。
Redis支持存储的值(value)类型包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove以及取交集、并集和差集等丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,Redis中的数据都是缓存在内存中的,它会周期性地把更新的数据写入磁盘,或者把修改操作写入追加的记录文件;此外,Redis还实现了主从(master-slave)同步。

安装Redis

首先登录Linux系统(本教程全部统一使用hadoop用户登录),打开浏览器,访问Redis官网(https://redis.io/)下载安装包redis-3.2.7.tar.gz,或者访问本教程官网的“下载专区”,到“软件”目录下把redis-3.2.7.tar.gz文件下载到本地。下载后的redis-3.2.7.tar.gz文件,保存在“/home/hadoop/下载”目录下。然后,打开一个终端,执行以下命令将Redis解压至“/usr/local/”目录下并重命名:

$ cd ~
$ sudo tar -zxvf ./下载/redis-3.2.7.tar.gz -C /usr/local
$ cd /usr/local
$ sudo mv ./redis-3.2.7 ./redis

然后,执行如下命令把redis目录的权限赋予hadoop用户:

$ sudo chown -R hadoop:hadoop ./redis

接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis:

$ sudo make
$ sudo make install

至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器:

$ cd /usr/local/redis
$ ./src/redis-server

如果有如下图所示的输出,则表示安装成功。
Redis运行成功截图

然后,再新建一个终端,输入如下命令启动Redis客户端:

$ cd /usr/local/redis
$ ./src/redis-cli

如下图所示,客户端连上服务器之后,会显示“127.0.0.1:6379>”的命令提示符信息,表示服务器的IP地址为127.0.0.1,端口为6379。现在可以执行简单的操作,比如,设置键为”hello”,值为”world”,并且取出键为”hello”时对应的值,下图给出了具体的操作效果。
客户端成功连上服务器截图

至此,Redis安装和运行成功,接下来,即可操作Redis数据库。

Redis实例演示

假设有三个表,即Student、Course和SC,三个表的字段(列)和数据如下图所示。
Student表
Course表
SC表

Redis数据库是以<key,value>的形式存储数据,把三个表的数据存入Redis数据库时,key和value的确定方法如下:
* key=表名:主键值:列名
* value=列值
例如,把每个表的第一行记录保存到Redis数据中,需要执行的命令和执行结果如下图所示。
Redis插入数据

可以执行类似的命令,把三个表所有数据都插入到Redis数据库中。然后,针对这些已经录入的数据,下面将简单演示如何进行增删改查操作。Redis支持5种数据类型,不同数据类型,增删改查可能不同,这里用最简单的数据类型字符串作为演示。

插入数据

向Redis插入一条数据,只需要先设计好key和value,然后用set命令插入数据即可。例如,在Course表中插入一门新的课程“算法”,4学分,操作命令和结果如下图所示。
插入数据

修改数据

Redis并没有修改数据的命令,所以,如果在Redis中修改一条数据,只能采用一种变通的方式,即在使用set命令时,使用同样的key,然后用新的value值来覆盖旧的数据。例如,把刚才新添加的“算法”课程名称修改为“编译原理”,操作命令和结果如下图所示。
修改数据

删除数据

Redis有专门删除数据的命令——del命令,命令格式为“del 键”。所以,如果要删除之前新增的课程“编译原理”,只需输入命令“del Course:8:Cname”,如图6-7所示,当输入“del Course:8:Cname”时,返回“1”,说明成功删除一条数据,当再次输入get命令时,输出为空,说明删除成功。
删除数据

查询数据

Redis最简单的查询方式是使用get命令,上面几个操作中都已经使用过get命令,这里不再赘述。

Redis哈希

下表列出了Redis哈希的基本命令(Redis命令对大小写不敏感):
命令 描述
HDEL key field1 [field2] 删除一个或多个哈希表字段
HEXISTS key field 查看哈希表key中,指定的字段是否存在。
HGET key field 获取存储在哈希表中指定字段的值。
HGETALL key 获取在哈希表中指定key的所有字段和值
HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量increment
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量increment
HKEYS key 获取所有哈希表中的字段
HLEN key 获取哈希表中字段的数量
HMGET key field1 [field2] 获取所有给定字段的值
HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中
HSET key field value 将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值
HVALS key 获取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对

这里给出一个具体实例。假设要创建一个Redis哈希,名称为“myhash”,里面包含的字段和值的信息如下:
name age course grade
Xiaoming 21 math 98
可以使用HMSET和HMGET命令来创建和查询,如下所示:

127.0.0.1:6379> HMSET myhash name Xiaoming age 21 course math grade 98
OK
127.0.0.1:6379> HMGET myhash name age course grade
1) "Xiaoming"
2) "21"
3) "math"
4) "98"

如果只想设置或者获得一个值,可以使用HSET和HGET。HSET将哈希表key中的字段field的值设为value,HGET获取存储在哈希表key中指定字段field的值。

128.127.0.0.1:6379> HSET myhash grade 88
(integer) 1
127.0.0.1:6379> HGET myhash grade
"88"
127.0.0.1:6379> HGET myhash name
"Xiaoming"

可以使用HDEL命令删除一个或多个哈希表字段,如下所示:

127.0.0.1:6379> HDEL myhash grade
(integer) 1
127.0.0.1:6379> HGET myhash grade
(nil)
127.0.0.1:6379> HMGET myhash name age coure grade
1) "Xiaoming"
2) "21"
3) "math"
4) (nil)
可以使用HEXISTS命令查看哈希表key中,指定的字段是否存在(存在返回1,不存在返回0),如下所示:
127.0.0.1:6379> HEXISTS myhash name
(integer) 1
127.0.0.1:6379> HEXISTS myhash grade
(integer) 0

可以使用HGETALL获取在哈希表key中的所有字段和值,如下所示:

127.0.0.1:6379> HGETALL myhash
1) "name"
2) "Xiaoming"
3) "age"
4) "21"
5) "course"
6) "math"

Redis Select命令

Redis Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值,即客户端连接到Redis的时候,默认是使用0号数据库。
Redis Select的命令基本语法如下:

127.0.0.1:6379> SELECT index
128

该命令执行完毕后,总是返回OK。
下面给出具体实例:

127.0.0.1:6379> SET db_number 0   # 默认使用 0 号数据库
OK
127.0.0.1:6379> HGET myhash name   #myhash是前面已经创建好的哈希表
"Xiaoming"
127.0.0.1:6379> SELECT 1    # 使用 1 号数据库
OK
127.0.0.1:6379[1]> GET db_number  # 已经切换到 1 号数据库,注意 Redis 现在的命令提示符多了个 [1]
(nil)
127.0.0.1:6379[1]> SET db_number 1
OK
127.0.0.1:6379[1]> GET db_number
"1"
127.0.0.1:6379[1]> HGET myhash name   # 1号数据库中不存在myhash
(nil)
127.0.0.1:6379[1]> SELECT 3    # 再切换到 3 号数据库
OK
127.0.0.1:6379[3]> GET db_number   # 提示符从 [1] 改变成了 [3]
(nil)
127.0.0.1:6379[3]> SET db_number 3
OK
127.0.0.1:6379[3]> GET db_number
"3"
127.0.0.1:6379[3]> SELECT 0   # 再切换到 0 号数据库
OK
127.0.0.1:6379> GET db_number
"0"
127.0.0.1:6379> HGET myhash name   #myhash是前面已经创建好的哈希表
"Xiaoming"