type
status
date
slug
summary
tags
category
icon
password
AI summary
1.1 数据库压力过大
由于用户量增大,请求数量也随之增大,数据库压力过大
1.2 数据不同步
多台服务器之间,数据不同步
1.3 传统锁失效
多台服务器之间的锁,已经不存在互斥性了。

二、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之父

三、Redis安装
3.1 安装Redis
Docker-Compose安装
3.2 使用redis-cli连接Redis
进去Redis容器的内部docker exec -it 容器id bash在容器内部,使用redis-cli连接
链接效果

3.3 使用图形化界面连接Redis
下载地址:https://github.com/lework/RedisDesktopManager-Windows/releases/download/2019.5/redis-desktop-manager-2019.5.zip傻瓜式安装
RedisDesktopManager

四、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[]。
五种常用的存储数据结构图

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存在读写瓶颈的问题
主从架构

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

修改了以下docker-compose.yml,为了可以在容器内部使用哨兵的配置
准备哨兵的配置文件,并且在容器内部手动启动哨兵即可
在Redis容器内部启动sentinel即可
6.6 Redis的集群
Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储数据的能力。
Redis集群架构图

准备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 缓存穿透问题
缓存穿透
缓存穿透

7.3.2 缓存击穿问题
缓存击穿
缓存击穿

7.3.3 缓存雪崩问题
缓存雪崩
缓存雪崩

7.3.4 缓存倾斜问题
缓存倾斜
缓存倾斜
- 作者:IT小舟
- 链接:https://www.codezhou.top/article/Redis
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。