Redis入门
一、NOSQL
1.1、NOSQL的概念
NOSQL(Not only sql):不仅是sql语句, 它是对所有非关系型数据库的一种统称。 除去关系型数据库之外的都是非关系数据库。
1.2、为什么用NoSQL?
现如今用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
1.3、什么是NoSQL
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
1.4、NoSQL能干嘛?
- 易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
- 大数据量高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。
- 多样灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦
1.5、NOSQL和RDBMS的区别?
RDBMS
- 高度组织化结构化数据。 user—userid username age sex …
- 结构化查询语言(SQL) sql语句
- 数据和关系都存储在单独的表中。
- 数据操纵语言DML,数据定义语言DDL
- 严格的一致性. 事务
- 基于事务
NOSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 键 - 值对存储。
- 最终一致性,而非ACID【原子,一致,隔离,持久】属性
- 非结构化和不可预知的数据 字符串 对象 队列 集合
- 高性能,高可用性和可伸缩性。 适合搭建集群。 mysql搭建集群。非常复杂。主从模式
NOSQL并不能替代RDBMS
1.6、常见的NOSQL数据库类型
Redis就属于非关系数据库
Mongodb属于非关系数据库。 —接近mysql数据库
二、Redis入门
2.1、什么是Redis
1、Redis是一种开放代码的内存中数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串、哈希、列表、集合、带范围查询的排序集、位图、超日志、地理空间索引和流。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
2、Redis是一个开源的使用ANSI C语言编写可基于内存亦可基于磁盘,Key-Value数据库。类似于map
2.2、特征
- 支持数据的持久化,可以将数据保存在磁盘中,重启之后可以再次加载到内存中使用
- 支持多种数据类型,除了KV类型的数据,还支持list、set、hash等数据结构
- 支持master-slave模式的数据备份
2.3、Redis应用场景
- 热点数据加速查询(主要场景),如热点商品、热点信息等访问量较高的数据
- 即时信息查询,如公交到站信息、在线人数信息等
- 时效性信息控制,如验证码控制、投票控制等
- 分布式数据共享,如分布式集群架构中的session分离消息队列
- 数据信息自增,如点赞、投币、收藏、分享等
2.4、为什么使用Redis
1.Redis读取的速度是110000次/s,写的速度是81000次/s
2.原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3.支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
4.持久化–磁盘,主从复制(集群)
5.官方不支持window系统,但是又第三方版本。 linux系统。
2.5、Redis下载和安装
2.5.1准备工作
- 1.安装redis需要的环境。yum install -y gcc-c++
- 2.上官网下载redis源码安装包。redis-5.0.8.tar.gz
下载地址
- Http://redis.io/
- Http://www.redis.cn/
2.5.2安装步骤
- 1.将下载的redis-5.0.8.tar.gz安装包存入Linux中你所建的目录
- 2.解压redis到目录中
tar -zxvf redis-5.0.8.tar.gz
- 3.进入redis目录并执行编译命令 make
- 4.执行安装命令 make install
make install
2.5.3开启redis服务
- 进入redis所在目录,开启服务
# 开启redis服务
redis-server redis.conf
#查看服务是否启动
ps -ef | grep redis
2.5.4连接测试
在Linux中Redis连接测试有两种,一种是本地连接(127.0.0.1),另一种是图形化界面连接。
图形化工具下载
点击获取下载图形化工具redisplus
- 下载并安装成功后的界面
- 本地连接(首先需要两台虚拟机或者开启两会话窗口)
在第一个会话窗口启动redis服务后,再使用第二个会话窗口使用redis客户端连接redis服务器。
- 图形化界面连接
redis配置文件
在redis目录中找到并编辑redis.conf配置文件
# 表示启动redis服务器时 后台启动。
daemonize yes
# 默认的端口号。
port 6379
# 默认运行绑定的端口号~~~~~~~~~~~~HTTP协议~~~~~~~~~~
# bind 127.0.0.1
# 0.0.0.0 表示广播模式 意思是所有人都可以连接。127.0.0.1
bind 0.0.0.0
- 找到图中的位置,将bind 127.0.0.1改为bind 0.0.0.0
接着往下翻…
- 找到这个地方将daemonize no修改为daemonize yes
- 修改完成后点击esc,再:wq保存退出
这时候千万不要忘了重启redis服务,不然还是会连接不成功!别问我是怎么知道的,因为…==
#1、首先要结束进程
kill -9 redis 进程号
#2、重新启动redis服务器(进入redis目录)
redis-server redis.conf
- 按照图片详情进行操作
因为Redis中所有数据库使用同一个密码,默认没有密码,Redis认为安全层面应该由Linux来保证,所以在连接时不用填写密码。
注意
如果你连接不成功,那就是你的虚拟机中的服务器防火墙没有关,其他人连接你的redis或者你自己windows本地电脑连接需要关闭防火墙才能连接哦~
1:查看防火墙状态
systemctl status firewalld
2:暂时关闭防火墙
systemctl stop firewalld
3:永久关闭防火墙
systemctl disable firewalld
4:重启防火墙
systemctl enable firewalld
- 连接成功的界面
这时候就已经连接成功了
三、Redis基础知识
1、Redis默认有16个数据库
你如果安装了上图所示的图形化工具redisplus后,能够很容易看到Redis默认有16个数据库。类似数组下表从零开始,初始默认使用零号库。
2、统一密码管理
Redis的密码统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上。而且默认没有密码。
3、Redis默认端口是6379
4、Redis数据库操作命令
- Select 命令可以切换不同的数据库
- Dbsize 查看当前数据库的key的数量
- Flushdb:清空当前库
- Flushall:通杀全部库
5、关于key操作的命令
- keys *: 查询所有的key
- del key …:删除指定的key
- expire key seconds: 为指定的key设置存活时间
- ttl key: 查询指定key的存放时间 -1 表示未设置存放时间 -2 表示没有指定的key
6、redis支持的数据类型
- String字符串类型
- Hash 哈希类型
- list 队列
- set 集合
- sorted set 有序集合。
3.1、Redis常用命令
点击可查看
Redis命令参考文档
3.1.1、String字符串类型
可以存放任意类型的字符串。java对象—>json字符串—>string
常用的部分命令(其他的命令你可以再去尝试)
- set key value: 把字符串的value存放到对应的key上。
- get key: 根据指定的key获取对应字符串的value
- mset key value key value key value…: 一次存放多个字符串的value到相应的key上
- mget key key…: 根据指定的多个key获取对应的字符串的value
- setnx key value: 把指定的value存放到对应的key上,如果对应的key已经存在,则不存储。如果不存在则存储。 返回0或者1
- incr key: 为指定的key的value值进行递增。应用场景:点赞 收餐 转发等
- decr key: 递减
3.1.2、Hash 类型
常用的部分命令(其他的命令你可以再去尝试)
- hset key field value: 存放一个指定key的field-value的数据库
- hget key field:获取指定key的field字段对应的value值。
- hkeys key: 获取指定key的所有field字段名
- hvals key: 获取指定key的所有value值。
- hgetall key: 获取指定key的所有的field和value值。
- HDEL key field: 删除指定key的field字段。
3.1.3、List 队列类型
常用的部分命令(其他的命令你可以再去尝试)
- lpush: 将一个或多个值 value 插入到列表 key 的表头.
- lpop: 移除并返回列表 key 的头元素。
- lrange: 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
3.1.4、set集合
常用的部分命令(其他的命令你可以再去尝试)
- sadd key value…: 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
- spop key: 移除并返回集合中的一个随机元素。
- smove source destint member:
- smembers key:获取指定key下的所有的元素 ,是无序的
- sinter key key …:求所有集合的交集。
3.1.5、sortSet 有序集合
应用场景: 排行榜
常用的部分命令(其他的命令你可以再去尝试)
- zadd key score value score value …:添加有序集合元素。
- zrange key start end: 获取指定返回的元素。
四、Redis的持久化
4.1、什么是持久化?
持久化:把内存中的数据库保存到磁盘上。防止数据的丢失。
redis支持的持久化方式两种:
- RDB:快照 其实就是把数据以快照的形式保存在磁盘上,什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。
- AOF:日志追加 记录服务器接受的每个写入操作,当服务器启动时再次加载该日志,会把日志中的命令重新执行一遍。
4.2、RDB快照持久化方式
1、如何触发RDB持久化
- 手动save命令
- 手动bgsave命令
- 通过配置自动触发
2、save和bgsave区别
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:
执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:
3、自动触发:
当你连接redis后使用redis命令进行数据操作完成后,使用save
save
这时候rdb方式会生成一个文件保存在磁盘上,该文件的名字叫什么?
如图所示:会产生一个文件—dump.rdb
4、恢复数据
只需要把dump.rdb文件放入redis的安装目录即可,redis再次启动时回加载安装目录下的dump.rdb文件。
5、rdb的优缺点
优点:
- (1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
- (2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
- (3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点:
- 快照持久化期间修改的数据不会被保存,可能丢失数据。数据完整性比较差。
4.3、AOF
1、AOF是什么
提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
2、AOF的触发模式
在redis目录下找到redis.conf配置文件并打开编辑
vi redis.conf
找到这个位置,将appendonly no 修改为appendonly yes
# 使用vi redis.conf进入编辑界面后,可以点击esc,再点击/键输入appendonly进行搜索
/appendonly
注意:
修改完配置文件保存退出后,一定要重启redis服务!!!
优缺点:
优点
- (1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
- (2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
- (3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
缺点:
- (1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大.
- (2)恢复数据时时间要比快照模式慢很多。
4.4、redis集群搭建
Redis有三种集群模式,分别是:
- 主从模式
- Sentinel模式(哨兵模式)
- Cluster模式(去中心化集群)
4.4.1、主从模式
1、主从关系
主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。
其中主从复制有如下特点:
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave只能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master
工作机制:
当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
主从模式缺点:
从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。
现在就让我们实验一下吧!
1、准备工作
- 1、创建了一个目录 master-slave
- 2、把redis配置文件复制到master-slave,然后使用mv命令修改名称为
redis7001.conf、redis7002.conf、redis7003.conf - 3、分别修改上面三个文件的端口号以及rdb持久化文件的名称 并aof关闭。
在master-slave目录下对redis7001.conf、redis7002.conf、redis7003.conf这三个文件进行修改port端口号,如下图所示。
打开对应配置文件找到图中位置进行修改。打开编辑后可以先点击esc,再点击/键进行搜索。
/port
/dump.rdb
修改完之后。进行下一步启动服务操作
- 启动redis时指定上面的三个配置文件
# 启动端口号7001的redis7001.conf配置文件的服务
redis-server redis7001.conf
# 启动端口号7002的redis7002.conf配置文件的服务
redis-server redis7002.conf
# 启动端口号7003的redis7003.conf配置文件的服务
redis-server redis7003.conf
2、实验操作
操作使用Xshell 7图形化软件
启动三个配置文件之后,再复制两个会话窗口,修改会话窗口名称分别为7001、7002、7003(方便查看)。
之后三个会话窗口分别连接对应的redis,然后右键选择发送键输入命令到所有会话
查看三个redis节点的信息,输入info replication
info replication
如图所示,三个节点都是主,这时候关闭7001会话窗口的发送键输入命令到所有会话状态
在7002和7003会话窗口中使用slaveof 127.0.0.1 7001 把7002和7003挂载7001上
slaveof 127.0.0.1 7001
之后再查看三个redis节点的信息,输入info replication
info replication
这时候可以看到7001是主,7002、7003为从。
主节点负责写,并把写的内容同步到从节点上。 从节点只能负责读操作。不能写操作。
4.4.2、哨兵模式
哨兵介绍
- Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态
- 在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA)
哨兵部署结构
- 修改sentinel.conf的配置(在redis目录下)
# 127.0.0.1表示redis主节点的ip
# 7001 表示主节点的端口号
# 1 表示有多少个哨兵选取redis从节点后,该从节点可以当选为主节点。
sentinel monitor mymaster 127.0.0.1 7001 1
根据前面的主从模式的步骤,继续使用redis7001.conf、redis7002.conf、redis7003.conf配置文件。
- 启动哨兵(在redis目录下)
redis-sentinel sentinel.conf
下面的操作步骤和主从模式中的实现操作一样
4.4.3、去中心化集群
哨兵的缺点
- 没有解决单节点的问题。
- 持久化文件始终在一个服务器上。
- 修改redis.conf配置文件内容,比如修改redis8001.conf文件
#修改端口号
port 8001
bind 0.0.0.0
# 开启dump.rdb文件,还要修改自动生成dump.rdb文件名改为dump8001.rdb
daemonize yes
#开启生成appendonly.aof 文件,同上
appendonly yes
# 开启集群
cluster-enabled yes 833行
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-8001.conf 841行
# 集群的超时时间
cluster-node-timeout 5000 847行
我的去中心化集群使用了三主三从共六个,所以你们可以少弄些,毕竟修改配置文件挺麻烦的。
修改好配置文件后,启动所以的redis
为主节点8001分配槽以及分配从节点
- cluster-replica:每个主节点跟随的从节点的个数
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006
必须保证aof开启,保证redis中没有数据
- 客户端访问:
redis-cli -c -h 127.0.0.1 -p 8001
redis集群基本命令:
1.查看当前集群信息
cluster info
2.查看集群里有多少个节点
cluster nodes
整个过程其实挺简单,本篇主要针对入门级别的小伙伴,插入了很多图片,所以显得冗长,希望大家多多理解,如果不当之处,还望及时指正~