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要先分配槽位

分配完槽位即可进行删除

查看集群 删除成功

相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi2 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据3 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi4 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀4 小时前
Redis梳理
数据库·redis·缓存
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天4 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺4 小时前
分布式系统架构:服务容错
数据库·架构