文章目录

第一章、NoSQL简介

1.1 数据库应用的演变历程

单机数据库时代、Memcached时代、读写分离时代、分表分库时代(集群)、nosql时代。

1.2 NoSQL数据库

彻底改变底层存储机制。不再采用关系数据模型,而是采用聚合数据结构存储数据
有Redis、MongoDB、HBASE…
Redis知识点(16)

1.3 当前NoSQL的使用

NoSQL和传统的关系型数据库不是排斥和取代的关系,在一个分布式应用中往往是结合使用的。复杂的互联网应用通常都是多数据源、多数据类型,应该根据数据的使用情况和特点,存放在合适的数据库中。

1.4 NoSQL数据模型

传统关系型数据库:表
Redis知识点(16)
NoSql数据库:聚合结构。把组相关联的数据作为一个整体进行存储和管理
BSON:数据保存到键值对中、数据和数据之间用逗号隔开,{}表示对象,[]表示数组。
k-v键值对、列簇、图标模型等。
Redis采用的是k-v模型存储数据
Redis知识点(16)

第二章、Redis

2.1 Redis简介

Redis中的数据大部分时间都是存储在内存中的,适合存储频繁访问、数据量比较小的数据。
缓存数据库
Redis知识点(16)

2.2 Redis的特点

Redis知识点(16)

2.3 Linux上安装Redis

第一步:下载redis

https://redis.io/
Redis知识点(16)

第二步:使用Xftp工具上传redis-5.0.2.tar.gz到linux 系统

Redis知识点(16)

第三步:解压redis-5.0.2.tar.gz到/opt目录

Redis知识点(16)

第四步:编译redis,进入解压目录,并且执行make命令

Redis知识点(16)

报错:gcc命令未找到
Redis知识点(16)

第五步:安装gcc

什么是 gcc ?
gcc是GNU compiler collection的缩写,它是Linux下一个编译器集合(相当于javac ),是c或c++程序的编译器。

1.怎么安装gcc ?
方式一:在有外网的情况下,使用yum进行安装。执行命令:yum -y install gcc。
Redis知识点(16)
2.执行gcc –v查看Linux内核版本
Redis知识点(16)

第六步:再次回到redis解压目录执行make命令进行编译

Redis知识点(16)

第七步:进行清理工作

Redis知识点(16)

第八步:再次执行make指令进行编译

Redis知识点(16)

第九步:执行make install安装redis

Redis知识点(16)
注意:在make执行之后再执行 make install,该操作则将 src下的许多可执行文件复制到/usr/local/bin 目录下,这样做可以在任意目录执行redis的软件的命令(例如启动,停止,客户端连接服务器等), make install 可以不用执行,看个人习惯。

查看make编译结果,cd src目录
Redis知识点(16)
Redis知识点(16)

第十步:启动Redis

启动方式:
① 前台启动 redis-server
使用配置文件中的默认参数启动
Redis知识点(16)
②后台启动 redis-server &
使用配置文件中的默认参数启动
Redis知识点(16)
③根据配置文件启动 启动命令 配置文件 &
Redis知识点(16)
注意:如果修改了redis的配置文件redis.conf,必须在启动时指定配置文件,否则还是使用默认参数启动!

第十一步:关闭Redis服务

关闭方式:
①使用redis客户端关闭,向服务器发出关闭命令
任意目录下执行 指令redis-cli shutdown
推荐使用这种方式, redis先完成数据操作,然后再关闭。
例如:
Redis知识点(16)
②kill pid 或者 kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用 ps -ef | grep redis 查出进程号,在使用 kill pid
Redis知识点(16)

2.4 Redis的客户端

Redis客户端是一个程序,通过网络连接到Redis服务器,从而实现跟 Redis服务器的交互。
Redis客户端发送命令,同时显示Redis服务器的处理结果。

redis-cli(Redis Command Line Interface)是Redis自带的基于命令行的Redis客户端,用于与服务端交互,我们可以使用该客户端来执行redis的各种命令。

2.4.1 启动Redis客户端

先开启redis服务
Redis知识点(16)
一、直接连接
在任意目录执行 redis-cli:默认连接(本机)127.0.0.1 ,端口6379的redis服务

二、指定IP和端口连接redis

-h redis主机IP(可以指定任意的redis服务器)
-p端口号(不同的端口表示不同的redis应用)
Redis知识点(16)
在任意目录下执行 redis-cli -h 127.0.0.1 -p 6379
Redis知识点(16)

2.4.2 关闭Redis客户端

退出Redis客户端:exit或者quit指令。
Redis知识点(16)

2.5 Redis基本知识

2.5.1 测试Redis性能

Redis知识点(16)
Redis知识点(16)

2.5.2 查看Redis 服务是否正常运行

redis >ping 返回PONG
解释:输入ping,redis给我们返回PONG,表示redis服务运行正常
Redis知识点(16)

2.5.3 查看redis服务器的统计信息:info

语法:info [section]

作用:以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。section 用来返回指定部分的统计信息。 section的值:server , clients ,memory等等。不加section 返回全部统计信息

返回值:指定section的统计信息或全部信息

例1:统计server的信息
Redis知识点(16)
例2:统计全部信息
Redis知识点(16)

2.5.4 redis默认使用16个库

库就相当于是MySQL中自己定义的数据库,比如CRM数据库…
Redis默认使用16个库,从0到15。 对数据库个数的修改,在redis.conf文件中databases 16,理论上可以配置无限多个。
Redis知识点(16)
Redis的库和关系型数据库中的数据库实例类似,但又有一些不同,比如redis中各个库不能自定义命名,只能用序号表示,redis中各个库不是完全独立的,使用时最好一个应用使用一个redis实例,不建议一个redis实例中保存多个应用的数据。Redis实例本身所占存储空间其实是非常小的,因此不会造成存储空间的浪费。
Redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例,但是MySQL可以

2.5.5切换库命令:select db

默认使用第0个,如果要使用其他数据库,命令是 select index

例子:切换到1数据库
Redis知识点(16)

2.5.6 查看当前数据库中key的数目:dbsize

语法:dbsize

作用:返回当前数据库的 key 的数量。

返回值:数字,key的数量
Redis知识点(16)

2.5.7 查看当前数据库中有哪些key:keys *

Redis知识点(16)

2.5.8 清空当前库:flushdb

Redis知识点(16)

2.5.9 清空所有的数据库:flushall

Redis知识点(16)
这也体现出redis中的库并不是完全无关的。

2.5.10 config get * 获得redis的所有配置值

语法:config get parameter

作用:获取运行中Redis服务器的配置参数, 获取全部配置可以使用*。参数信息来自redis.conf 文件的内容。

例1:获取数据库个数 config get databases
Redis知识点(16)
例2:获取端口号config get port
Redis知识点(16)

2.6 Redis的5种数据结构

2.6.1 字符串类型 string

字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数
据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。

单key:单value
Redis知识点(16)

2.6.2 列表类型 list

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

单key:多有序value
Redis知识点(16)

2.6.3 集合类型 set

Redis的Set是string类型的无序无重复集合。

单key:多无序value
Redis知识点(16)

2.6.4 哈希类型 hash

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

单key:对象(属性:值)
Redis知识点(16)

2.6.5 有序集合类型 zset (sorted set)

Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

单key:多有序value:
你输入是Salary:5000 李四,3500 张三,8000 周丽
内部存储是Salary:3500 张三,5000 李四,8000 周丽
Redis知识点(16)

2.7 Redis的常用操作命令

2.7.1 Redis的Key的操作命令

2.7.1.1 keys

Redis知识点(16)
Redis知识点(16)

2.7.1.2 exists

Redis知识点(16)
Redis知识点(16)

2.7.1.3 move

Redis知识点(16)
Redis知识点(16)

2.7.1.4 ttl

Redis知识点(16)
Redis知识点(16)

2.7.1.5 expire

Redis知识点(16)
Redis知识点(16)

2.7.1.6 type

Redis知识点(16)
Redis知识点(16)

2.7.1.7 rename

Redis知识点(16)
Redis知识点(16)

2.7.1.8 del

Redis知识点(16)
Redis知识点(16)

2.7.2 字符串类型(string)的数据操作命令

Redis知识点(16)

2.7.2.1 set

Redis知识点(16)
Redis知识点(16)
Redis知识点(16)

2.7.2.2 get

Redis知识点(16)
Redis知识点(16)

2.7.2.3 append

Redis知识点(16)
Redis知识点(16)

2.7.2.4 strlen

Redis知识点(16)
Redis知识点(16)

2.7.2.5 incr

Redis知识点(16)
Redis知识点(16)

2.7.2.6 decr

Redis知识点(16)
Redis知识点(16)

2.7.2.7 incrby

Redis知识点(16)
Redis知识点(16)

2.7.2.8 decrby

Redis知识点(16)
Redis知识点(16)

2.7.2.9 getrange

Redis知识点(16)
依次往前的字符是-2…
Getrange address 0 -1: 就是整个value
Redis知识点(16)

2.7.2.10 setrange

Redis知识点(16)
能覆盖几个就覆盖几个
Redis知识点(16)

2.7.2.11 setex

Redis知识点(16)
Redis知识点(16)

2.7.2.12 setnx

和set指令不同,set可以覆盖
Redis知识点(16)
Redis知识点(16)

2.7.2.13 mset

Redis知识点(16)
Redis知识点(16)

2.7.2.14 mget

Redis知识点(16)
Redis知识点(16)

2.7.2.15 msetnx

Redis知识点(16)
Redis知识点(16)

2.7.3 列表(List)的数据操作命令

Redis知识点(16)

2.7.3.1 lpush

Redis知识点(16)
Redis知识点(16)

2.7.3.2 rpush

Redis知识点(16)
Redis知识点(16)

2.7.3.3 lrange

Redis知识点(16)
Redis知识点(16)

2.7.3.4 lpop

Redis知识点(16)
Redis知识点(16)

2.7.3.5 rpop

Redis知识点(16)
Redis知识点(16)

2.7.3.6 lindex

Redis知识点(16)
Redis知识点(16)

2.7.3.7 llen

Redis知识点(16)
Redis知识点(16)

2.7.3.8 lrem

Redis知识点(16)
Redis知识点(16)

2.7.3.9 ltrim

Redis知识点(16)
Redis知识点(16)

2.7.3.10 lset

Redis知识点(16)
Redis知识点(16)

2.7.3.11 linsert

Redis知识点(16)
Redis知识点(16)

2.7.4 集合类型(set)的数据操作命令

Redis知识点(16)

2.7.4.1 sadd

Redis知识点(16)
Redis知识点(16)

2.7.4.2 smembers

Redis知识点(16)
Redis知识点(16)

2.7.4.3 sismember

Redis知识点(16)
Redis知识点(16)

2.7.4.4 scard

Redis知识点(16)
Redis知识点(16)

2.7.4.5 srem

Redis知识点(16)
Redis知识点(16)

2.7.4.6 srandmember

Redis知识点(16)
Redis知识点(16)

2.7.4.7 spop

Redis知识点(16)
Redis知识点(16)

2.7.4.8 smove

Redis知识点(16)
Redis知识点(16)

2.7.4.9 sdiff

Redis知识点(16)
Redis知识点(16)

2.7.4.10 sinter

Redis知识点(16)
Redis知识点(16)

2.7.4.11 sunion

Redis知识点(16)
Redis知识点(16)

2.7.5 哈希类型(hash)数据的操作命令

Redis知识点(16)
Redis知识点(16)

2.7.5.1 hset

Redis知识点(16)
Redis知识点(16)

2.7.5.2 hget

Redis知识点(16)
Redis知识点(16)

2.7.5.3 hmset

Redis知识点(16)
Redis知识点(16)

2.7.5.4 hmget

Redis知识点(16)
Redis知识点(16)

2.7.5.5 hgetall

Redis知识点(16)
Redis知识点(16)

2.7.5.6 hdel

Redis知识点(16)
Redis知识点(16)

2.7.5.7 hlen

Redis知识点(16)
Redis知识点(16)

2.7.5.8 hexists

Redis知识点(16)
Redis知识点(16)

2.7.5.9 hkeys

Redis知识点(16)
Redis知识点(16)

2.7.5.10 hvals

Redis知识点(16)
Redis知识点(16)

2.7.5.11 hincrby

Redis知识点(16)
Redis知识点(16)

2.7.5.11 hincrbyfloat

Redis知识点(16)
Redis知识点(16)

2.7.5.12 hsetnx

Redis知识点(16)
Redis知识点(16)

2.7.6 有序集合类型(Zset)数据的操作命令

Redis知识点(16)

2.7.6.1 zadd

Redis知识点(16)
Redis知识点(16)

2.7.6.2 zrange

Redis知识点(16)
Redis知识点(16)

2.7.6.3 zrangebyscore

Redis知识点(16)
Redis知识点(16)
Redis知识点(16)

2.7.6.4 zrem

Redis知识点(16)
Redis知识点(16)

2.7.6.5 zcard

Redis知识点(16)
Redis知识点(16)

2.7.6.6 zcount

Redis知识点(16)
Redis知识点(16)

2.7.6.7 zrank

Redis知识点(16)
Redis知识点(16)

2.7.6.8 zscore

Redis知识点(16)
Redis知识点(16)

2.7.6.9 zrevrank

Redis知识点(16)
Redis知识点(16)

2.7.6.10 zrevrange

Redis知识点(16)
Redis知识点(16)

2.7.6.11 zrevrangebyscore

Redis知识点(16)
Redis知识点(16)

2.8 Redis的配置文件

2.8.1 redis.conf存放位置

Redis知识点(16)

2.8.2 Redis的网络相关配置

Redis知识点(16)
1.修改ip和端口
Redis知识点(16)
2.第三种服务启动方式,指定配置文件
Redis知识点(16)
3.客户端连接,指定ip和端口
Redis知识点(16)
4.关闭服务,也要指定ip和端口
Redis知识点(16)

2.8.3 Redis的常规配置

Redis知识点(16)
Redis知识点(16)

2.8.4 Redis的安全配置

Redis知识点(16)

2.8.5 Redis的RDB配置

Redis知识点(16)
2.8.6 Redis AOF配置
Redis知识点(16)

2.9 Redis的持久化

Redis知识点(16)

2.9.1 RDB策略

Redis知识点(16)
Redis知识点(16)

2.9.2 AOF策略

Redis知识点(16)

2.9.3 持久化小结

Redis知识点(16)

2.10 Redis的事务

Redis知识点(16)

2.10.1 Redis事务的常用命令

2.10.1.1 multi

Redis知识点(16)
Redis知识点(16)

2.10.1.2 exec

Redis知识点(16)
Redis知识点(16)
第三条执行失败了,但是其他的执行成功了,这显然不符合事务的标准,所以Redis的事务只能保证部分原子性

2.10.1.3 discard

Redis知识点(16)
Redis知识点(16)

2.10.1.4 watch

Redis知识点(16)
Redis知识点(16)

2.10.1.5 unwatch

Redis知识点(16)
Redis知识点(16)

2.10.1.6 Redis事务小结

Redis知识点(16)

2.11 Redis消息的发布与订阅(了解)

2.11.1 Redis发布订阅

Redis知识点(16)

2.11.2 Redis发布订阅示意图

Redis知识点(16)
Redis知识点(16)

2.11.3 Redis发布订阅的常用命令

2.11.3.1 subscribe

Redis知识点(16)
Redis知识点(16)

2.11.3.2 publish

Redis知识点(16)
Redis知识点(16)

2.11.3.3 psubscribe

Redis知识点(16)
Redis知识点(16)

2.12 Redis的主从复制

Redis知识点(16)

2.12.1一主二从的Redis集群

2.12.1.1 一主二从原理

Redis知识点(16)

2.12.1.2 一主二从搭建

1、一台服务器模拟三台主机:

第一步:将redis.conf 拷贝三份,名字分别是,redis6379.conf,redis6380.conf,redis6381.conf

修改三份配置文件:以redis6379.conf为例
修改 port端口,pid文件名,日志文件名,rdb文件名
如:
port 6379
pidfile /var/run/redis_6379.pid
logfile “6379.log”
dbfilename dump6379.rdb

第二步:分别打开三个窗口模拟三台服务器,通过各自的redis配置文件开启

Redis知识点(16)
Redis知识点(16)
Redis知识点(16)
通过redis客户端分别连接三台redis服务
redis-cli –h 127.0.0.1 –p 6379
redis-cli –h 127.0.0.1 –p 6380
redis-cli –h 127.0.0.1 –p 6381

第三步:查询三台redis服务在集群中的主从信息:info replication

默认情况下,所有的redis服务都是主机,即都能写和读,但是都还没有从机。
Redis知识点(16)

第四步:先在6379进行写操作

Redis知识点(16)
6380服务器没有k1
Redis知识点(16)
说明三台redis服务器互相独立,互不影响

第五步:设置主从关系:设从不设主

在6380和6381主机上分别执行命令:slaveof 127.0.0.1 6379
让6380和6381从属于6379主机
Redis知识点(16)
Redis知识点(16)
这时看6379,已经有两个从机了
Redis知识点(16)
另一种方式,就是修改6380和6381的配置文件,在最后加上:
Redis知识点(16)
注意:如果主redis设置了密码,从库的redis.conf中还需要设置masterauth为主redis的密码。

第六步::全量复制:

在6380和6381分别执行命令get k1
Redis知识点(16)
Redis知识点(16)

第七步:增量复制:

6379执行命令:set k2 v2。
Redis知识点(16)
然后6380端口和6381端口,分别执行命令:get k2
Redis知识点(16)
Redis知识点(16)

第八步:主写从读、读写分离:

在6380和6381上执行写操作set k3 v3
Redis知识点(16)
Redis知识点(16)

第九步:主机宕机,从机原地待命

6379执行指令shutdown,
Redis知识点(16)
并查看6380和6381的redis信息
Redis知识点(16)

第十步:主机宕机后恢复,一切恢复正常

重启6379
Redis知识点(16)
Redis知识点(16)

第十一步:从机宕机:主机少一个从机,其他从机不变

6380执行指令shutdown,
Redis知识点(16)
并查看6379和6381的redis信息
Redis知识点(16)
Redis知识点(16)

第十二步:从机宕机后恢复,需要重新设置主从关系

重启6380
Redis知识点(16)
并查看6380、6379和6381的redis信息
Redis知识点(16)
Redis知识点(16)
注意:从机跟master断开联系,必须重新连接,除非写进配置文件。
Redis知识点(16)
Redis知识点(16)
Redis知识点(16)

第十三步:从机上位:

第一步:主机宕机,6379执行命令:shutdown
Redis知识点(16)
第二步:6380断开主从关系,执行命令:slaveof no one
Redis知识点(16)
第三步:重新搭建主从,6381执行命令:info replication,slaveof 127.0.0.1 6380
Redis知识点(16)
第四步:之前主机恢复,重启6379的Redis服务,并执行命令:info replication
在6379主机宕机后,6380从机断开主从关系,6381开始还在原地待命;后来6380从机上位,6381投靠6380,6379主机即使回来但它已是孤寡老人,空头司令。
Redis知识点(16)

第十四步:天堂变地狱

6379执行命令slaveof 127.0.0.1 6381,并在63796381执行info replication
Redis知识点(16)
Redis知识点(16)
Redis知识点(16)
一台主机配多台从机,一台从机再配多台从机,从而实现了庞大的集群架构。同时也减轻了一台主机的压力,缺点是增加了服务器间的延迟。

2.12.2 复制原理

2.12.2.1 全量复制

Redis知识点(16)

2.12.2.2 增量复制

Master将新的所有收集到的修改命令依次传给slave,完成同步

2.13 哨兵模式

2.13.1哨兵模式原理

Redis知识点(16)

2.13.2 哨兵模式搭建

1—5步跟一主二从搭建一样:一台服务器模拟三台主机、查询主从信息、写操作6379、设置主从关系、全量复制、增量复制、主写从读、读写分离。

6、在redis安装目录下创建redis_sentinel.conf文件,并编辑里边的内容:sentinel monitor dc-redis 127.0.0.1 6379 1,表示:指定监控主机的ip地址,port端口,得到哨兵的投票数(当哨兵投票数大于或者等于此数时切换主从关系)。

Redis知识点(16)
Redis知识点(16)

7、新开窗口,启动哨兵:redis-sentinel redis_sentinel.conf

Redis知识点(16)

8、主机宕机

Redis知识点(16)

9、等待从机投票,在sentinel窗口中查看打印信息

Redis知识点(16)

10、查看6379和6381的redis信息:

Redis知识点(16)
Redis知识点(16)

11、原主机恢复,启动6379:

Redis知识点(16)
Redis知识点(16)

2.14 主从复制小结

Redis知识点(16)
Redis知识点(16)

2.15 Jedis操作Redis

2.15.1 Jedis简介

使用Redis官方推荐的Jedis,在java应用中操作Redis。Jedis几乎涵盖了Redis的所有命令。操作Redis的命令在Jedis中以方法的形式出现。
方法名和命令行中的命令一样

2.15.2 Jedis的使用

2.15.2.1 在Linux中开启Redis服务

1.修改redis6379.conf中的bind为Linux的ip地址,因为我们要从外部连接,就不能用127.0.0.1了
Redis知识点(16)
2.开启redis服务
Redis知识点(16)
3.关闭Linux防火墙
Redis知识点(16)

2.15.2.2 在idea中创建maven项目,操作Jedis

添加Jedis的依赖
Redis知识点(16)
这里只是举例,所有redis中的指令,用Jedis都能实现
1.对key的操作举例
Redis知识点(16)
2.对String数据操作举例
Redis知识点(16)
在数据库中添加了
Redis知识点(16)
3.事务操作
Redis知识点(16)
数据库中有了数据
Redis知识点(16)

2.16 Redis的可视化客户端

2.16.1 安装

Redis知识点(16)

2.16.2 操作

Redis知识点(16)
Redis知识点(16)

相关文章: