非关系型数据库 Redis

时间:2022-07-26
本文章向大家介绍非关系型数据库 Redis,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 简介

1.1.1 非关系型数据库

  NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。随着互联网 web 2.0 网站的兴起,传统的关系数据库在应付 web 2.0 网站,特别是超大规模和高并发的 SNS(社交) 类型的 web 2.0 纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

1.1.2 Redis

  Redis 是一个 key-value 存储系统。它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合) 和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。   Redis 是一个高性能的非关系型数据库。Redis 的出现,很大程度补偿了 memcached 这类 key/value 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang 等客户端,使用很方便。

1.1.3 安装

☞ Linux

  先从 Redis 中文网 上下载对应版本的压缩包,注意官方只提供 Linux 版本,不提供 Windows 版本的 Redis。将下载好的压缩包上传至服务器后使用解压命令将其解压。

  进入解压好的目录,使用 make 命令对文件进行编译

  编译完成之后,可以进入 src 目录使用 ./redis-server ../redis.conf 命令启动 Redis,默认端口为 6379。redis.conf 是一个默认的配置文件,可以根据需要使用自己的配置文件。

  启动 Redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。

☞ Windows

  官方并没有提供 Windows 版本的 Redis,想要在 Windows 中使用就需要下载其他大神的 修改版,同样下载 zip 解压之后就可以使用了。

  直接双击 redis-server.exe 就可以启动服务端,同样双击 redis-cli.exe 启动测试客户端。

1.1.4 可视化工具

JetBrains 出品的 DataGrip 数据库工具安装 Redis 或者 ledis 插件之后就可以查看 Redis 中的数据

1.2 Redis 数据类型

类型

简介

特性

场景

string(字符串)

二进制安全

可以包含任何数据,比如 jpg 图片或者序列化的对象,一个键最大能存储 512M

hash(字典)

键值对集合,即编程语言中的 Map 类型

适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值

存储、读取、修改用户属性

list(列表)

链表(双向链表)

增删快,提供了操作某一段元素的 API

1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列

set(集合)

哈希表实现,元素不重复

1.添加、删除、查找的复杂度都是 O(1) 2.为集合提供了求交集、并集、差集等操作

1.共同好友 2.利用唯一性,统计访问网站的所有独立 ip 3.好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐

sorted set(有序集合)

将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列

数据插入集合时,已经进行天然排序

1.排行榜 2.带权重的消息队列

1.2.1 string

☞ 存储数据(set key value)

☞ 获取数据(get key)

☞ 删除数据(del key)

1.2.2 hash

☞ 存储数据(hset key field value)

☞ 获取指定数据(hget key field)

☞ 获取所有数据(hgetall key)

☞ 删除数据(hdel key field)

1.2.3 list

☞ 左侧(头部)加入集合(lpush key value)

☞ 从右侧(尾部)加入集合(rpush key value)

☞ 获取数据(lrange key start end)

  start 为起始索引,end 为终止索引,end 为 -1 时代表末尾。

☞ 删除最左(头部)侧数据(lpop key)

☞ 删除最右(尾部)侧数据(rpop key)

☞ 删除所有(del key)

1.2.4 set

☞ 存储数据(sadd key value)

☞ 获取数据(smembers key)

☞ 删除数据(srem key value)

1.2.5 sortedset

☞ 存储数据(zadd key score value)

☞ 获取数据(zrange key start end [withscores])

☞ 删除数据(zrem key value)

通用命令【慎用】 keys *: 查询所有的键; type key: 获取键对应的 value 的类型; del key:删除指定的 key value; flushdb:清空 redis 数据库;

1.3 Redis 持久化

1.3.1 概述

  由于 Redis 的数据都存放在内存中,如果没有配置持久化,Redis 重启后数据就全丢失了,于是需要开启 Redis 的持久化功能,将数据保存到磁盘上,当 Redis 重启后,可以从磁盘中恢复数据。Redis 提供两种方式进行持久化,一种是 RDB 持久化,原理是将 Redis 在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化;另外一种是 AOF(append only file)持久化,原理是将 Reids 的操作日志以追加的方式写入文件。

1.3.2 RDB

  RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。RDB 持久化不需要进行配置,默认就使用这种机制, 在一定的间隔时间中,检测 key 的变化情况,然后持久化数据。注意:采用 RDB 方式持久化,会有一小部分数据有可能数据丢失!

☞ 相关配置(redis.conf)

  如果想要使用持久化配置启动,必须使用 redis-server.exe redis.windows.conf 关联配置文件启动 Redis 服务就可以实现持久化。注意:双击 redis-server.exe,是不会关联配置文件启动的!

1.3.3 AOF

  AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。可以每一次命令操作后,持久化数据。

☞ 相关配置(redis.conf)

1.3.4 RDB 与 AOF 对比

☞ RDB 优势

 ① 数据的备份和恢复非常方便,因为一个数据库只有一个持久化文件  ② 性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行 IO 操作了。  ③ 相比于 AOF 机制,如果数据集很大,RDB 的启动效率会更高。

☞ RDB 缺点

 ① 系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。(可能会有小部分数据丢失现象存在)  ② 由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是 1 秒钟。

☞ AOF 优势

 ① 该机制可以带来更高的数据安全性,即数据持久性。Redis 中提供了 3 种同步策略,即每秒同步、每修改同步和不同步。  ① 对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。  ① 如果日志过大,Redis 可以自动启用 rewrite 机制迅速“瘦身”(也可手动触发 aof 的 rewrite 操作,命令: bgrewriteaof)  ④ AOF日志格式清晰、易于理解,很容易用 AOF 日志文件完成数据的重建。

☞ AOF 缺点

 ① 对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。(重复保存)  ② 根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效。