本文介绍: Redis是一个速度非常快的非关系型数据库(),它可以存储键(key)和五种不同类型的值(value)之间的映射mapping),可基于内存存储亦可持久化到硬盘日志型,Key-Value数据库。Redis字符串(STRING列表(LIST集合(SET哈希(HASH有序集合(ZSETZSET可以说是Redis特有的数据结构我们会在之后的实训中详细介绍它,在本实训中,我们只简要介绍他们的功能和小部分命令。结构类型存储的值STRING字符串、整数或浮点数LIST。

1Redis简介2快速安装RedisPython3Redis数据结构简介

Redis简介

Redis 是一个速度非常快的非关系型数据库non-relational database),它可以存储键(key)和五种不同类型的值(value)之间的映射mapping),可基于内存存储亦可持久化到硬盘日志型,Key-Value 数据库

Redis与其他数据库的对比

如果你使用过关系型数据库,例如:Mysql,那么你肯定写过关联两张表数据查询语句。而 Redis 属于 NoSQL,它不使用表,也不会预定义数据模式或强制用户Redis 的各种数据进行关联。

NoSQLNot Only SQL

意指“不仅仅是SQL”,其泛指非关系型数据库,主要分为四类:键值Key-Value存储数据库,列存储数据库,文档数据库,图形Graph数据库。

Redis 也经常与高性能键值缓存服务器 memcached比较:两者均可用于存储键值映射,性能相差也甚少,但 Redis 能存储除普通字符串值之外的四种数据结构,而 memcached 只能存储普通的字符串值。这些不同使得 Redis 能够解决更为广泛的问题,而且既能作为主数据库使用,也可以作为辅助数据库使用

我们通过一张表来对比常用的数据库与缓存服务器

名称 类型 数据存储选项 查询类型 附加功能
Redis 基于内存的非关系型数据库 字符串、列表集合哈希有序集合 针对数据类型专属命令,另有批量操作和不完全的事务支持 发布与订阅、复制、持久化、脚本扩展
memcached 基于内存的键值缓存 键值映射 创建、读取、更新删除 多线程支持
MySQL 关系型数据库 数据表视图 查询插入、更新、删除、内置函数自定义存储过程等 支持 ACID 性质、复制等
MongoDB 基于硬盘的非关系型文档存储数据库 无 schema 的 BSON 文档 创建、读取、更新、删除条件查询 复制、分片、空间索引
Redis的特性

由于 Redis 是内存型数据库,在使用之前就要考虑当服务器关闭时,服务器存储的数据是否能保留。Redis 拥有两种不同形式的持久化方法,都可以用紧凑的格式将数据写入硬盘:

除此之外,为了扩展 Redis 的读性能,并为 Redis 提供故障转移支持,Redis 实现了主从复制特性

快速安装 Redis 与 Python

为了避免安装到旧版 Redis 问题我们直接使用源码编译安装 Redis,首先你需要获取安装 make 等一系列构建工具:

  1. $ sudo apt-get update
  2. $ sudo apt-get install make gcc python-dev

构建工具安装完毕后,你需要执行以下操作

其中,安装 Redis 的过程如下:

  1. ~:$ wget -q http://download.redis.io/releases/redis-5.0.0.tar.gz
  2. ~:$ tar -xzf redis-5.0.0.tar.gz
  3. ~:$ cd redis-5.0.0
  4. # 注意观察编译消息,最后不应该产生任何错误(`Error`)
  5. ~/redis-5.0.0:$ make
  6. # 注意观察安装消息,最后不应该产生任何错误(`Error`)
  7. ~/redis-5.0.0:$ sudo make install
  8. # 启动 Redis 服务器,注意通过日志确认 Redis 顺利启动
  9. ~/redis-5.0.0:$ redis-server redis.conf

除了上述的启动 Redis 服务器方式,你还可以通过 Redis 默认的配置后台启动它(常用启动方式):

$ redis-server &

因为近几年发布的 UbuntuDebian 都预装了 Python 2.6Python 2.7,所以你不再需要时间去安装 Python。你可以通过一个名为 setuptools 的辅助包更方便的下载和安装 Redis 客户端:

~:$ sudo python -m easy_install redis hiredis

这里redis 包为 Python 提供了连接 Redis 接口hiredis 包则是可选的,它是一个使用 C 语言编写的高性能 Redis 客户端。

Redis数据结构简介

Redis 的五种数据结构分别是:

ZSET 可以说是 Redis 特有的数据结构,我们会在之后的实训中详细介绍它,在本实训中,我们只简要介绍他们的功能和小部分命令。他们的存储的值如下:

结构类型 存储的值
STRING 字符串、整数或浮点数
LIST 一个链表,上面的每个节点都是一个字符串
SET 包含若干个字符串的无序集合,且集合中的元素都是唯一的
HASH 包含键值对的无序散列表
ZSET 成员中的字符串与分值的有序映射,其排序由分值决定

在安装完 Redis 启动redis-server 后,我们可以使用 redis-cli 控制台与 Redis 进行交互,其启动方式是在终端输入

$ redis-cli

其会默认连接本机 6379 端口启动的 Redis 服务器,接下俩你可以使用它来体验 Redis 各种数据结构和其命令的使用

Redis中的字符串

STRING 拥有一些和其他键值存储相似的命令,比如 GET(获取值),SET设置值),DEL删除值)等,例如:

  1. $ redis-cli
  2. redis-cli 127.0.0.1:6379> set hello redis
  3. OK
  4. redis-cli 127.0.0.1:6379> get hello
  5. "redis"
  6. redis-cli 127.0.0.1:6379> del hello
  7. (integer) 1
  8. redis-cli 127.0.0.1:6379> get hello
  9. (nil)

其中:

Redis中的列表

就像前面所说的,Redis 中的列表是一个“链表”,这和大多数编程语言相似。所以他们的操作也十分相似:

我们通过 redis-cli 来亲自体验:

  1. redis 127.0.0.1:6379> rpush testlist item
  2. (integer) 1
  3. redis 127.0.0.1:6379> rpush testlist item2
  4. (integer) 2
  5. redis 127.0.0.1:6379> rpush testlist item
  6. (integer) 3
  7. redis 127.0.0.1:6379> lrange testlist 0 -1
  8. 1) "item"
  9. 2) "item2"
  10. 3) "item"
  11. redis 127.0.0.1:6379> lindex testlist 1
  12. "item2"
  13. redis 127.0.0.1:6379> lpop testlist
  14. "item"
  15. redis 127.0.0.1:6379> lrange testlist 0 -1
  16. 1) "item2"
  17. 2) "item"

我们可以看出,在列表中,元素可以重复出现。在后续的实训中,我们还会介绍更多列表命令,现在我们先来了解以下 Redis 中的集合

Redis中的集合

集合和列表的区别就在于:列表可以存储多个相同的字符串,而集合通过散列表来保证存储的字符串都是各不相同的(这些散列表只有键,而没有对应的值)。

由于集合是无序的,所以我们只能通过统一的 SADD 命令将元素添加到集合中,SREM 命令将元素从集合中移除。你还可以通过:

  • SMEMBERS 命令获取到集合中的所有元素
  • SISMEMBER 命令来判断一个元素是否已存在在集合中
  1. redis 127.0.0.1:6379> sadd testset item
  2. (integer) 1
  3. redis 127.0.0.1:6379> sadd testset item2
  4. (integer) 1
  5. redis 127.0.0.1:6379> sadd testset item
  6. (integer) 0
  7. redis 127.0.0.1:6379> smembers testset
  8. 1) "item"
  9. 2) "item2"
  10. redis 127.0.0.1:6379> sismember testset item3
  11. (integer) 0
  12. redis 127.0.0.1:6379> sismember testset item
  13. (integer) 1
  14. redis 127.0.0.1:6379> srem testset item2
  15. (integer) 1
  16. redis 127.0.0.1:6379> srem testset item2
  17. (integer) 0
  18. redis 127.0.0.1:6379> smembers testset
  19. 1) "item"

上面示例的集合中包含的元素少,所以执行 SMEMBERS 命令没有问题,一旦集合中包含的元素非常多时,SMEMBERS 命令的执行速度会很慢,所以要谨慎的使用这个命令。

Redis中的哈希

哈希可以存储多个键值对之间的映射。和字符串一样,哈希存储的值既可以是字符串又可以是数字值,并且可以对数字值进行自增/自减操作

哈希就像是一个缩小版的 Redis,有一系列命令对哈希进行插入、获取、删除


  1. redis 127.0.0.1:6379> hset testhash key1 value1
  2. (integer) 1
  3. redis 127.0.0.1:6379> hset testhash key2 value2
  4. (integer) 1
  5. redis 127.0.0.1:6379> hset testhash key1 newvalue
  6. (integer) 0
  7. redis 127.0.0.1:6379> hgetall testhash
  8. 1) "key1"
  9. 2) "newvalue"
  10. 3) "key2"
  11. 4) "value2"
  12. redis 127.0.0.1:6379> hdel testhash key2
  13. (integer) 1
  14. redis 127.0.0.1:6379> hget testhash key1
  15. "newvalue"
  16. redis 127.0.0.1:6379> hgetall testhash
  17. 1) "key1"
  18. 2) "newvalue"

其中:

  • hset 用于插入元素
    • 第一个参数为该哈希的键名,如果该哈希不存在,则创建一个
    • 第二个参数为哈希中的域名
      • 如果不存在,则创建该域,并与第三个参数的值进行映射
  • 如果存在,则使用第三个参数更新该域的值
    • 第三个参数为哈希中的值
  • hgetall 会获取到该哈希的所有域-值对
  • hget 用于获取哈希中的某一个域
  • hdel 用户删除哈希中的某一个域
Redis中的有序集合

有序集合和哈希一样,也是存储键值对。

只是有序集合的键被称为成员member),每个成员都是唯一的,有序集合的值则被称为分值(score),这个分值必须为浮点数。所以有序集合既可以通过成员访问元素,也可以通过分值来排序元素。

我们可以通过:

  • ZADD 命令将带有指定分值的成员添加到有序集合中
  • ZRANGE 命令根据分值有序排列后的集合获取到指定范围的元素
  • ZRANGEBYSCORE 命令获取指定分值范围内的元素
  • ZREM 命令从有序集合中删除指定成员

我们也可以在 redis-cli 中验证上述命令的功能

  1. redis 127.0.0.1:6379> zadd testzset 100 member1
  2. (integer) 1
  3. redis 127.0.0.1:6379> zadd testzset 200 member0
  4. (integer) 1
  5. redis 127.0.0.1:6379> zrange testzset 0 -1 withscores
  6. 1) "member1"
  7. 2) "100"
  8. 3) "member0"
  9. 4) "200"
  10. redis 127.0.0.1:6379> zrangebyscore testzset 0 150 withscores
  11. 1) "member1"
  12. 2) "100"
  13. redis 127.0.0.1:6379> zrem testzset member1
  14. (integer) 1
  15. redis 127.0.0.1:6379> zrange testzset 0 -1 withscores
  16. 1) "member0"
  17. 2) "200"
要求

根据提示,打开命令行,启动 Redis 客户端并创建一些值:

原文地址:https://blog.csdn.net/qq_58647543/article/details/134596344

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_3307.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注