在面试和日常工作中,Redis绝对是至关重要的一部分。今天我们就来详细介绍一下Redis。
在学习Redis之前我们需要介绍一下Nosql。
一、什么是Nosql?
NoSQL(NoSQL=Not Only SQL),意思就是不仅仅是SQL,泛指非关系型数据库。Nosql这门技术类,Nosql这个技术门类,早期就有人提出,到了2019年才慢慢的兴起。
二、为什么会出现这门技术?
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如图片,音频,视频的存储,传统的关系型数据库只能存储结构化数据,对于非结构化的数据支持不够完善,nosql这个技术门类的出现,更好的解决了这些问题,它 告诉了世界不仅仅是sql。
三、NoSQL数据库的四大分类 非关系型数据库

1、键值(Key-Value)存储数据库  key value
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
Key/value模型对于IT系统来说的优势在于简单、易部署。  
但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。
举例如:Tokyo Cabinet/Tyrant, Redis (SSDB), Voldemort, Oracle BDB.
2、列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。
键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
如:Cassandra, HBase, Riak.
3、文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似  BSON====>JSON {“id”:”21”,name:”xa”,}  {“id”:”22”,name:”xa”,age:23} 事务支持不友好             collection document
该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
4、图形(Graph)数据库 图片 音频 视频  文件服务器
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。
NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。
如:Neo4J, InfoGrid, Infinite Graph.

四、Nosql的适用场景

1、数据模型简单
2、灵活的IT系统
3、对数据库性能要求高
4、不需要高度的数据一致性; nosql 弱化事务 没有事务  购物车 
5、对于给定key,比较容易映射复杂值的环境(redis)。

五、什么是Redis
Redis是基于内存型的数据库、数据都是储存在内存中、持久化是在硬盘中。
六、Redis的特点

1、高性能的Key/Value储存形式
2、支持丰富的数据类型(String、list、set、zset、hash)
3、支持持久化,它是持久化到硬盘中
4、单线程、单进程、效率高,但是不支持高并发

七、Redis与memcahed对比

1、相同点无论是Memcahed还是Redis底层都是使用C语言编写,都是基于key-value(键值对存储) 内存存储
2、不同点是Memcahed支持的数据类型,比较简单(String,Object),Redis支持的数据类型比较丰富(String,List,set,zset,hash)
3、Memcahed默认一个值的最大存储不能超过1M,Redis一个值的最大存储1G
4、Memcahed中存储的数据不能持久化,一旦断电,立即丢失Redis中存储的数据可以持久化
5、Memcahed 多线程,支持并发访问 数据安全锁,Redis 单线程,并发时串行执行,将单进程单线程效率发挥到最大
6、Memcahced自身不支持集群环境 (使用中间件),Redis从3.0版本之后自身开始提供集群环境支持

八、Redis的安装

需要准备
1、虚拟机一台或者云主机一台
2、gcc依赖。安装命令(yum install gcc)

九、下载

1、下载地址:www.redis.io

2、点击Download it

nosql实验总结心得 nosql原理_Redis


十、安装

安装只需三步(具体安装在此不做详细介绍)

  1. 将下载redis资料包上传到Linux中将压缩包在linux系统中解压
  2. 解压完成后进入解压目录直接的目录中执行make即可(需要yum install -y gcc来支持编译)
  3. 编译完成后make install PREFIX=/usr/redis安装
  4. 启动redis:
    方法一:redis-server &加上‘&’使redis以后台程序的方式运行
    方法二:redis-server

十一、成功画面

nosql实验总结心得 nosql原理_nosql实验总结心得_02


十二、Redis中数据库相关的指令

说明 : 使用redis的默认配置器动redis服务后,默认会存在16个库,编号从0-15

可以使用select 库的编号 来选择一个redis的库

1.	清空当前的库   FLUSHDB
2.	清空全部的库   FLUSHALL

十三、Redis中常用的与key相关的指令

1.DEL
		语法 :  DEL key [key ...] 
		作用 :  删除给定的一个或多个key 。不存在的key 会被忽略。
		可用版本: >= 1.0.0
		时间复杂度:
		O(N),N 为被删除的key 的数量。
		删除单个字符串类型的key ,时间复杂度为O(1)。
		删除单个列表、集合、有序集合或哈希表类型的key ,时间复杂度为O(M),M为以上数据结构内的元素数量。
		返回值: 被删除key 的数量。
	2.	EXISTS
	语法:  EXISTS key
	作用:  检查给定key 是否存在。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值: 若key 存在,返回1 ,否则返回0 。
	 
	3.	EXPIRE
	语法:  EXPIRE key seconds
	作用:  为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
	在Redis 中,带有生存时间的key 被称为『易失的』(volatile)。生存时间可以通过使用DEL 命令来删除整个key 来移除,或者被SET 和GETSET 命令覆写(overwrite),
	这意味着,如果一个命令只是修改(alter) 一个带生存时间的key 的值而不是用一个新的key 值来代替(replace) 它的话,那么生存时间不会被改变。
	比如说,对一个key 执行INCR 命令,对一个列表进行LPUSH 命令,或者对一个哈希表执行HSET 命令,这类操作都不会修改key 本身的生存时间。
	另一方面,如果使用RENAME 对一个key 进行改名,那么改名后的key 的生存时间和改名前一样。RENAME 命令的另一种可能是,尝试将一个带生存时间的key 改名成另一个带生存时间的another_key这时旧的another_key (以及它的生存时间) 会被删除,然后旧的key 会改名为another_key ,因此,新的another_key 的生存时间也和原本的key 一样。使用PERSIST 命令可以在不删除key 的情况下,移除key 的生存时间,让key 重新成为一个『持久的』(persistent) key 。更新生存时间可以对一个已经带有生存时间的key 执行EXPIRE 命令,新指定的生存时间会取代旧的生存时间。过期时间的精确度在Redis 2.4 版本中,过期时间的延迟在1 秒钟之内——也即是,就算key 已经过期,但它还是可能在过期之后一秒钟之内被访问到,而在新的Redis 2.6 版本中,延迟被降低到1 毫秒之内。Redis 2.1.3 之前的不同之处
	在Redis 2.1.3 之前的版本中,修改一个带有生存时间的key 会导致整个key 被删除,这一行为是受当时复制(replication) 层的限制而作出的,现在这一限制已经被修复。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值:设置成功返回1 。
	
	
	4.	KEYS
	语法 :  KEYS pattern
	作用 :  查找所有符合给定模式pattern 的key 。
	KEYS * 匹配数据库中所有key 。
	KEYS h?llo 匹配hello ,hallo 和hxllo 等。
	KEYS h*llo 匹配hllo 和heeeeello 等。
	KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。
	特殊符号用 \ 隔开
	注意:  KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的key ,你最好还是用Redis 的集合结构(set) 来代替。
	可用版本: >= 1.0.0
	时间复杂度: O(N),N 为数据库中key 的数量。
	返回值: 符合给定模式的key 列表。
	
	5.	MOVE
	语法 :  MOVE key db
	作用 :  将当前数据库的key 移动到给定的数据库db 当中。
	如果当前数据库(源数据库) 和给定数据库(目标数据库) 有相同名字的给定key ,或者key 不存在于当前数据库,那么MOVE 没有任何效果。因此,也可以利用这一特性,将MOVE 当作锁(locking) 原语(primitive)。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值: 移动成功返回1 ,失败则返回0 。
	
	6.	PEXPIRE
	语法 :  PEXPIRE key milliseconds
	作用 :  这个命令和EXPIRE 命令的作用类似,但是它以毫秒为单位设置key 的生存时间,而不像EXPIRE 命令那样,以秒为单位。
	可用版本: >= 2.6.0
	时间复杂度: O(1)
	返回值:设置成功,返回1  key 不存在或设置失败,返回0
	
	7.	PEXPIREAT
	语法 :  PEXPIREAT key milliseconds-timestamp
	作用 :  这个命令和EXPIREAT 命令类似,但它以毫秒为单位设置key 的过期unix 时间戳,而不是像EXPIREAT那样,以秒为单位。
	可用版本: >= 2.6.0
	时间复杂度: O(1)
	返回值:如果生存时间设置成功,返回1 。当key 不存在或没办法设置生存时间时,返回0 。(查看EXPIRE 命令获取更多信息)
	
	8.	TTL
	语法 :   TTL key
	作用 :   以秒为单位,返回给定key 的剩余生存时间(TTL, time to live)。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值:
	当key 不存在时,返回-2 。
	当key 存在但没有设置剩余生存时间时,返回-1 。
	否则,以秒为单位,返回key 的剩余生存时间。
	Note : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。
	
	9.	PTTL
	语法 :  PTTL key
	作用 :  这个命令类似于TTL 命令,但它以毫秒为单位返回key 的剩余生存时间,而不是像TTL 命令那样,以秒为单位。
	可用版本: >= 2.6.0
	复杂度: O(1)
	返回值: 当key 不存在时,返回-2 。当key 存在但没有设置剩余生存时间时,返回-1 。
	否则,以毫秒为单位,返回key 的剩余生存时间。
	注意 : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。
	
	10.	RANDOMKEY
	语法 :  RANDOMKEY
	作用 :  从当前数据库中随机返回(不删除) 一个key 。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值:当数据库不为空时,返回一个key 。当数据库为空时,返回nil 。
	
	11.	RENAME
	语法 :  RENAME key newkey
	作用 :  将key 改名为newkey 。当key 和newkey 相同,或者key 不存在时,返回一个错误。当newkey 已经存在时,RENAME 命令将覆盖旧值。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值: 改名成功时提示OK ,失败时候返回一个错误。
	
	12.	TYPE
	语法 :  TYPE key
	作用 :  返回key 所储存的值的类型。
	可用版本: >= 1.0.0
	时间复杂度: O(1)
	返回值:
	none (key 不存在)
	string (字符串)
	list (列表)
	set (集合)
	zset (有序集)
	hash (哈希表)

十四、Redis中的持久化机制
说明 : Redis提供了两种不同的持久化方法来将数据存储到硬盘里面

1、快照(snapshotting)这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式
	
2、AOF(append only file)只追加文件这种方式可以将所有客户端执行的写命令记录到日志文件中

十五、Redis主从复制

准备三台机器,如图:

nosql实验总结心得 nosql原理_数据库_03

  1. 准备三台机器分别修改redis配置文件中
    a) Master
    修改配置端口号:
    port:6000

b) Slave1

nosql实验总结心得 nosql原理_redis_04

c) Slave2

nosql实验总结心得 nosql原理_Redis_05

  1. 启动测试

十六、Redis哨兵模式

nosql实验总结心得 nosql原理_Redis_06

1.	哨兵:能够后台监控Master库是否故障,如果故障了根据投票数自动将slave库转换为主库。一组sentinel能监听多个master
2.	Sentinel搭建
a)	在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;
b)	配置哨兵,在sentinel.conf文件中填入内容:
        sentinel monitor 被监控数据库名字(自己起名字) ip port 1
c)	启动哨兵模式:
            命令键入:redis-sentinel  /myredis/sentinel.conf
说明:这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能。

十七、Redis的集群搭建
集群(Cluster): tomcat mysql redis 一台 多台服务器一起完成系统的服务

1.	Redis的集群
Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,
支持slave-master选举和容错,支持在线分片(sharding)等特性
  1. Redis的集群架构图

nosql实验总结心得 nosql原理_数据库_07


3. Redis的集群细节

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
2、节点的fail是通过集群中超过半数的节点检测失效时才生效.
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
4、redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

十八、Redis容错机制

  1. redis容错架构图
  2. nosql实验总结心得 nosql原理_redis_08

  3. Redis的容错细节
1、leader选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉

2、什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

十九、Redis搭建时注意的细节

1.	判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数.
2.	搭建集群至少需要三个主节点,三个从节点,至少需要6个节点
3.	.如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
4.	如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态