高并发解决方案——Redis(一)

article/2025/9/20 9:46:23

简介

Redis作为重要的缓存数据库在高并发的解决方案中起着重要作用。为了系统的学习Redis,也为了秋招(美团比较关注Redis 的掌握),计划编写该系列博客,也是为了整理知识点。
本篇主要介绍了Redis的基础知识与原理。之后将更新Redis的分布式相关知识和实际使用会用到的操作。希望读完这三篇文章可以完全掌握Redis的使用!

NoSQL

Not Only SQL的简称。NoSQL是解决传统的RDBMS在应对某些问题时比较乏力而提出的。具体的表现如下:

  1. RDBMS依赖的表结构扩展性差,当表很多时,修改表结构的成本会很高;
  2. IO较慢:虽然引入了索引,但是还是会存在索引失效的问题;
  3. 海量数据处理乏力:由于1和2,导致了3。

关系型数据库和NoSQL数据库的关系从来都不是谁取代谁,而是在一个复杂的高并发系统中相互增益,共同为系统提供可用性。

主流分支

  1. KV数据库
  • Redis:KV主存数据库,所有的操作在主存中。并 定期异步地将数据进行持久化。但是数据库提供 性能会受主存大小的影响,主存成本高。
  1. 列族数据库 HBASE就是列族数据库,虽然没有改变传统的数据库结构,但是其对数据分析的支持会更好。
  • Cassandra:是Facebook的分布式数据库。其优点是 1)该数据库的设计模式非常灵活,不需要先 设计数据库模式,添加或删除字段非常方便;2)支持范围查询,即可以对键进行范围查询;3)高可扩展 性:单点故障不影响整个集群,支持线性扩展。
  • Hypertable:也是一个开源的分布式数据库,其使用的是bigtable。面向的是大规模的分布式集 群,比如HDFS和KFS。
  1. 文档数据库
    文档数据库并不关心高性能的读写并发,而是保证大数据的存储和良好的查询性能。
  • MongoDB:介于关系型数据库和 非关系型数据库之间,支持许多数据格式和高速访存。
  • CouchDB:支持JSON和AtomPub。为了确保数据一致性,CouchDB符合ACID属性。

Redis简介

Remote Dictionary Server的简称。特点是在主存中存储数据。主存的特点是:IO快,易失性,成本高
这个特点使得:

  • Redis不适合存储大文件;
  • 不适合存储需要持久化的文件;
  • 适合存储热点数据(要求快速IO);
  • 适合存储具有一定生命周期的数据(当生命周期结束就被销毁或者持久化到磁盘上)。

在Redis中, 数据的存储有两种格式:RDB和AOF。RDB记录的是真实的数据,AOF记录的对数据的操作,且在Redis中会对操作进行重写(对可以合并和简化的操作进行重写)。AOF的效率更好,但是RDB采用压缩存储,存储效率高。

Redis数据类型

Redis是KV数据库,所有的Key都是字符串且唯一,数据类型指的是value的类型。

redisjava
stringString
hashHashMap
listLinkedList
setHashSet
sorted_setTreeSet

Redis有16个数据库可以使用。默认使用的是0号数据库。使用select index的方式切换数据库。

key的命名规则

在这里插入图片描述

key的操作

1. 基本操作操作

在分布式的场景下,保证多个节点存储的key不冲突是一个很关键的点。

#删除
del key
# 获取
get key
# 模糊查询 ?表示一个占位符 *表示任意长度任意字符 []指定若干字符
keys pattern
#类型
type key
# 自增操作
incr key increment
incrbyfloat key increment

由于key是一个字符串,所以在进行操作时会转化成数值来进行计算由于Redis是单线程的,命令的执行是先后顺序的,所以不用担心并发引发的数据一致性问题。

2. 设置生命周期

由于redis是采用主存存储,因此通常存储的是具有一定生命周期的数据。

# 设置生命周期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp# 获取生命周期
ttl key
pttl key #时间戳# 持久化
persist key

String类型

String类型是一种一对一的映射关系。

keyvalue
name咸鱼突刺
age18

操作:

# 添加数据
set key value# 获取
get key# 删除
del key# 添加多个
mset key1 value1 key2 value2...# 获取多个
mget key1 key2 ...# 获取字符串长度
strlen key1# 在字符串后追加字符串
append key value

Hash类型

如果我们需要一个key对应多个value时就需要使用hash结构。相当于在string的基础上嵌套了多个结构。Hash的value 中只能存储字符串,且每个键值对的存储上限是 2^32 -1。
在这里插入图片描述

如果filed数据较少,底层的存储结构采用数组的方式,如果较多采用HashMap的形式。

# 新增数据
hset key field value
hmset key field1 value1 field2 value2...
hsetnx key field value# 获取数据
hget key field
hgetall key
hkeys key
hvals key# 删除数据
hedel key field1 field2....# 获取字段的数量
hlen key# 判断是否存在
hexists key field

list类型

list是序列结构,即各个元素之间有位置上的关系。redis中的list实现是 双向链表逻辑结构为队列。根据队列的特点,不难猜出对list的操作应该包括在双端的操作。key相当于是一个指针
在这里插入图片描述

# 添加数据
lpush key value1 value2
rpush key value1 value2# 获取数据
lrange key start stop# 获取指定位置的value
lindex key index# 获取长度
llen key# 获取并移除
lpop key
lpop key# 规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout# 移除指定数据
lrem key count value

set类型

set的定位和数学中的集合一致。set的查询效率高,且可以存大量的 数据。其存储结构和Hash结构完全 一致,但是其value的值为空。在这里插入图片描述

常用来解决:

  • 数据的快速过滤和查找;
  • 存储用户的权限等对顺序没有要求的内容。
# 添加数据
sadd key member1 [member2]# 获取全部数据
smembers key# 删除数据
srem key member1 [member2]# 获取数据量
scard key
# 是否包含某个member
sismember key member# 随机获取指定数量的数据
srandmember key [count]# 随机获取一个数据并移除
spop key# 集合运算
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]# 集合运算并保存结果
sinterstore destSet key1 [key2]
sunionstore destSet key1 [key2]
sdiffstore destSet key1 [key2]# 将指定数据从原始集合移动到目标集合
smove source dest member

zset类型

是一种有序的数据结构。score就是判断的规则。sorted_set在set的基础上加入了一个score字段,按照这个字段排序。
在这里插入图片描述

# 添加数据
zadd key score1 member1 [score2 member2]# 获取全部数据
zrange key start end [withscore]
zrevrange key start end [withscore]# 删除数据
zrem key member# 按条件查找数据 limit指定是个数
zrangebyscore key min max [withscore] [limit]
zrevrangebyscore key max min [withscore] [limit]# 获取数据对应的索引
zrank key member
zrevrank key member# 获取score值
zscore key member
zincrby key increment memeber# 按照条件删除数据
zremrangebyrank key start end
zremreangebyscore key min max# 获取集合总量
zcard key
zcount key min max# 集合操作:交集会将key相同的score相加
zinterstore destSet numkeys key1 [key2]
zunionstore destSet numkeys key1 [key2]

Redis的持久化

持久化就将数据存储在本地磁盘,为了数据的恢复。通常的方式有:AOF和RDB。
在这里插入图片描述


RDB详解

开启RDB的指令有两种:

  • save指令 ,一旦执行,CPU会立刻去对数据进行持久化 ,但是由于Redis是单线程的,当数据量很大,会导致长时间的阻塞
  • bgsave指令,一旦执行Redis会在CPU空闲时执行持久化 操作。
    在这里插入图片描述

RDB配置

AOF(Append Only File)

记录的是对数据的操作。读操作不用记录,修改操作记录。 AOF之所以效率高,是因为其采用指令重新写机制,将可以合并且简化得到指令重写,大大减少了文件体积。比如用户的单个插入会被整合成mset的形式。

AOF三种写策略:

  • always:每次发生变化就写一次,效率低

  • everysec:每秒将缓冲区的指令同步到缓冲区,准确率高,性能好。

  • no:系统控制,不建议使用。

AOF功能开启

# 开启AOF
appendonly yes|no# AOF写数据策略
appendfsync always|everysec|no# 日志文件名
appendfilename filename
# 地址
dir path

AOF重写

AOF重写是为了压缩AOF文件的大小。通过指令重拍和组合来减少不必要的操作。

  • 手动重写
    bgrewriteaof
    
  • 自动重写
    auto-aof-rewrite-min-size size
    auto-aof-rewrite-min-percentage percentage
    

#

AOF与RDB的比较

持久化方式RDBAOF
占用空间小(数据压缩)大(指令重写)
存储速度
恢复速度
资源消耗
启动优先级

Redis事务

# 开始事务,之后的所有指令都是属于该事务的
multi# 取消事务
discard#执行事务
exec

在这里插入图片描述

Redis锁

为了在事务过程中保持数据的操作不出错,redis中引入了锁的概念。这个锁就是设置一个string,对某个字段column设 锁就是setnx lock-column value,这个value设置的就是我们操作的数值,每个业务进入之后就对这个value进行修改。
同时还需要配合expire防止程序卡死导致锁无法释放。
注意:Redis中setnx操作是原子性操作。

# 监听key
watch key1 key2..
# 取消监听
unwatch

Redis删除策略

Redis所占内存成本太高,要求定期移过期数据,以缓解内存的压力。有以下几种删除策略。

  • 定时删除:设置一个定时器,对过期的数据定期清洗。虽然可以保证内存中没有过期的数据 ,但是会对CPU造成巨大压力。

  • 惰性删除:当我们使用一个数据的时候再去判断是否过期。这样虽然减少了CPU的压力但是会造成数据的堆积,加重了内存的压力。

  • 定期删除:让CPU定期删除是一个折中策略。通过配置信息指定定期删除的条件(是一种随机抽检的方式)。 使用较多。

Redis的逐出策略

redis在存储数据时,会先调用freeMemoryNeeded()函数检测内存是否充足。当内存已满,且无法清出足够的空间存放新的 数据就会使用数据逐出,其实这和OS中的页面交换算法思想一致选择用处最小的数据放出

相关配置

# 最大可用内存
maxmemory# 每次选择待删除的据个数
maxmemory-samples# 删除策略
maxmemory-policy策略有:1. lru:最近最少使用的数据淘汰2. lfu:使用次数最少的数据淘汰3. ttl:快过期的数据淘汰4. random:随机挑选数据淘汰检测范围:5. 检测易失性数据:volatile-xxx eg:volatile-lru6. 检测全库数据:allkeys-xxx7. 放弃使用数据驱逐:no-envitction

http://chatgpt.dhexx.cn/article/hPQPbmjO.shtml

相关文章

Jmeter超高并发解决方案

背景一亿用户量,平均每人每天10次的业务量,要求并发数在5000以上,峰值在5w到10w之间,QPS在25w以上 一、jmeter解决高并发的优化方案 1.1 优化监听(GUI模式,尽量不考虑) …

2023春招面试专题:高并发解决方案

如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验。 我们常见的高并发场景有:淘宝的双11、春运时的抢票、微…

高并发解决方案之熔断处理

高并发解决方案之熔断处理 前言概念基本介绍三种状态熔断方式常用框架功能对比使用介绍 参考链接 前言 问题列表 跨系统、跨服务调用第三方接口时,第三方接口响应超时或者服务不可用,发生连锁故障进而导致雪崩效应。 举例说明 假设上游服务是A&#xff…

阿里云高并发解决方案

今天这篇帖子我会讲解一下金蝶财务软件K3_CLOUD高并发部署在阿里云上得解决方案,本篇博客同样适用于其他软件高并发上云部署 以我去年12月份的一个客户项目为例。 做过项目的朋友都知道,小客户比较关注的是成本,大客户关注的是价值和服务。高并发客户一般都会有专业的IT运…

高并发解决方案相关面试题

什么是DNS解析域名 DNS域名解析就是讲域名转化为不需要显示端口(二级域名的端口一般为80)的IP地址,域名解析的一般先去本地环境的host文件读取配置,解析成对应的IP地址,根据IP地址访问对应的服务器。若host文件未配置…

Token高并发解决方案

Token高并发解决方案 一:作为token使用的第三方 客户端模式使用token 可以采用单例模式或定义一个全局变量isRefresh 标志,加同步锁Synchronized来保证token过期的那个时间点,刷新token方法只被调用一次。 二:作为token服务器端…

大数据和高并发解决方案

一、网站应用背景 开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器一台数据库服务器一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访问性能&…

电商中常见的高并发解决方案

目录 多级缓存 什么叫多级缓存 多级缓存的实现思路 Redis 缓存同步 MySql 数据 Nginx 限流 什么是限流 常见的限流算法之漏桶算法 nginx 限流的方式 控制速率 控制并发量(连接数) 在本文中,我们将以京东为例,了解电商中…

【数据科学】斯皮尔曼的等级相关系数(Spearman's coefficient)

在统计数据中,斯皮尔曼的等级相关系数或斯皮尔曼的rho,以查尔斯斯皮尔曼命名并经常用希腊字母表示或,是秩相关的非参数度量(两个变量的排名之间的统计依赖性)。它评估了使用单调函数描述两个变量之间关系的程度。 两个…

python 利用Scipy计算person 和spearman相关系数

python 利用Scipy计算person 和spearman相关系数 觉得有用的话,欢迎一起讨论相互学习~ 学习以下两位大佬的讲解 (Pearson)皮尔逊相关系数和spearman相关系数(附python实现) 相关性系数及其python实现 皮尔逊相关系数 下面是皮尔逊相关系数的计算公式…

Python+pandas计算数据相关系数(person、Kendall、spearman)

pandas中DataFrame对象corr()方法的用法,该方法用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数、Kendall Tau相关系数和spearman秩相关)。 pandas相关系数-DataFrame.corr()参数详解 DataFrame.corr(methodpearson, min_p…

相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)

相关性Correlations Correlations,相关度量,目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。相关系数是用以反映变量之间相关关系密切程度的统计指标。…

spearman学习

特征提取,预测都弄完了,现在要检查一下预测的效果。 spearman秩相关系数是度量两个变量之间的统计相关性的指标,用来评估当用单调函数来描述两个变量之间的关系有多好。在没有重复数据的情况下,如果一个变量是另外一个变量的严格…

R语言中进行Spearman等级相关分析

摘要 使用Spearman等级相关性测试两个等级变量或一个等级变量和一个测量变量之间的关联。 如果您担心非正态性,也可以对两个测量变量使用Spearman等级相关性而不是线性回归/相关性,但这通常不是必须的。 宏伟的军舰鸟(军舰鸟magnificens&…

相关系数pearson、spearman、kendall和R语言中的cor/or.test()

相关系数pearson、spearman、kendall和R语言中的cor/cor.test 1. 相关系数pearson、spearman、kendall2. R语言cor函数和cor.test函数 1. 相关系数pearson、spearman、kendall Pearson相关系数很简单,是用来衡量两个数据集的线性相关程度;而Spearman相关…

皮尔逊(Pearson)相关系数与spearman相关系数(Python实现)

概念介绍 相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度。 相关系数大小解释 相关性绝对值无相关0 - 0.09弱相关0.1 - 0.3中相关0.3 - 0.5强相关0.5 - 1 表中所定的标准从某种意义上说是武断的和不严格的。 对相关系数的解…

3.1 相关系数(person与spearman)

1.1总体皮尔逊(person)相关系数: 在概率论与数理统计中我们学到,若两组数据X{x1,x2…xn}与Y{y1,y2…yn}为总体数据,则总体协方差为 它表示两个变量的总体误差,若XY相对于各自均值同…

斯皮尔曼相关(spearman)系数法

在分析指标与指标、指标与研究对象的影响程度时,很多时候会用到相关系数法,下面介绍一下斯皮尔曼相关系数法。 斯皮尔曼等级相关是根据等级资料研究两个变量间相关关系的方法。它是依据两列成对等级的各对等级数之差来进行计算的,斯皮尔曼等级…

Spearman 相关性分析法,以及python的完整代码应用

Spearman 相关性分析法 简介 Spearman 相关性分析法是一种针对两个变量之间非线性关系的相关性计算方法,同时,它不对数据的分布进行假设。该方法的基本思想是将两个(也可以多个)变量的值进行排序,并计算它们之间的等…

统计学三大相关系数之斯皮尔曼(spearman)相关系数

斯皮尔曼相关性系数,通常也叫斯皮尔曼秩相关系数。“秩”,可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解,这种表征形式就没有了求皮尔森相关性系数时那些限制。下面来看一下它的计算公式:…