简单来说:Redis是一种使用C语言编写的非关系型数据库(NOSQL)他的存储方式为键值对存储,提供了很多语言的API
Redis也被称为单线程数据库,因为是单线程。
官网解释:
The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.
开源的内存数据存储,被数百万开发人员用作数据库、缓存、流引擎和消息代理。
如果不想去官网这里提供云盘下载Redis安装包与RedisPlus安装包
链接:https://pan.baidu.com/s/1rlyrgi5wQU9stC5UfN9ZXg
提取码:wmxb
关系型数据库RDBMS
- 高度组织化结构化数据:
- 结构化查询语言(SQL) 支持sql语句 select * from t_user;
- 数据和关系都存储在单独的表中。---记录和关系
- 数据操纵语言DML [增删改],数据定义语言 DDL [表结构的修改]
- 严格的一致性
- 基础事务 【mysql支持事务--ACID】
非关系型数据库NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言 [不支持select 语句]
- 键 - 值对存储,【类似于map】
- 不支持事务的一致性
- 非结构化和不可预知的数据,可以是很多类型。
不是关系型数据库(RDBMS)就是非关系型数据库(NOSQL)有三个
Redis 一般Java开发使用
Mongodb 一般前端开发使用
Hbase 一般大数据开发使用
由于Redis是C语言编写需要配置C语言的环境
在Linux虚拟机输入: yum install gcc-c++
官方网址: Download | Redis
博主使用的是FinalShell虚拟机可以把安装包拖进虚拟机里去,解压目录没有要求
在你安装包的目录下使用:tar -zxvf 安装包名.tar.gz
即可解压到当前目录下
然后进入解压后的目录输入:make install
即可编译与安装帮你配置环境变量
在解压的安装包下可以看到一个redis.conf是redis的配置文件也是启动文件
使用:redis-server redis.conf 进行启动
启动的不是后台运行所以我们无法输入其他,如果嗯ctrl+c会直接关闭redis服务
我们可以开启第二个当前的虚拟机,先这样凑合后面讲Redis配置修改就不用这样了
后台启用使用方法相同
使用:redis-server redis.conf 进行启动
使用ps -ef | grep redis 查看进程(进程号root后面就是第一个数字)
关闭使用kill -9 进程号
连接格式:
redis-cli -h[连接redis服务的ip] -p[连接redis的端口号]
如果不输入 -h 与 -p 默认 使用的ip是虚拟机本机 , 端口号是6379
断开链接使用 ctrl+c
博主的版本为7.2 在解压的安装包下Redis,conf文件进行设置
在309行 daemonize 设置是否后台运行值:【yes | no】默认为no
在138行 port 设置端口号默认为 6379
在87行 bind 设置是否允许远程连接,默认只允许本机
在111行 protected-mode 设置是否开启(密码)安全模式默认为no
在380行 databases 设置数据库的个数默认为16 Redis不能新建库
安装完客户端后链接请看如下图:
select index 选择哪个数据库默认有16个 下标从0到15
flushdb 清空当前数据库的内容
flushall 清空所有数据库的内容
keys (key)名称 查看当前库特定的键
keys [可以选择以什么开头]*[以什么结尾或都带] 查看当前库所有的键
del (key)名称 删除当前库的指定键
del (key)名称 (key)名称 (key)名称 删除当前库的多个指定键以空格隔开
exists (key)名称 查看当前库是否有当前键
expire (key)名称 时间 设置指定键的过期时间 单位秒
ttl (key)名称 查看当前的键过期时间-1为永不过期
常见的五种:
String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。
更新的四种:
BitMap (2.2 版新增:位图)
HyperLogLog (2.8 版新增:基数统计)
GEO (3.2 版新增:地理位置)
Stream (5.0 版新增:流)。
命令手册地址:redis命令手册
本文只演示常见的数据类型部分常用命令。
set 键名称(key) 值参数(value) 添加相应的键值对
get 键名称(key) 获取与键对应的值
mset 键名称 值参数 键名称 值参数 添加多个键值对 以空格隔开
mget 键名称 键名称 键名称 用多个键获取各个对应值以空格隔开
setnx 键名称 值参数 添加相应的键值对如果有了则不添加
incr 键名称 为指定的键值(参数必须为数字)递增1
decr 键名称 为指定的键值(参数必须为数字)递减1
incrby 键名称 数值 为指定的键值增加你输入的数值
decrby 键名称 数值 为指定的键值减去你输入的数值
hset 键 值(field value ...) 设置多个键值对,hash的值也是相当于键值可以多个对
hget 键 值中的键(field) 使用键中的值里的field(键)获取对应的值
hmget 键 值中键 值中键 使用键值中的多个field(键)获取多个值
hgetall 键名 获取键中所有的内容
hkeys 键名 获取键中所有的field(键名)
hvals 键名 获取键中所有的value值
lpush 键名 参数... 创键或插入从左边插入的队列,第一个插入参数会在最右边
rpush 键名 参数... 创建或插入从右边插入的队列,第一个插入参数会在最左边
lpop 键名 数值 从左边取出参数,输入多少数值就取多少,并返回
rpop 键名 数值 从右边取出参数,输入多少数值就取多少,并返回
lrange 键名 数值(从哪) 数值(到哪) 查看从哪到哪的值,如 0 到 -1 查看并返回
sadd 键名 值 值 值 ... 创建或添加键与多个值
smembers 键名 获取当前键的所有值
srandmember 键名 数值(可有可无) 随机获取键中一个或多(根据你的数值)个值
sinter 键名 键名 ... 求多个集合的交集(俩集合都有的值)
spop 键名 数值(可有可无) 随机移除一个或多(根据你的数值)个值
zadd 键名 值 分数 值 分数 ... 创建或添加键与多个值跟分数(用于排序)
zrem 键名 值 删除指定键中的值与分数
zrange 键名 从哪开始 在哪结束 从分数小到大的顺序返回集合中的数据
zrevrange 键名 从哪开始 在哪结束 从分数大到小的顺序返回集合中的数据
热点数据的缓存:减少对数据库的访问频率,提高应用程序的效率。
限时业务的操作:比如短信验证码。
计时器相关的操作:比如点赞、收藏、购买量、阅读量等。
排行榜相关的操作:比如销售量、点赞量等等。
分布式锁:比如 synchronized自动锁与 lock 手动锁
什么是持久化,就是把内存中的数据保存到磁盘里的过程就被称为“持久化”是为了防止数据的丢失。
Redis有两种持久化方式:
RDB快照方式(默认):
为何称为快照模式,他就像照片一样把redis的数据拍下来进行存储
又分手动与自动
优点:恢复速度较快
缺点:丢失数据较多
AOF日志方式:
把每个会牵扯数据的操作命令通过write函数写入日志文件中当redis启动时会读取日志文件中的命令,并把这些命令由上到下执行一遍。
优点:保存数据较为完整
缺点:恢复速度较慢
第一种方式手动: 俩命令选一种即可推荐使用bgsave
save 直接进行快照
bgsave 异步进行快照
两个都会在redis的包下生成dump.rdb文件
区别:
save 使用时不能进行其他操作,因为在占用着线程
bgsave使用时可以进行其他操作,因为使用异步进行的快照。
第二种方式自动: 自动的底层也是bgsave
在redis的包下设置配置文件redis.conf
在439行 save 3600 1 300 100 60 10000
含义是:3600秒有1条数据就进行保存 或 300秒有100条 或 60秒有10000条
秒数必须执行完才会保存日志。
我们可以自己设置 多少秒内执行不小于多少条就保存日志。
save 秒 条
即可自动执行。
默认没有进行开启我们需要去Redis配置文件里开启
在1387行 appendonly no 修改为yes
在1414行 appendfilename "appendonly.aof" 可以设置日志文件名
在1420行 appenddirname "appendonlydir" 默认aof文件存放目录名
在1445行 appendfsync always 意思日志一直触发执行一条就插入一条
在1446行 appendfsync everysec 意思是每秒都会触发一次
在1447行 appendfsync no 意思不执行
注意:appendfsync 只能选择一个状态且如果开启了aof就不要选择no
使用后会在appendonlydir目录下有一个appendonly.aof.1.incr.aof文件我们可以在里面看到执行过的命令。
$2相当于空格 $3相当于回车
为什么要有Redis集群,单个Redis缓存压力过大要有多个Redis一起分担压力。
数据分配过后对于单个的压力就会骤减。
集群模式有三个分别是主从模式、哨兵模式、分片集群模式。
最早出现的便是主从是1.0版本就出现的
哨兵模式可以说是主从模式的补充是在3.0版本出现的
分片集群模式为了补充哨兵的不足而出现。
主从模式的原则是:配从不配主。
主节点进行增加修改等,辅节点是用于查询的用于给主节点分担查询压力。
需求:准备一台主机器、至少一台辅机器。
启动完后即可使用:info replication 查看状态
使用: slaveof ip port 设置主仆
ip:主节点的ip
port: 主节点的port
注意:
设置完后主节点可以进行所有操作,辅节点只能进行查看(主节点写入的操作会自动同步)
疑问:
(1) 从节点能否进行写操作? ----不能执行写操作
(2) 如果主节点宕机了从节点能否上位。---不能
(3) 如果新增一个从节点--那么该从节点是否可以把主节点之前的数据同步过来。--可以
主节点可以负责读写操作,但是从节点只负责读操作。
缺点:主节点挂了就缺少了写入的操作,只能让维修半夜起来赶修。
哨兵模式作为主从的补充,从何而补主从的问题:
当主节点出现故障那整个集群便没有了写的操作,
哨兵用于监控如果主节点出故障就会把一个辅节点变为主节点。
在Redis包下有sentinel.conf 设置哨兵配置
配置哨兵 监控 集群名随便起 监控主节点ip 主节点port 获得哨兵的票数
在92行 sentinel monitor mymaster 127.0.0.1 6379 2
可以进行自定义配置
ip 换自己的 端口号也一样 票数是哪个辅节点得到设置的票数即可变成主节点
配置完之后即可直接启动:redis-sentinel sentinel.conf
思考: 如果6380复活了,那么6381会不会让位?---不会。
如果你启动多台虚拟机---注意:关闭防火墙。
无需修改配置文件
缺点:单个的主节点写的频率多了还是会挂,虽然能被辅节点替换但也不是长久之计。
分片集群为了弥补哨兵模式单个主节点的不足让多个主节点共同进行承担,分片模式里的主节点依旧是有哨兵的。
他们会有多个主节点了,但疑问来了:客户要存储到哪个主节点里?
解决办法: 使用了分槽技术。默认集群槽的数量为16384个。
而每个槽可以存放若干个数据,如果搭建redis集群模式的话,为主节点平均分片这些槽。
分槽原理:
用户输入数值,根据数值进行 crc16 哈希算法得到一个值然后与总槽数取余剩下的这个值是小于我们总槽数的然后根据剩下的这个数选择对应的槽。
总槽假如为300
例子 输入 a —> crc16算成 —> 97 —> 97%300= 97
结果为97那就去范围是0到99的主机器1
( 0 ~ 99 ) 主机器1 辅节点 辅节点
(100 ~ 199 )主机器2 辅节点 辅节点
(200 ~ 299 )主机器3 辅节点 辅节点
配置准备:
1. 必须开启aof模式
在1387行 appendonly no 修改为yes
2. 开启redis集群模式在Redis包下的配置文件中
在1584行 cluster-enabled yes
3. 设置允许任意ip访问: bind * -::*
在87行 bind 设置是否允许远程连接,默认只允许本机
为Redis设置主从关系并分配槽
开始Redis集群模式 创建集群副本 每个主节点辅节点数
redis-cli --cluster create --cluster-replicas 1 所有的ip地址与端口号以空格分开
示例: 有六个虚拟机,设置每个主节点有一个辅节点
redis-cli --cluster create --cluster-replicas 1 192.168.223.158:7001 192.168.223.158:7002 192.168.223.158:7003 192.168.223.158:7004 192.168.223.158:7005 192.168.223.158:7006
设置输入后:
可以看到M就是主节点,S是辅节点
输入yes即可确定启动的话启动六个随便一个即可
命令:redis-cli -c -h ip地址 -p 端口号
如果是创建项目时
或依赖:
org.springframework.boot spring-boot-starter-data-redis
单机连接
application.properties
# 连接单机redis spring.redis.host=ip地址 spring.redis.port=端口号
集群连接
# 集群redis spring.redis.cluster.nodes=地址ip:端口号,(多个以逗号隔开)
springboot在整合redis时会自动封装了两个类:RedisTemplate和StringRedisTemplate. StringRedisTemplate它是RedisTemplate的子类,StringRedisTemplate它里面存储的key和value都是字符串类型。
有两种使用方式 RedisTemplate类型 与 StringRedisTemplate类型
方法的名称基本都改变了。
类型有对应的类型
RedisTemplate类型
@Autowired private RedisTemplate redisTemplate;
StringRedisTemplate类型
@Autowired private StringRedisTemplate redisTemplate;