一文入门Redis

一、Redis简介

Redis:REmote DIctionary Server(远程字典服务)。是一款使用C语言编写的、开源的、基于内存的、高性能的、可持久化的非关系型Key-Value数据库。

二、常用数据类型

1、String(字符串)

string是redis最基本的数据类型,一个key对应一个value。string类型是二进制安全的,可以包含任何数据,包括图片、序列化的对象等,最大存储512MB。

常用命令:

命令 描述 用法
SET 1、将value关联到key;2、key已关联则覆盖;3、原本key带有TTL(生存时间),那么TTL被清楚 SET key value
GET 1、返回key所关联的字符串值;2、key不存在返回null; GET key
SETEX 1、将value关联到key;2、设置key生存时间为seconds,单位为秒;3、如果key已关联则覆盖;4、原子操作,关联与设置生存时间同时完成 SETEX key seconds value
SETNX 1、将value关联到key,当且仅当key不存在;2、若key已存在,不做任何动作 SETNX key value

2、Hash(哈希)

hash是一个string类型的field和value的映射表,key 还是key,但是value是多个键值对(key-value),比较适合存储对象。

常用命令:

命令 描述 用法
HSET 1、将key中的field值设为value;2、filed已存在,被覆盖 HSET key field value
HGET 1、返回key中给定域field中的值 HGET key field
HDEL 1、删除key中的一个或多个指定域;2、不存在的域被忽略 HDEL key field
HEXISTS 1、查看key中,给定域field是否存在,存在返回1,否,返回0 HEXISTS key field
HGETALL 1、返回key中所有的域和值 HGETALL key
HLEN 1、返回key中域的数量 HLNE key

3、List(列表)

list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。有序、可以重复。

常用命令:

命令 描述 用法
LPUSH 1、将一个或多个值value按顺序插入到key的表头;2、key不存在,则创建并插入;3、key存在但不是list类型,返回错误; LPSUH key value
LPUSHX 1、将value插入到key的头部,当且仅当key存在且为list类型;2、key不存在,什么都不做; LPUSHX key value
LPOP 1、移除并返回key的头元素; LPOP key
LRANGE 1、返回key中指定区间的元素;2、可使用负数下标,-1表示list最后一个元素;3、start大于list最大下标,返回空列表;4、stop大于list最大下标,stop=list最大下标; LRANG key start stop
LSET 1、将key下标为index的元素值设为value;2、index超出范围或list为空,返回错误; LSET key index value
LINDEX 1、返回key中,下标为index的元素; LINDEX key index
LLEN 1、返回key的长度;2、key不存在,返回0; LLEN key
RPUSH 1、将一个或多个值value按顺序插入到key的表尾; RPUSH key value
RPUSHX 1、将value插入到key的尾部,当且仅当key存在且为list类型; RPUSHX key value
RPOP 1、移除并返回key的尾元素; RPOP key

4、Set(集合)

set 是 string 类型的无序集合。无序、不可重复

常用命令:

命令 描述 用法
SADD 1、将一个或多个元素加入key中,已存在的元素将返回0;2、key不存在,则创建并添加;3、key不是集合类型时,返回错误 SADD key member
SCARD 1、返回key中对应的集合中的元素数量 SCARD key

5、Zset(有序集合)

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

命令 描述 用法
ZADD 1、将一个或多个元素及其score值加入key中;2、如果已存在元素,则更新score值并重新插入; ZADD key score member
ZCARD 1、返回key中元素个数 ZCARD key
ZRANGE 1、返回key中指定区间类的成员,按score从小到大排序;2、相同score值按字典序排序;3、从大到小排序,使用ZREVRANGE命令;4、可通过WITHSCORES选项让成员和它的score值一并返回 ZRANGE key start stop [WITHSCORES]
ZRANK 1、返回有序集中成员member的排名,按score从小到大排序;2、排名以0为底,score最小的排名0 ZRANK key member

三、持久化

Redis 是一个内存数据库将数据库中的内容保存在内存中,这与传统的MySQL等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率),这也是Redis如此之快的原因。但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。

为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,分别是RDB(Redis DataBase)和AOF(Append Only File)。

1、持久化流程

  1. 客户端向服务端发送写操作(数据在客户端的内存中)。
  2. 数据库服务端接收到写请求的数据(数据在服务端的内存中)。
  3. 服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。
  4. 操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。
  5. 磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

这5个过程是在理想条件下一个正常的保存流程,但是在大多数情况下,我们的机器等等都会有各种各样的故障,这里划分了两种情况:

  1. Redis数据库发生故障,只要在上面的第三步执行完毕,那么就可以持久化保存,剩下的两步由操作系统替我们完成。
  2. 操作系统发生故障,必须上面5步都完成才可以。

2、RDB

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。即将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可回复数据,redis就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。

2.1、原理

把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。也是Redis默认的持久化方式。

2.2、触发方式

1、save

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

save m n”:表示m秒内数据集存在n次修改时,自动触发bgsave。

redis.conf中默认配置:

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
2、bgsave

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

2.3、优缺点

  • 优点

    1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。

    2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

    3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

  • 缺点

    1.RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,如果不采用压缩算法(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁执行成本过高(影响性能)

    2.RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题(版本不兼容)

    3.在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)

3、AOF

全量备份总是耗时的,AOF是一种更加高效的方式,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

3.1、原理

通过保存Redis服务器所执行的写命令来记录数据库状态。

比如对于如下命令

set str1 "123"
sadd str2 "1" "2" "3"
lpush str3 "1" "2" "3"

RDB 持久化方式就是将 str1,str2,str3 这三个键值对保存到 RDB文件中,而 AOF 持久化则是将执行的 set,sadd,lpush 三个命令保存到 AOF 文件中。

3.2、配置

在redis.conf中,

  • appendonly:默认值no,也就是说redis 默认使用的是rdb方式持久化,如果想要开启 AOF 持久化方式,需要将 appendonly 修改为 yes。
  • appendfilename :aof文件名,默认是"appendonly.aof"
  • appendfsync:aof持久化策略的配置:
    1. no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;
    2. always表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;
    3. everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。

3.2、优缺点

  • 优点

    1.AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。

    2.AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。例如,如果我们不小心错用了 FLUSHALL 命令,在重写还没进行时,我们可以手工将最后的 FLUSHALL 命令去掉,然后再使用 AOF 来恢复数据。

  • 缺点

    1.对于具有相同数据的的 Redis,AOF 文件通常会比 RDF 文件体积更大。(当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集)

    2.RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此从理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一些 BUG,这些 BUG 在 RDB 没有存在。

4、如何选择持久化方式?

如果可以忍受一小段时间内数据的丢失,毫无疑问使用 RDB 是最好的,定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,而且使用 RDB 还可以避免 AOF 一些隐藏的 bug;否则就使用 AOF 重写。但是一般情况下建议不要单独使用某一种持久化机制,而是应该两种一起用,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。Redis后期官方可能都有将两种持久化方式整合为一种持久化模型。


如果有学到东西,请点赞给予鼓励,谢谢。

一文入门Redis的更多相关文章

  1. [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!

    ​概述 本文提供Redis持久化技术说明,  建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...

  2. 一文入门HTML5

    1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...

  3. Redis入门 -- Redis安装与配置

    Redis入门 -- Redis安装与配置 Redis的安装 Redis的安装,我这里使用的是虚拟机. 为了让主机和虚拟机之间可以顺利通信,按照以下步骤进行: 1. 将网络连接模式改为桥接 2. re ...

  4. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  5. 一文学会redis从零到入门

    本文参照视屏学习整理:https://www.bilibili.com/video/av16841549/?p=9 相关软件.资料: 基本条件:有虚拟机或相关linux系统,熟悉基本linux操作 本 ...

  6. 10分钟快速入门Redis

    Redis安装 来源:https://github.com/jaywcjlove/handbook 官方编译安装 $ wget http://download.redis.io/releases/re ...

  7. 一文入门NodeJS

      NodeJS¶ 1.环境配置¶ 之前讲ES6的时候有提过一部分Node的知识,简单回顾下:一文读懂ES6 1.1.NPM国内镜像¶ npm国内镜像:https://npm.taobao.org 配 ...

  8. 教程 | 一文入门Python数据分析库Pandas

    首先要给那些不熟悉 Pandas 的人简单介绍一下,Pandas 是 Python 生态系统中最流行的数据分析库.它能够完成许多任务,包括: 读/写不同格式的数据 选择数据的子集 跨行/列计算 寻找并 ...

  9. 5分钟带你入门Redis

    转载请标明出处: http://blog.csdn.net/forezp/article/details/61471712 本文出自方志朋的博客 1.redis概述 redis是一个开源的,先进的 k ...

随机推荐

  1. DevOps,你真的了解吗?

    与大数据和PRISM(NSA的监控项目之一),DevOps(开发运维)如今是科技人士挂在嘴边的热词,但遗憾的是,类似圣经,每个人都引用DevOps的只言片语,但真正理解并能执行的人极少.根据CA的一项 ...

  2. web安全原理-文件包含漏洞

    前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了  拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...

  3. 工作三年终于社招进字节跳动!字节跳动,阿里,腾讯Java岗面试经验汇总

    前言 我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿到了字节跳动的o ...

  4. FL Studio水果音乐制作入门教程

    "没有早期音乐教育,干什么事我都会一事无成".这并非某位音乐家精心熬制的心灵鸡汤,而是出自物理学家爱因斯坦之口,朋友们没有看错,就是那个被称为二十世纪伟大科学家的爱因斯坦,所以,别 ...

  5. ppt-页面大小和颜色更改

    1.ppt大小设置:设计--幻灯片大小--可选择标准.宽屏或自定义幻灯片大小--下拉 幻灯片大小可选择其他尺寸的幻灯片 2.设置图片背景 设计--设置背景格式--依次有纯色.渐变.图案等填充 2.1 ...

  6. jmeter压测mysql数据库

    jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...

  7. CSS3 学习笔记(中)

    七.文档流 文档流(normal flow)--网页的基础(最底下的一层),我们所创建的元素默认都是在文档流中进行排列. 对于元素有两个状态:在文档流 或 脱离文档流. 元素在文档流的特点: 块元素: ...

  8. SpringBoot2整合Redis

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. Django中ModelForm详解

    1.ModelForm组件介绍:这个组件的功能就是把model和form组合起来 2.ModelForm的使用 1.首先需要导入ModelForm from django.forms import M ...

  10. Mybatis【2.1】-- 从读取流到创建SqlSession发生了什么?

    目录 1.Resources.getResourceAsStream("mybatis.xml")到底做了什么? 2. new SqlSessionFactoryBuilder() ...