从缓存到redis

从缓存到Redis

文章目录

  • 从缓存到Redis
    • 一、缓存的基础知识
      • (1)为什么使用缓存
      • (2)缓存的本质
      • (3)缓存的加载时机
      • (4)缓存的两种使用方式
        • 使用方式一:本地缓存
        • 使用方式二:远程缓存(集中式缓存)
    • 二、Redis
      • (1)安装Redis
      • (2)redis的三种模式
      • (3)启动redis,并查看redis的性能
      • (4)redis的数据结构
        • 五种基本数据结构
        • 四种高级数据结构
      • (6)redis到底是单线程还是多线程
      • (7)redis的常规操作
      • (8)redis协议规范
    • 三、redis-cluster
      • (1)3主节点
        • 直接运行`create-redis-cluster-3.sh`,
        • `-c`参数
        • `cluster-require-full-coverage`参数
      • (2)3主3从

一、缓存的基础知识

(1)为什么使用缓存

有些数据读写比特别高:这些数据变动特别小,读取到次数特别多,所以把这些数据在内存中缓存起来;

这样就可以把这些数据从远程、从磁盘放到内存里来。

(2)缓存的本质

使用空间换时间。

CPU、内存、磁盘、网络IO等等,系统各级处理速度不匹配。

因此,缓存用不好,是会比较大的浪费内存资源的。

(3)缓存的加载时机

  1. 启动全量加载

    • 利:全局有效,使用简单;
    • 弊:可能加载的慢,可能会浪费内存资源(比如:加载200万条,只使用其中的10万条);
  2. 懒加载(使用的时候,再加载)

    方式一:同步使用加载:以数据库为准

    • 先看缓存是否有数据,没有的话从数据库读取;
    • 读取的数据,先放缓存,然后返回给调用方;

    方式二:延迟异步加载:以缓存为准

    • 默认缓存的数据是可靠的,随时去缓存中去读;
    • 策略一:没有话,则发起一个异步加载的线程,从数据库里拉取数据,将数据同步到缓存中;
    • 策略二:直接用一个异步的线程,定期或根据条件触发更新,把数据库中增量变化的数据,加载到缓存中来;

(4)缓存的两种使用方式

使用方式一:本地缓存

只在当前的JVM里生效。

  • 平时用到的ORM框架:hibernate 、mybatis之类,都有两级的本地缓存;
  • 最简单的本地缓存:使用一个Map来存数据;
  • 更进一步:caffeine、Guava caches
使用方式二:远程缓存(集中式缓存)

缓存中间件,有三大类:

  • Redis/Memcached

    redis是缓存领域的事实标准,简单、快。

  • Hazelcast/Ignite 内存网格

    把现在分布式的一致性和缓存结合起来

  • kv存储:区分冷数据和热数据。数据量特别大,可以使用这些:

    tikv、kvrocks、pegasus

    这些都实现了redis协议的接口,可以当作redis来用。

Spring Cache:Spring Cache 是 Spring 框架提供的一个简化缓存管理的抽象层,它可以帮助开发者轻松地将缓存功能集成到 Spring 应用中。Spring Cache 通过注解和接口,使得缓存的使用变得简单而灵活,支持多种缓存实现(如 EhCache、Caffeine、Redis 等)。

二、Redis

(1)安装Redis

mac 上安装:

-- 查看redis的版本
$ brew search redis
-- 

centos 上支持的redis版本:

-- 查看支持的redis版本
$ yum search redis

大规模使用的redis版本为:6.2.6

https://redis.io/downloads/

-- 解压
$ tar -zxvf softs/redis-6.2.14.tar.gz -C servers/
$ make && make install

这些命令都在src目录下:

$ ll src/redis-* | grep '^[-rwx]*x'
-rwxr-xr-x  1 lifei  staff   427672  6 24 13:34 src/redis-benchmark*
-rwxr-xr-x  1 lifei  staff  1841104  6 24 13:34 src/redis-check-aof*
-rwxr-xr-x  1 lifei  staff  1841104  6 24 13:34 src/redis-check-rdb*
-rwxr-xr-x  1 lifei  staff   362464  6 24 13:34 src/redis-cli*
-rwxr-xr-x  1 lifei  staff  1841104  6 24 13:34 src/redis-sentinel*
-rwxr-xr-x  1 lifei  staff  1841104  6 24 13:34 src/redis-server*
-rwxr-xr-x  1 lifei  staff     3600 10 18  2023 src/redis-trib.rb*

编译完成之后,查看redis版本:

$ redis-server -v
Redis server v=6.2.14 sha=00000000:0 malloc=libc bits=64 build=836ce99012cb6f31

(2)redis的三种模式

  • 第一种模式:单机的redis:需要redis-server就够了;

  • 第二种模式:哨兵机制。需要redis-sentinel哨兵,监听redis是否宕机,主节点宕机,就会选择从节点;

    redis-sentinelredis-server文件大小一样,其实它们是一个东西,只不过启动的时候添加的参数不一样。

  • 第三种模式:redis-cluster:

(3)启动redis,并查看redis的性能

启动redis:

$ cd redis-6.2.14/
$ mkdir -p logs
$ mkdir -p data
  • appendfilename:AOF记录每一个写操作,对应的文件名;
  • appendonly:是否开启AOF;
  • dbfilename:记录快照的文件名;
  • dir :指定appendfilenameappendonly存放的目录,不能使用相对路径,要实用绝对路径
  • logfile:指定日志存放文件;
  • daemonize:指定redis是否以守护线程方式运行;
./src/redis-server --port 6379 --dir /Users/lifei/Downloads/dev/servers/redis-6.2.14/data --appendonly yes --appendfilename appendonly-6379.aof --dbfilename dump-6379.rdb --logfile /Users/lifei/Downloads/dev/servers/redis-6.2.14/logs/6379.log --daemonize yes

查看redis的性能:32 个并发连接,调用10万次

$ redis-benchmark -n 100000 -c 32 -t SET,GET,INCR,HSET,LPUSH,MSET -q
SET: 87412.59 requests per second, p50=0.207 msec
GET: 87260.03 requests per second, p50=0.183 msec
INCR: 87719.30 requests per second, p50=0.207 msec
LPUSH: 87260.03 requests per second, p50=0.215 msec
HSET: 88028.16 requests per second, p50=0.215 msec
MSET (10 keys): 52938.06 requests per second, p50=0.439 msec

可以看到除了MSET,其它的SET,GET 等请求,每秒钟可以处理8万次请求。

p50:有一半的请求,在0.2毫秒内就处理完了。

(4)redis的数据结构

五种基本数据结构
  1. 字符串(String):存储数字(int)、文本(string)或二进制数据(byte[])
  2. 哈希(Hash):用来存储键值对集合
  3. 列表(List):有序字符串列表,可以从两端插入和移除元素
  4. 集合(Set):无序的字符串集合
  5. 有序集合(Sorted Set 或 Zset):类似集合,但每个元素都会关联一个分数,元素按分数排序
四种高级数据结构
  1. 位图(Bitmap)
  2. HyperLogLog
  3. GEO:地理空间(Geospatial),redis 3.2
  4. 流(Stream), redis 5.0

(6)redis到底是单线程还是多线程

redis的核心数据处理永远是单线程的。因为它的高性能是建立在没有并发,没有锁的情况下完成的。

查看redis的线程:

-- centos上 安装gdb
brew install gdb
pstack <pid>
-- mac 行
xcode-select --installlldb -p <pid>thread backtrace all

将压测运行起来,继续看线程

(7)redis的常规操作

-- string
127.0.0.1:6379> set k01 a01
OK
127.0.0.1:6379> get k01
"a01"
127.0.0.1:6379> INCR counter
(integer) 1
127.0.0.1:6379> INCR counter
(integer) 2
127.0.0.1:6379> DECR conter
(integer) -1
127.0.0.1:6379> DECR counter
(integer) 1
127.0.0.1:6379> APPEND k01 b02
(integer) 6
127.0.0.1:6379> get k01
"a01b02"
-- 哈希
127.0.0.1:6379> HSET user01 name 'aa' score 23
(integer) 2
127.0.0.1:6379> HGET user01 name
"aa"
127.0.0.1:6379> HGETALL user01
1) "name"
2) "aa"
3) "score"
4) "23"
127.0.0.1:6379>-- list
127.0.0.1:6379> LPUSH list01 1 2 3 4
(integer) 4
127.0.0.1:6379> LPOP list01
"4"
127.0.0.1:6379> RPOP list01
"1"
127.0.0.1:6379> LRANGE list01 0 1
1) "3"
2) "2"
127.0.0.1:6379>-- 集合
127.0.0.1:6379> SADD set01 'aa' 'aa' 'bb' 'cc'
(integer) 3
127.0.0.1:6379> SREM set01 'aa'
(integer) 1
127.0.0.1:6379> SREM set01 'bb'
(integer) 1
127.0.0.1:6379> SREM set01 'cc'
(integer) 1
127.0.0.1:6379> SMEMBERS set01
(empty array)
127.0.0.1:6379> SADD set01 'aa' 'bb'
(integer) 2
127.0.0.1:6379> SMEMBERS set01
1) "bb"
2) "aa"
127.0.0.1:6379>-- 无序集合
127.0.0.1:6379> ZADD myzset 1 'one'
(integer) 1
127.0.0.1:6379> ZADD myzset 3 'two'
(integer) 1
127.0.0.1:6379> ZADD myzset 2 'threee'
(integer) 1
127.0.0.1:6379> ZRANGE myzset 1 2
1) "threee"
2) "two"
127.0.0.1:6379>

当执行这些命令的时候,redis客户端给redis服务端发送什么信息,redis服务端给redis客户端返回什么信息?

(8)redis协议规范

redis协议规范,定义了redis交互的时候,使用的数据格式。

https://redis.io/docs/latest/develop/reference/protocol-spec/

在macOS上本地流量不会通过网络接口发送,因此tcpdump无法抓取到本地redis流量。

cd /data/dev/servers/redis-6.2.14
mkdir -p {data,logs}./src/redis-server --port 6379 --dir /data/dev/servers/redis-6.2.14/data --appendonly yes --appendfilename appendonly-6379.aof --dbfilename dump-6379.rdb --logfile /data/dev/servers/redis-6.2.14/logs/6379.log --daemonize yes --protected-mode no

显示系统当前的网络连接,并筛选出所有处LISTEN状态的TCP连接。

netstat -antop | grep LIST

启动redis客户端:

$ ./src/redis-cli -h <redis-remote-ip>

开始抓包:

sudo tcpdump  -s 0 -vvnnS -c 10000 -AX  tcp port 6379 and host <redis-remote-ip>

三、redis-cluster

快速搭建redis集群:https://blog.csdn.net/hefrankeleyn/article/details/139999092

一般用3个节点或5个节点,保持单数。

(1)3主节点

mkdir cluster-conf
直接运行create-redis-cluster-3.sh

查看集群情况:

$ ps aux | grep redis-server

查看集群的状态:

$ ./src/redis-cli -p 6000 cluster nodes
513fc12cb71f7e6830398295eb4dc06ec29b6f01 127.0.0.1:6001@16001 master - 0 1719361763466 2 connected 5461-10922
27fad9fe9baa883ed0e92df5f232d04ce438b1b0 127.0.0.1:6002@16002 master - 0 1719361762960 3 connected 10923-16383
43eeb0a82a9eb3b6de6e69a11c9a38f44beedbf2 127.0.0.1:6000@16000 myself,master - 0 1719361762000 1 connected 0-5460
  • 哈希槽
-c参数

使用:

$ ./src/redis-cli -p 6000
127.0.0.1:6000> set k1 100
(error) MOVED 12706 127.0.0.1:6002
127.0.0.1:6000> set k2 200
OK
127.0.0.1:6000> set k3 300
OK
127.0.0.1:6000> CLUSTER KEYSLOT k1
(integer) 12706
127.0.0.1:6000> CLUSTER KEYSLOT k2
(integer) 449
127.0.0.1:6000> quit-- 加上 -c 参数,可以自动跳到合适的槽位上
$ ./src/redis-cli -c -p 6000
127.0.0.1:6000> set k1 100
-> Redirected to slot [12706] located at 127.0.0.1:6002
OK
127.0.0.1:6002> set k2 200
-> Redirected to slot [449] located at 127.0.0.1:6000
OK
127.0.0.1:6000> set k3 300
OK
127.0.0.1:6000> CLUSTER KEYSLOT k1
(integer) 12706
127.0.0.1:6000>
cluster-require-full-coverage参数

把其中一个节点kill掉,会发生什么:宕了一个节点,其它节点也不能用了。

127.0.0.1:6001> set k1 100
(error) CLUSTERDOWN The cluster is down

把宕机的节点重启之后就好了。

$ ./src/redis-cli -p 6000 cluster nodes

宕掉一个节点,查看状态。

如何才能让宕掉一个节点,依然起作用呢?

cluster-require-full-coverage参数,默认是yes,表示节点全部正常,集群才起作用。把它改成no。

cluster-require-full-coverage no

然后重新创建集群,清空历史数据后,运行create-redis-cluster-no-full-3.sh

rm -rf data/*
rm -rf cluster-conf/*
$ ./src/redis-cli -c -p 6000
127.0.0.1:6000> get k1
-> Redirected to slot [12706] located at 127.0.0.1:6002
(nil)
127.0.0.1:6002> set k1 100
OK
127.0.0.1:6002> set k2 200
-> Redirected to slot [449] located at 127.0.0.1:6000
OK
127.0.0.1:6000> set k3 300
OK
127.0.0.1:6000> set k4 400
-> Redirected to slot [8455] located at 127.0.0.1:6001

这个时候,再去干掉一个节点,发现存活的节点还能用

再干掉一个节点,只剩下一个存活的节点:

127.0.0.1:6001> get k4
(error) CLUSTERDOWN The cluster is down

如果存活节点数,少于一半,无论如何都不能用了。多于一半,刚那个参数是可以用的。

利:集群容量可以线性扩张;

弊:对于不放在这个节点的数据,获取不到;

(2)3主3从

直接运行:create-redis-cluster-6-3m3s.sh

如果没有运行起来,可能是端口被占用了。

lsof -i:7000

$ ./src/redis-cli -c -p 7001
127.0.0.1:7001> cluster nodes
f71ebe522c66975b12ec623f53331ed6a5b15a40 127.0.0.1:7003@17003 master - 0 1719380412595 3 connected 10923-16383
67f479015cedf489b6a6542c139711beccd74423 127.0.0.1:7006@17006 slave f71ebe522c66975b12ec623f53331ed6a5b15a40 0 1719380411583 3 connected
ebd2f7ac281a413a0af2059389866a5c041b4255 127.0.0.1:7002@17002 master - 0 1719380411583 2 connected 5461-10922
4ed0f1de4d91fb4eec406a1b6e8688713702c87f 127.0.0.1:7004@17004 slave 2cdc24b20be21f9af998e329e68ee22947393b0c 0 1719380412000 1 connected
2cdc24b20be21f9af998e329e68ee22947393b0c 127.0.0.1:7001@17001 myself,master - 0 1719380412000 1 connected 0-5460
442c6a74ab908f87dfdb5f96c5bef80567bb82b5 127.0.0.1:7005@17005 slave ebd2f7ac281a413a0af2059389866a5c041b4255 0 1719380412697 2 connected
127.0.0.1:7001>

设置几个数据,干掉一个节点。

再把宕机的节点拉起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中&#xff0c;生成随机数是一种常见的需求&#xff0c;无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中&#xff0c;我们将通过一…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤&#xff1a; ① 程序开始前&#xff0c;我们要断言一下&#xff0c;确保指针是有效的&#xff0c;不是NULL&#xff1b; ② 我们还要断言一下&#xff0c;指定的…

ctfshow sql注入 web234--web241

web234 $sql "update ctfshow_user set pass {$password} where username {$username};";这里被过滤了&#xff0c;所以我们用\转义使得变为普通字符 $sql "update ctfshow_user set pass \ where username {$username};";那么这里的话 pass\ where…

Hadoop和Flink漏洞修复

Hadoop漏洞修复 CVE-2021-33036: Hadoop YARN REST API 未授权访问导致远程代码执行漏洞Cluster Overview 未授权访问漏洞Hadoop 未授权访问漏洞 修复方法1 修复方法1 1、进入hadoop配置文件目录&#xff0c;创建密钥文件 cd /home/flink/hadoop-3.3.2/etc/hadoop echo &qu…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

API类别 - UI核心

API类别 - UI核心 引言 在当今的数字时代&#xff0c;用户界面&#xff08;UI&#xff09;是任何软件或应用成功的关键因素之一。UI核心API作为构建用户界面的基础&#xff0c;提供了丰富的功能和工具&#xff0c;使得开发者能够创建出既美观又实用的用户界面。本文将深入探讨…

小程序-<web-view>嵌套H5页面支付功能

背景&#xff1a;小程序未发布前&#xff0c;公司使用vue框架搭建了管理系统&#xff0c;为了减少开发成本&#xff0c;微信提供了web-view来帮助已有系统能在小程序上发布&#xff0c;详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能&#xff0c;导致用…

AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术在设计行业的应用日益广泛&#xff0c;引发了广泛的讨论和关注。AIGC以其高效、多样化的生成能力&#xff0c;为设计行业带来了前所未有的变革。然而&#xff0c;关于AIGC是否能替代真正的设计…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

雅思词汇及发音积累 2024.7.3

银行 check &#xff08;美&#xff09;支票 cheque /tʃek/ &#xff08;英&#xff09;支票 ATM 自动取款机 cashier 收银员 teller /ˈtelə(r)/ &#xff08;银行&#xff09;出纳员 loan 贷款 draw/withdraw money 提款 pin number/passsword/code …

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

数据决策系统详解

文章目录 数据决策系统的核心组成部分&#xff1a;1. **数据收集与整合**&#xff1a;2. **数据处理与分析**&#xff1a;3. **数据可视化**&#xff1a;4. **决策支持**&#xff1a; 数据决策系统的功能&#xff1a;决策类型&#xff1a;数据决策系统对企业的重要性&#xff1…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统&#xff0c;内置终端Shell&#xff0c;这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇&#xff0c;由于应用众多&#xff0c;一锅炖不下&#xff0c;故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中&#xff0c;由于事件的不同&#xff0c;动作的不同&#xff0c;角色会处于不同的状态中。例如对战冒险游戏&#xff0c;面临Boss的攻击&#xff0c;角色会受到例如中毒&#xff0c;恐惧等Debuff效果&#xff0c;若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生&#xff0c;在之前的新版本NewJeans联动中&#xff0c;由于一些官方设定的错误&#xff0c;导致在开典藏箱的时候出现了一些问题&#xff0c;官方也推出了相应的补偿措施&#xff0c;比如退还G币&#xff0c;回收典藏箱子开出来的东…

Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线&#xff0c;每位玩家都能在这里开启全新的时空冒险之旅&#xff0c;主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本&#xff0c;以及日常任务为主&#xff0c;在以往的手游中&#xff0c;玩家进入某项玩法只需要从游戏界面调取菜单即可&#…