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 root@172.25.254.20:/root

[root@redis-node1 bin]# rsync -al * root@172.25.254.20:/usr/local/bin

[root@redis-node1 bin]# scp -r redis-7.4.0 root@172.25.254.30:/root

[root@redis-node1 bin]# rsync -al * root@172.25.254.30:/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 root@172.25.254.20:/etc/redis/sentinel.conf

[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.30:/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]#

开启哨兵

停掉10的redis

[root@redis-node1 ~]# redis-cli

127.0.0.1:6379> shutdown

(1.20s)

not connected>

查看20

恢复node1的redis node的slave变成了两个

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 root@172.25.254.$i:/etc/redis/redis.conf; done;

6台机子redis启动成功

配置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

集群的检测

写数据,数据落到了20上

集群扩容

将50配置好之后加入集群

[root@redis-node1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.50:6379 172.25.254.10:6379

查看集群状态

加入成功,四台master

给50分配槽位

添加150进入集群(手残少打了一个空格把150加成了master (OvO))

删除50和150要先分配槽位

分配完槽位即可进行删除

查看集群 删除成功

相关推荐
tatasix42 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
秋意钟1 小时前
缓存雪崩、缓存穿透【Redis】
redis
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
简 洁 冬冬1 小时前
046 购物车
redis·购物车
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
gma9992 小时前
Etcd 框架
数据库·etcd