redis

一.企业级NoSql数据库Redis集群

1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。

NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适 用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键 值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库 (MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用 场景及优点。

1.2 为什么还要用 NoSQL 数据库呢?

主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺 陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足 日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优 势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高

二.了解redis

2.1 redis简介

Redis 是C语言开发的一个开源高性能键值对的内存数据库 ,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库

2.2 redis特点

  • 优秀的性能,数据是存储在内存中,读写速度非常快,可支持并发10W QPS

  • 单线程但进程,是线程安全的,采用IO 多路复用制

  • 可作为分布式锁

  • 支持五种数据类型

  • 支持数据持久化到磁盘

  • 可以作为消息中间件使用,支持消息发布及订阅

2.3 redis应用场景

Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享

缓存:数据查询、电商网站商品信息、新闻内容

计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景

微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等

消息队列:ELK的日志缓存、部分业务的订阅发布系统

地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能

三. 缓存

3.1 数据缓存

数据缓存是Redis最重要的一个场景,为缓存而生,在springboot中,一般有两种使用方式:

  • 直接通过RedisTemplate使用

  • 通过Spring Cache集成Redis(也就是注解的方式)

3.2 使用缓存会遇到的问题

(1) 数据一致性

在分布式环境下,缓存和数据库很容易出现数据一致性问题,如果项目对缓存的要求是强一致性,那就不要使用缓存。

我们只能在项目中使用策略降低缓存与数据库一致性的概率,是无法保障两者的强一致性,一般策略包括缓存更新机制,更新数据库后及时更新缓存、缓存失败时增加重试机制

(2) 缓存雪崩

在了解雪崩溃之前,我们先了解什么是缓存雪崩现象,假设A系统每秒需要处理5000个请求,但数据库每秒只能处理4000个请求,某一天,缓存机器出现了宕机,挂了,这时候所有的请求一下子全部落在数据库上,数据库肯定扛不住,报警挂掉了,这时候如果没有采取缓存设施,数据库又急着用,重新重启数据库,刚重启完成(有可能没启动完),请求又来,数据库立马挂掉。这就是雪崩事件,是Redis缓存中最致命问题之一(有一个是穿透)

出现雪崩事件后不要急不要慌,我们可以在事故前中后三个方面来思考解决方案

  • 事故前:redis高可用方案,主从+哨兵,集群方案,避免全盘崩溃

  • 事故中:较少数据库的压力,本地Ehcache缓存+限流及降级,避免超过数据库承受压力

  • 事故后:做redis持久化,一旦Redis重启,可从磁盘中快速恢复数据

四. redis实验

4.1 redis的源码安装

sql 复制代码
[root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
[root@redis-node1 ~]# cd redis-7.4.0
[root@redis-node1 redis-7.4.0]# dnf install make -y
[root@redis-node1 redis-7.4.0]# dnf install initscripts -y

[root@redis-node1 redis-7.4.0]# dnf install gcc -y
[root@redis-node1 redis-7.4.0]# ll /etc/init.d/
总用量 24
-rw-r--r--  1 root root 18220  8月 24  2022 functions
-rw-r--r--. 1 root root  1161  9月 23  2022 README

[root@redis-node1 utils]# make
[root@redis-node1 utils]# make install

修改配置文件

protected-mode no

bind * -::*

将10文件复制到20和30(同样修改配置文件后restart)

root@redis-node1 bin\]# scp -r redis-7.4.0 [email protected]:/root \[root@redis-node1 bin\]# rsync -al \* [email protected]:/usr/local/bin \[root@redis-node1 bin\]# scp -r redis-7.4.0 [email protected]:/root \[root@redis-node1 bin\]# rsync -al \* [email protected]:/usr/local/bin

4.2 redis的主从集群

在node1中修改配置文件

sql 复制代码
[root@redis-node1 ~]# vim /etc/redis/6379.conf

protected-mode no

在node2和node3上修改文件

node1

node2

4.3 redis哨兵

sql 复制代码
[root@redis-node1 ~]# cd redis-7.4.0/
[root@redis-node1 redis-7.4.0]# ls
[root@redis-node1 redis-7.4.0]# cp sentinel.conf /etc/redis
[root@redis-node1 redis-7.4.0]# vim /etc/redis/sentinel.conf
protected-mode no
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
loglevel notice
sentinel monitor mymaster 172.25.254.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

将修改的文件复制到20和30

root@redis-node1 redis-7.4.0\]# scp /etc/redis/sentinel.conf [email protected]:/etc/redis/sentinel.conf \[root@redis-node1 redis-7.4.0\]# scp /etc/redis/sentinel.conf [email protected]:/etc/redis/sentinel.conf 备份一个文件(node1,2,3都做) ```sql [root@redis-node1 redis-7.4.0]# cd /etc/redis [root@redis-node1 redis]# ls 6379.conf sentinel.conf [root@redis-node1 redis]# cp sentinel.conf sentinel.conf.bak [root@redis-node1 redis]# ls 6379.conf sentinel.conf sentinel.conf.bak [root@redis-node1 redis]# ``` 开启哨兵 ![](https://i-blog.csdnimg.cn/direct/e8d43e06ffe84ff098f2f5e80f6a67c2.png) 停掉10的redis \[root@redis-node1 \~\]# redis-cli 127.0.0.1:6379\> shutdown (1.20s) not connected\> 查看20 ![](https://i-blog.csdnimg.cn/direct/1239912759df4243a77da7298147d48b.png) ![](https://i-blog.csdnimg.cn/direct/b2a1d4769e924d2f8b10fbc1d81d81f2.png) 恢复node1的redis node的slave变成了两个 ![](https://i-blog.csdnimg.cn/direct/50d1f891f5df434684c8b9d5974eb99d.png) ### 4.4 redis cluster集群 删除源码编译的redis,用rpm下载redis(6台机子) \[root@redis-node1 \~\]# yum install redis -y 修改配置文件 ```sql masterauth "123456" requirepass "123456" cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 ``` \[root@redis-node1 \~\]# systemctl restart redis.service \[root@redis-node1 \~\]# redis-cli 127.0.0.1:6379\> quit 将修改的配置文件复制到其他主机 ```sql [root@redis-node1 ~]# for i in 20 30 110 120 130; do scp /etc/redis/redis.conf [email protected].$i:/etc/redis/redis.conf; done; ``` 6台机子redis启动成功 ![](https://i-blog.csdnimg.cn/direct/3d175dc001cc4a9bb6ad36bc7781f3fe.png) 配置cluster ```sql [root@redis-node1 ~]# redis-cli --cluster create -a 123456 \ > 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \ > 172.25.254.110:6379 172.25.254.120:6379 172.25.254.130:6379 \ > --cluster-replicas 1 ``` ![](https://i-blog.csdnimg.cn/direct/0a9d63234f5543c4a04e0a65ae2468c2.png) 集群的检测 ![](https://i-blog.csdnimg.cn/direct/6e23f5f13a344eb9886239f6256e3121.png) 写数据,数据落到了20上 ![](https://i-blog.csdnimg.cn/direct/cc939150b6334882a4b79c03f443bdd8.png) #### 集群扩容 将50配置好之后加入集群 \[root@redis-node1 \~\]# redis-cli -a 123456 --cluster add-node 172.25.254.50:6379 172.25.254.10:6379 查看集群状态 ![](https://i-blog.csdnimg.cn/direct/5fa7efe0cf144404971cbaac0856025e.png) 加入成功,四台master 给50分配槽位 ![](https://i-blog.csdnimg.cn/direct/0adbf541a61145a0a501f953ac1ebfab.png) 添加150进入集群(手残少打了一个空格把150加成了master (OvO)) ![](https://i-blog.csdnimg.cn/direct/033b4e86a32746b4b225b7b07a2c0a58.png) 删除50和150要先分配槽位 ![](https://i-blog.csdnimg.cn/direct/2eeec21da46f46d8ad22208c79645773.png) 分配完槽位即可进行删除 ![](https://i-blog.csdnimg.cn/direct/a54e1bd8e2474250804365196d370ee9.png) 查看集群 删除成功 ![](https://i-blog.csdnimg.cn/direct/4104d6a429ae4d5da8d9f6831b3f5aea.png)

相关推荐
数据智能老司机14 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机14 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿15 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
Kagol15 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
无名之逆15 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s91236010115 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机15 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy15 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖15 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
ashane131417 小时前
Redis 哨兵集群(Sentinel)与 Cluster 集群对比
redis