type
status
date
slug
summary
tags
category
icon
password
notion image

1.1 数据库压力过大

由于用户量增大,请求数量也随之增大,数据库压力过大

1.2 数据不同步

多台服务器之间,数据不同步

1.3 传统锁失效

多台服务器之间的锁,已经不存在互斥性了。
notion image

二、Redis介绍


2.1 NoSQL介绍

Redis就是一款NoSQL。NoSQL -> 非关系型数据库 -> Not Only SQL。Key-Value:Redis。。。文档型:ElasticSearch,Solr,Mongodb。。。面向列:Hbase,Cassandra。。。图形化:Neo4j。。。除了关系型数据库都是非关系型数据库。NoSQL只是一种概念,泛指非关系型数据库,和关系型数据库做一个区分。

2.2 Redis介绍

有一位意大利人,在开发一款LLOOGG的统计页面,因为MySQL的性能不好,自己研发了一款非关系型数据库,并命名为Redis。Salvatore。Redis(Remote Dictionary Server)即远程字典服务,Redis是由C语言去编写,Redis是一款基于Key-Value的NoSQL,而且Redis是基于内存存储数据的,Redis还提供了多种持久化机制,性能可以达到110000/s读取数据以及81000/s写入数据,Redis还提供了主从,哨兵以及集群的搭建方式,可以更方便的横向扩展以及垂直扩展。
Redis之父

notion image

三、Redis安装


3.1 安装Redis

Docker-Compose安装

3.2 使用redis-cli连接Redis

进去Redis容器的内部
docker exec -it 容器id bash
在容器内部,使用redis-cli连接
链接效果

notion image

3.3 使用图形化界面连接Redis

下载地址:https://github.com/lework/RedisDesktopManager-Windows/releases/download/2019.5/redis-desktop-manager-2019.5.zip
傻瓜式安装
RedisDesktopManager

notion image

四、Redis常用命令【重点


4.1 Redis存储数据的结构

常用的5种数据结构:
  • key-string:一个key对应一个值。
  • key-hash:一个key对应一个Map。
  • key-list:一个key对应一个列表。
  • key-set:一个key对应一个集合。
  • key-zset:一个key对应一个有序的集合。
另外三种数据结构:
  • HyperLogLog:计算近似值的。
  • GEO:地理位置。
  • BIT:一般存储的也是一个字符串,存储的是一个byte[]。
五种常用的存储数据结构图

notion image

key-string:最常用的,一般用于存储一个值。key-hash:存储一个对象数据的。key-list:使用list结构实现栈和队列结构。key-set:交集,差集和并集的操作。key-zset:排行榜,积分存储等操作。

4.2 string常用命令

string常用操作命令

4.3 hash常用命令

hash常用命令

4.4 list常用命令

list常用命令

4.5 set常用命令

set常用命令

4.6 zset的常用命令

zset常用命令

4.7 key常用命令

key常用命令

4.8 库的常用命令

db常用命令

五、Java连接Redis【重点


5.1 Jedis连接Redis

5.1.1 创建Maven工程

idea创建

5.1.2 导入需要的依赖

5.1.3 测试

5.2 Jedis存储一个对象到Redis以byte[]的形式

5.2.1 准备一个User实体类

5.2.2 导入spring-context依赖

5.2.3 创建Demo测试类,编写内容

5.3 Jedis存储一个对象到Redis以String的形式

5.3.1 导入依赖

5.3.2 测试

5.4 Jedis连接池的操作

使用连接池操作Redis,避免频繁创建和销毁链接对象消耗资源

5.5 Redis的管道操作

因为在操作Redis的时候,执行一个命令需要先发送请求到Redis服务器,这个过程需要经历网络的延迟,Redis还需要给客户端一个响应。
如果我需要一次性执行很多个命令,上述的方式效率很低,可以通过Redis的管道,先将命令放到客户端的一个Pipeline中,之后一次性的将全部命令都发送到Redis服务,Redis服务一次性的将全部的返回结果响应给客户端。

5.6 Redis的应用

5.6.1 准备开放平台项目

在资料资料中

5.6.2 准备docker-compose.yml文件

5.6.3 部署项目到Tomcat容器中

打成war包,复制到数据卷路径中即可

5.6.4 修改认证功能

5.6.5 修改过滤器信息

5.6.6 修改SystemController

5.6.7 重新部署

重新打成war包,复制到数据卷路径中即可

六、Redis其他配置及集群【重点


修改yml文件,以方便后期修改Redis配置信息

6.1 Redis的AUTH

方式一:通过修改Redis的配置文件,实现Redis的密码校验
三种客户端的连接方式
  • redis-cli:在输入正常命令之前,先输入auth 密码即可。
  • 图形化界面:在连接Redis的信息中添加上验证的密码。
  • Jedis客户端:
    • jedis.auth(password);
  • 使用JedisPool的方式
方式二:在不修改redis.conf文件的前提下,在第一次链接Redis时,输入命令:Config set requirepass 密码
后续向再次操作Redis时,需要先AUTH做一下校验。

6.2 Redis的事务

Redis的事务:一次事务操作,改成功的成功,该失败的失败。
先开启事务,执行一些列的命令,但是命令不会立即执行,会被放在一个队列中,如果你执行事务,那么这个队列中的命令全部执行,如果取消了事务,一个队列中的命令全部作废。
  • 开启事务:multi
  • 输入要执行的命令:被放入到一个队列中
  • 执行事务:exec
  • 取消事务:discard
Redis的事务向发挥功能,需要配置watch监听机制
在开启事务之前,先通过watch命令去监听一个或多个key,在开启事务之后,如果有其他客户端修改了我监听的key,事务会自动取消。
如果执行了事务,或者取消了事务,watch监听自动消除,一般不需要手动执行unwatch。

6.3 Redis持久化机制

6.3.1 RDB

RDB是Redis默认的持久化机制
  • RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传输起来很方便。
  • RDB持久化的时机:
    • save 900 1:在900秒内,有1个key改变了,就执行RDB持久化。
      save 300 10:在300秒内,有10个key改变了,就执行RDB持久化。
      save 60 10000:在60秒内,有10000个key改变了,就执行RDB持久化。
  • RDB无法保证数据的绝对安全。

6.3.2 AOF

AOF持久化机制默认是关闭的,Redis官方推荐同时开启RDB和AOF持久化,更安全,避免数据丢失。
  • AOF持久化的速度,相对RDB较慢的,存储的是一个文本文件,到了后期文件会比较大,传输困难。
  • AOF持久化时机。
    • appendfsync always:每执行一个写操作,立即持久化到AOF文件中,性能比较低。 appendfsync everysec:每秒执行一次持久化。 appendfsync no:会根据你的操作系统不同,环境的不同,在一定时间内执行一次持久化。
  • AOF相对RDB更安全,推荐同时开启AOF和RDB。

6.3.3 注意事项

同时开启RDB和AOF的注意事项:
如果同时开启了AOF和RDB持久化,那么在Redis宕机重启之后,需要加载一个持久化文件,优先选择AOF文件。
如果先开启了RDB,再次开启AOF,如果RDB执行了持久化,那么RDB文件中的内容会被AOF覆盖掉。

6.4 Redis的主从架构

单机版 Redis存在读写瓶颈的问题
主从架构

notion image

指定yml文件

6.5 哨兵

哨兵可以帮助我们解决主从架构中的单点故障问题
添加哨兵

notion image

修改了以下docker-compose.yml,为了可以在容器内部使用哨兵的配置
准备哨兵的配置文件,并且在容器内部手动启动哨兵即可
在Redis容器内部启动sentinel即可

6.6 Redis的集群

Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储数据的能力。
Redis集群架构图

notion image

准备yml文件
配置文件
启动了6个Redis的节点。
随便跳转到一个容器内部,使用redis-cli管理集群

6.7 Java连接Redis集群

使用JedisCluster对象连接Redis集群

七、Redis常见问题【重点


7.1 key的生存时间到了,Redis会立即删除吗?

不会立即删除。
  • 定期删除:Redis每隔一段时间就去会去查看Redis设置了过期时间的key,会再100ms的间隔中默认查看3个key。
  • 惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,直接删除当前key,并且给用户返回一个空值。

7.2 Redis的淘汰机制

在Redis内存已经满的时候,添加了一个新的数据,执行淘汰机制。
  • volatile-lru:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少使用的key。
  • allkeys-lru:在内存不足时,Redis会再全部的key中干掉一个最近最少使用的key。
  • volatile-lfu:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少频次使用的key。
  • allkeys-lfu:在内存不足时,Redis会再全部的key中干掉一个最近最少频次使用的key。
  • volatile-random:在内存不足时,Redis会再设置过了生存时间的key中随机干掉一个。
  • allkeys-random:在内存不足时,Redis会再全部的key中随机干掉一个。
  • volatile-ttl:在内存不足时,Redis会再设置过了生存时间的key中干掉一个剩余生存时间最少的key。
  • noeviction:(默认)在内存不足时,直接报错。

7.3 缓存的常问题

7.3.1 缓存穿透问题

缓存穿透
缓存穿透

notion image

7.3.2 缓存击穿问题

缓存击穿
缓存击穿

notion image

7.3.3 缓存雪崩问题

缓存雪崩
缓存雪崩

notion image

7.3.4 缓存倾斜问题

缓存倾斜
缓存倾斜


 
ServletMysql
IT小舟
IT小舟
微信公众号:IT小舟
公告
type
status
date
slug
summary
tags
category
icon
password
notion image
你好,我是小舟。 欢迎来到我的博客,我喜欢运动、阅读、音乐和写作。如果有什么想要交流的,可以加我微信:upcodezhou。再次感谢你的光临!
notion image