redis简介

1、redis是一个开源的使用C语言编写的,可基于内存也可以持久化的Key-Value数据库。

2、解压之后可以使用redis-cli进行启动

3、Redis是很快的。
原因:完全基于内存。是一种类似于hashmap,它的优势就是查找和操作地时间复杂度都是o(1).hash表是基于数组+链表的实现的。数组在内存中是一块连续的空间,只要知道查找数据的下标就可快速定位到数据的内存地址,即数组查找数据的时间复杂度为O(1).
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;官网解释为,单线程已经够快了。没必要做多线程。
使用多路I/O复用模型,非阻塞IO;
1.阻塞I/O模型
老李去火车站买票,排队三天买到一张退票。
耗费:在车站吃喝拉撒睡 3天,其他事一件没干。
2.非阻塞I/O模型
老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。
3.I/O复用模型
1.select/poll
老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。
耗费:打电话
2.epoll
老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。
耗费:无需打电话

4、 redis数据结构
redis是一种高级的key-value存储系统,其中支持5种不同的数据类型

字符串(string)
列表(list)
字符串集合(set)
有序字符串结合(sorted set)
哈希(hash)

5、redis数据结构 string
字符串可以存储以下3种类型的值。

字符串(byte string)
整型
浮点型

6、redis数据结构 list
redis允许用户从序列的两端推入或者弹出元素

7、redis数据结构 set
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

8、redis数据结构 sorted set
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。有序集合的成员是唯一的,但分数(score)却可以重复。

9、redis数据结构 hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

10、redis持久化
redis为持久化提供两种方式:

RDB: 存在于某一个时刻的所有数据全部写入到磁盘中。
AOF: 在执行写命令的时候,将被执行的命令复制到磁盘里面。当服务器重启时会重新执行这些命令来恢复数据。
当RDB与AOF同时使用的情况下,如果redis重启,则会优先采用AOF进行数据恢复,因为AOF方式的数据恢复完整度更高。

11、持久化之RDB

RDB持久化配置
优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩转移(就一个文件)

劣势:如果宕机,数据损失比较大,因为它是没一个时间段进行持久化操作的。也就是积攒的数据比较多,一旦懵逼,就彻底懵逼了

总结
平时我们可以定期把rdb文件(不重要的数据)备份到指定地方,需要恢复的时候 直接把rdb搞到redis下即可。而重要的数据则存放到数据库中。

#时间策略
save 900 1
save 300 10
save 60 10000#save 900 1 表示900s内如果有1条是写入命令,就触发产生一次快照,可以理解为就进行一次备份#save 300 10 表示300s内有10条写入,就产生快照
#文件名称
dbfilename dump.rdb
#文件保存路径
dir /home/work/app/redis/data/
#如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes# 这个配置也是非常重要的一项配置,这是当备份进程出错时,主进程就停止接受新的写入操作,是为了保护持久化的数据一致性问题。如果自己的业务有完善的监控系统,可以禁止此项配置, 否则请开启。# 是否压缩
rdbcompression yes#rdbcompression yes ,建议没有必要开启,毕竟Redis本身就属于CPU密集型服务器,再开启压缩会带来更多的CPU消耗,相比硬盘成本,CPU更值钱。
#导入时是否检查
rdbchecksum yes

在redis中RDB持久化促发分为两种:自己手动触发与redis定时触发。

手动触发可以使用
save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。
bgsave:该触发方式会fork一个子进程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候。
自动触发主要有
根据我们的 save m n 配置规则自动触发;
从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave;
执行 debug reload 时;
执行 shutdown时,如果没有开启aof,也会触发。
运行流程图

12、持久化之AOF
当 AOF 持久化功能处于打开状态时, 服务器在执行完一个写命令之后, 会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区的末尾。

(1)当 appendfsync 的值为 always 时, 服务器在每个事件循环都要将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并且同步 AOF 文件, 所以 always 的效率是 appendfsync 选项三个值当中最慢的一个, 但从安全性来说, always 也是最安全的, 因为即使出现故障停机, AOF 持久化也只会丢失一个事件循环中所产生的命令数据。

(2)当 appendfsync 的值为 everysec 时, 服务器在每个事件循环都要将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并且每隔超过一秒就要在子线程中对 AOF 文件进行一次同步: 从效率上来讲, everysec 模式足够快, 并且就算出现故障停机, 数据库也只丢失一秒钟的命令数据。

(3)当 appendfsync 的值为 no 时, 服务器在每个事件循环都要将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 至于何时对 AOF 文件进行同步, 则由操作系统控制。

因为处于 no 模式下的 flushAppendOnlyFile 调用无须执行同步操作, 所以该模式下的 AOF 文件写入速度总是最快的, 不过因为这种模式会在系统缓存中积累一段时间的写入数据, 所以该模式的单次同步时长通常是三种模式中时间最长的: 从平摊操作的角度来看, no 模式和 everysec 模式的效率类似, 当出现故障停机时, 使用 no 模式的服务器将丢失上次同步 AOF 文件之后的所有写命令数据。

还原数据逻辑:

1.创建一个不带网络连接的伪客户端(fake client)。

2.读取 AOF 所保存的文本,并根据内容还原出命令、命令的参数以及命令的个数。

3.根据命令、命令的参数和命令的个数,使用伪客户端执行该命令。

4.执行 2 和 3 ,直到 AOF 文件中的所有命令执行完毕。

完成第 4 步之后, AOF 文件所保存的数据库就会被完整地还原出来

AOF持久化配置

#是否开启aof
appendonly yes
#文件名称
appendfilename “appendonly.aof”
#同步方式
appendfsync everysec#三种模式#always:把每个写命令都立即同步到aof,很慢,但是很安全#everysec:每秒同步一次,是折中方案#no:redis不处理交给OS来处理,非常快,但是也最不安全
#aof重写期间是否同步
no-appendfsync-on-rewrite no
#重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#加载aof时如果有错如何处理
aof-load-truncated yes
#文件重写策略
aof-rewrite-incremental-fsync yes

运行流程图

重点回顾
·AOF文件通过保存所有修改数据库的写命令来记录服务器的数据库状态
·AOF文件中所有命令都以Redis命令请求协议的格式保存
·命令请求会先保存到AOF缓冲区里面,之后再定期写入并同步到AOF文件。
·appendfsync选项的不同值对AOF持久化功能的安全性以及Redis服务器的性能有很大的影响
·服务器只要载入并重新执行保存在AOF文件中的命令,就可以还原数据库本来的状态
·AOF重写可以产生一个新的AOF文件,这个新的AOF文件就是当前数据库状态的dump,所以垃圾冗余数据被清理了
·AOF重写是一个有歧义的名字,该功能是通过dump数据库所有建值对实现的,程序无需对现有AOF文件进行任何操作。
·执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,以保证数据一致性。

13、Redis主从复制
  (1)概述:
    redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
    通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
过程:

1:当一个从数据库启动时,会向主数据库发送sync命令,
    2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
    3:当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
    4:从数据库收到后,会载入快照文件并执行收到的缓存的命令。
Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:

· 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。

· 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。

· 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。

14、Redis 事务机制
MULTI 用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时,这些命令才会被原子执行.

EXEC 执行在一个事务内命令执行了WATCH命令,那么只有当WATCH所监控的keys没有被修改的前提下,EXEC命令才能执行事务队列中的所有命令,那么只有
当WATCH所监控的keys没有被修改的前提下,EXEC命令才能执行事务队列中的所有命令,否则EXEC将放弃当前事务中的所有命令。

DISCARD 回滚事务队列中的所有命令,同时再将当前连接的状态恢复为正常状态,即非事务状态。如 果WATCH命令被使用,该命令将UNWATCH所有的keys.

Watch 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
事务对异常的处理机制
Redis执行命令的错误主要分为两种:

  • 1.命令错误:执行命令语法错误,比如说将 set 命令写成 sett
  • 2.运行时错误:命令语法正确,但是执行错误,比如说对 List 集合执行 sadd 命令

Redis事务中如果发生上面两种错误,处理机制也是不同的。

1)命令错误处理机制
这种情况需要区别Redis版本,Redis2.65之前的版本会忽略错误的命令,执行其他正确的命令,2.65之后的版本会忽略这个事务中的所有命令,都不执行,就比如上面的例子(使用的Redis版本是2.8的);

(2)运行时错误处理机制
运行错误表示命令执行过程中出现错误,就比如用GET命令去获取一个散列表类型的键值。

这种错误在命令执行之前Redis是无法发现的,所以在事务里这样的命令都会被Redis接受并执行.如果事务里有一条命令执行错误,Redis不仅不会回滚事务,还会跳过这个运行时错误,其他命令依旧会执行(包括出错后的命令)。

乐观锁和共享锁
乐观锁(Optimistic Lock)又叫做共享锁,每次别人拿数据的时候都认为别人不会修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读得应用类型,这样会提高吞吐量。

悲观锁(Pessimistic Lock)又叫做排它锁(x锁),每次拿刀数据的时候都认为别人会修改数据,所以每次在拿到数据的时候都会上锁,这样别人想拿到这个数据就会block直到
它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,都是在操作之前先上锁。

redis简介-各种基础相关推荐

  1. 【基础概念】 Redis简介和面试常见问题

    Redis简介和面试常见问题 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起 ...

  2. Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)...

    1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...

  3. Redis简介和Redis Template用法整理

    Redis简介 Redis使大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快.Redis是目前使用最广泛的内存数据存储系统之一.它支持更丰富的数据结构,支持数据持久化.事务.HA(高可用H ...

  4. 1. redis简介

    一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...

  5. Redis数据库(一)——Redis简介、部署及常用命令

    文章目录 一.关系数据库与非关系型数据库概述 1.关系型数据库 2.非关系型数据库 3.关系数据库与非关系型数据库区别 ①.数据存储方式不同 ②.扩展方式不同 ③.对事务性的支持不同 4.非关系型数据 ...

  6. Redis简介及入门

    引入Redis redis的出现是为了解决以下问题现象: 海量用户 高并发 出现此问题现象的罪魁祸首是关系型数据库: 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解 ...

  7. NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/103.html?1455869099 NoSQL简介 介绍redis前,我 ...

  8. 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构

    [时间]2021.11.16 [题目][<Redis深度历险>读书笔记(1)]基础:万丈高楼平地起 --Redis 基础数据结构 本栏目是<Redis深度历险:核心原理和应用实践&g ...

  9. @Redis(redis简介,下载与安装配置,基本操作)

    title: Redis author: Xoni tags: Redis categories: java学习 Redis abbrlink: bae4ff13 Redis基础 1. Redis 简 ...

最新文章

  1. 第三十五课:多普勒效应和宇宙大爆炸
  2. 改变客户端访问时的方法名
  3. 大话程序猿眼里最全的高并发,快收藏!
  4. 在dw下安装zen coding,并对其快捷键进行修改
  5. Python 命令汇总
  6. 如何输入一个整数逆序输出_如何匹配DSP输入输出信号
  7. windows下配置nginx+php环境
  8. linux内存布局的内核实现--用户空间的映射方式
  9. 迷宫最短路径-货郎担问题的解决思路
  10. 机顶盒怎样配置服务器信息,网络机顶盒桌面配置服务器
  11. 文本对比工具哪些好用?竟然有在线的。真香。
  12. 江苏科技大学MATLAB考试,江苏科技大学精品课程申报表.DOC
  13. 数论—乘法逆元—费马小定理
  14. 麦子学院视频教程笔记
  15. java 串行化_Java中的串行化
  16. 无鸭不过秋,这样吃鸭润燥解乏!
  17. 2019/2/3摄氏一华氏温度转换表
  18. 对云计算及云服务的理解
  19. Windows Server 2003 移除系统密码
  20. Redis 三台服务器搭建三主三从详细步骤

热门文章

  1. 茌平计算机中考成绩查询,2017中考成绩查询系统
  2. 中文转化成拼音首写字母
  3. win10下手机投影到电脑及第二屏幕
  4. HashMap?面试?我是谁?我在哪? 侵立删
  5. 艰难转行------程序员
  6. JS 制作简易计算机
  7. 软件开发真的是工资高、来钱快?Emm……
  8. 什么云原生存储解决方案最受欢迎?
  9. android吐丝的五种不同的显示
  10. 51单片机P0~P3口工作原理