redis总结
1.redis
redis高性能的key-value数据库,支持持久化,不仅仅支持简单的key-value,还提供了list,set,zset,hash等数据结构的存储,支持数据的备份(master-slave模式)
redis:性能极高,丰富的数据类型,原子操作,丰富的特性
2.redis数据类型
String-字符串,hash-哈希,list-列表,set-集合, zset-有序集合
3.好处
速度快,丰富的数据类型,支持事务(操作原子性),丰富的特性(用于缓存,消息,按key设置过期时间,过期后将自动删除)
4.memcached与redis区别
- 存储方式:memcached把数据全部存在内存之中,redis可以持久化
- memcached数据类型简单,redis丰富
- redis速度更快
- 底层模型不同,redis直接自己构建了vm机制。
5.redis是单进程单线程的,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
6.一个字符串类型的值能存储最大容量是 512M
7.redis持久化机制是什么,优缺点?
持久化机制:RDB和AOP
-
RDB持久化:原理是将Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化
-
AOF持久化:原理是将Redis的操作日志以追加的方式写入文件
rdb和aof
8.常见性能问题和解决方案
- master不要写内存快照,如果master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响非常大,会间断性暂停服务
- 如果数据比较重要,某个slave开启aop备份数据,策略设置为每秒同步
- 为了主从复制的速度和连接的稳定性,master和slave最好在同一个局域网
- 尽量避免在压力很大的主库上增加从
- 主从赋值不要用图装结构,用单向链表结构更为稳定,即master<-slave1<-slave2,这样方便解决单点故障问题,实现slave对master的替换,如果master挂了,可以立刻启用slave1做master,其他不变。
9.redis过期键的删除策略
- 定时删除:设置键的过期时间时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
- 惰性删除:放任键过期不管,但每次从键空间获取键时,检查取得的键是否过期,过期删除,不过期返回。
- 定期删除:隔一段时间,检查一次,删除过期键。
10.redis回收策略(淘汰策略)
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
- allkey-lru:从数据集中挑选最近最少使用的数据淘汰
- allkey-random:从数据集中任意选择数据淘汰
- no-enviction:禁止驱逐数据
使用策略规则
- 如果数据呈现幂律分布,即一部分数据访问频率高,一部分低,则使用allkeys-lru
- 如果数据呈现平等分布,即所有的数据访问频率都相同,则使用allkeys-random
11为什么redis需要把所有数据放到内存中?
为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
12.redis同步机制
redis可以使用主从同步,从从同步。
- 第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer。
- 待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。
- 加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
13.pipeline的好处
可以将多次io往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性,使用redis-benchmark进行压测的时候可以发现影响redis的qps峰值的一个重要因素是pipeline批次指令的数目。
14.redis集群的原理
- redis sentinal着眼于高可用,在master宕机时会自动将slave提升为master继续提供服务
- redis cluster着眼于扩展性,单个redis内存不足时,使用cluster进行分片存储。
15.redis集群方案什么情况下会导致整个集群不可用
有ABC三个节点的集群,在没有复制模型的情况下,如果节点b失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
Redis Sentinel 及 Redis Cluster
16.redis哈希槽的概念?
redis集群有16384个哈希槽,每个key通过crc16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。集群最大节点个数:16384个
17.redis集群的主从复制模型?
为了使在部分节点失败或大部分节点无法通信的情况下集群仍然可用,所有集群使用了主从复制模型,每个节点都会有N-1个复制品。复制方式:异步复制
18.redis事务
- 事务是一个单独的隔离操作,事务中的所有命令都会序列化,按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子的操作,事务中的命令要么全部被执行,要么全部都不执行。
- 事务相关的命令:MULTI、EXEC、DISCARD、WATCH
19.redis内存优化
尽可能使用散列表(散列表里面存储的数少,使用内存非常小),尽可能将数据模型抽象到一个散列表里面,eg:一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所欲信息存储到一张散列表里面。
20.redis回收进程如何工作?
客户端运行新的命令,添加新的数据,redis检查内存使用情况,如果大于maxmemory限制,则根据设定好的策略进行回收。
通过不断达到边界然后不断地回收回到边界以下,如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越。
21.降低redis内存使用情况
如果使用的是32位redis实例,可以利用hash,list等集合类型数据。
22.redis内存用完会发生什么
如果达到设置的上限,redis的写命令会返回错误信息(读命令正常返回),或者可以将redis当缓存来使用配置淘汰机制,当redis达到内存上限时会冲刷掉旧的内容。
23.mysql里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
使用redis提供的6中数据淘汰策略,redis内存数据集大小上升到一定大小时候,就会施行数据淘汰策略。
24.redis最适合的场景?
- 会话缓存
- 全页缓存
- 队列
- 排行榜/计数器
- 发布/订阅
25.假如redis里有1亿个key,其中10w个key是以某个固定的已知的前缀开头的,如果将他们全部找出来?
keys指令可以扫出指定模式的key列表。
但由于redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
可以用scan指令,可以无阻塞的提取出指定模式的key列表,但有一定的重复概率,在客户端做一次去重就可以了,但整体时间会比直接用keys长。
26.redis做异步队列?
一般使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,适当sleep一会再重试。
不用sleep?blpop在没有消息的时候,他会阻塞住直到消息到来。
生产一次消费多次?使用pub/sub主题订阅者模式,可以实现1:N的消息队列
pub/sub缺点:消费者下线的情况,生产的消息会丢失,使用专业的消息队列如rabbitMQ
redis实现延时队列:使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。
Redisson 的分布式延时队列 RedissonDelayedQueue 运行流程
//发送消息
String queueKey
RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueKey);
RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);
delayedQueue.offer(value, delay, timeUnit);//获取消息
RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueCode);
redissonClient.getDelayedQueue(blockingDeque);
return (T) blockingDeque.take();
redisson 源码里一共创建了三个队列:
- 消息延时队列:利用按照到期时间排序的特性,可以很快找到下一个要到期的消息,客户端内部自己定时到【消息目标队列】取
- 消息顺序队列:
- 消息目标队列:存放到期的消息,供消费端取
流程:
发送延迟消息,发送的延迟消息会先存在【消息延时队列】和【消息顺序队列】,如果【消息延时队列】原本是空的,会发布订阅信息提醒有新的消息。
获取延迟消息只需要从【消息目标队列】阻塞的取就行了,因为里面都是到期数据。
初始化延时队列:判断时间到了,把【消息延时队列】里的消息移动到【消息目标队列】里
定时从【消息延时队列】查询最新到期时间,定时去把【消息延时队列】里的消息移动到【消息目标队列】里。
如果【消息延时队列】是空的,就不会再定时查,而是等待发布订阅信息提醒,再定时把【消息延时队列】里的消息移动到【消息目标队列】里。
27.redis分布式锁
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放
setnx之后执行expire之前进程意外crash或者要重启维护了,会怎么样?
set指令的复杂参数,可以把setnx和expire合成一条指令用的。
28.解决key冲突
- 业务隔离
- key的设计:业务模块+系统名称+关键(id),针对用户可以加入(userid)
- 分布式锁:场景:多个客户端并发写key----客户端拿到锁,才能进行操作,避免多个客户端竞争该key
- 时间戳:key拼接时间戳,根据时间戳保证多个客户端的业务执行顺序
29 什么是缓存穿透
- 缓存穿透:一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。
- 解决:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该Bitmap过滤。
缓存雪崩
- 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,会给后端系统带来很大的压力,导致系统崩溃。
- 解决:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其它线程等待;做二级缓存;不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀;
30 保证缓存和数据库数据的一致性
-
淘汰缓存:数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,推荐选择淘汰缓存,而不是更新缓存。
-
选择先淘汰缓存,再更新数据库:假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。
-
延时双删策略:
如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。
- 请求A进行写操作,删除缓存
- 请求B查询发现缓存不存在
- 请求B去数据库查询得到旧值
- 请求B将旧值写入缓存
- 请求A将新值写入数据库
次数便出现了数据不一致问题。采用延时双删策略得以解决。
public void write(String key,Object data){
redisUtils.del(key);
db.update(data);
Thread.Sleep(100);
redisUtils.del(key);
}
这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。
数据库读写分离的场景
两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。
- 请求A进行写操作,删除缓存
- 请求A将数据写入数据库了,
- 请求B查询缓存发现,缓存没有值
- 请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值
- 请求B将旧值写入缓存
- 数据库完成主从同步,从库变为新值
依旧采用延时双删策略解决此问题。
相关文章:
redis总结
1.redis redis高性能的key-value数据库,支持持久化,不仅仅支持简单的key-value,还提供了list,set,zset,hash等数据结构的存储,支持数据的备份(master-slave模式) redis&…...
现代C++中的从头开始深度学习:激活函数
一、说明 让我们通过在C中实现激活函数来获得乐趣。人工神经网络是生物启发模型的一个例子。在人工神经网络中,称为神经元的处理单元被分组在计算层中,通常用于执行模式识别任务。 在这个模型中,我们通常更喜欢控制每一层的输出以服从一些约束…...
python怎么实现tcp和udp连接
目录 什么是tcp连接 什么是udp连接 python怎么实现tcp和udp连接 什么是tcp连接 TCP(Transmission Control Protocol)连接是一种网络连接,它提供了可靠的、面向连接的数据传输服务。 在TCP连接中,通信的两端(客户端和…...
java设计模式-观察者模式(jdk内置)
上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码&am…...
秒级体验本地调试远程 k8s 中的服务
点击上方蓝色字体,选择“设为星标” 回复”云原生“获取基础架构实践 背景 在这个以k8s为云os的时代,程序员在日常的开发过程中,肯定会遇到各种问题,比如:本地开发完,需要部署到远程k8s集群,本地…...
CV前沿方向:Visual Prompting 视觉提示工程下的范式
prompt在视觉领域,也越来越重要,在图像生成,作为一种可控条件,增进交互和可控性,在多模态理解方面,指令prompt也使得任务灵活通用。视觉提示工程,已然成为CV一个前沿方向! 下面来看看…...
Redis五大基础类型解析
1.String类型 特征:即存储字符串的类型,单个字符串存储量最大不超过512MB 常用业务场景:⽤来存储JSON序列化之后对象 底层编码: int编码 数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而…...
在CSDN学Golang云原生(服务网格istio)
一,在Kubernetes上部署istio 在Kubernetes上部署istio,可以按照以下步骤进行: 安装Istio 使用以下命令从Istio官网下载最新版本的Istio: curl -L https://istio.io/downloadIstio | ISTIO_VERSION<VERSION> sh - 其中&…...
Golang 获取本地 IP 地址方法
在 Golang 中,使用 net 包可以很方便地获取到本机IP地址。 借助 net.InterfaceAddrs 方法 简单示例代码如下: package mainimport ("fmt""net" )func main() {addrList, err : net.InterfaceAddrs()if err ! nil {panic(err)}for…...
抖音seo短视频账号矩阵系统技术开发简述
说明:本开发文档适用于抖音seo源码开发,抖音矩阵系统开发,短视频seo源码开发,短视频矩阵系统源码开发 一、 抖音seo短视频矩阵系统开发包括 抖音seo短视频账号矩阵系统的技术开发主要包括以下几个方面: 1.前端界面设…...
运维高级--shell脚本完成分库分表
为什么要进行分库分表 随着系统的运行,存储的数据量会越来越大,系统的访问的压力也会随之增大,如果一个库中的表数据超过了一定的数量,比如说MySQL中的表数据达到千万级别,就需要考虑进行分库分表; 其…...
Mysql 忘记密码怎么重置密码(详细步骤)
每种方法都有其适用的情况,根据具体情况选择合适的方法。无论选择哪种方法,请务必在重置密码后及时删除临时用户并重新启动 MySQL 服务。 一、使用 mysqladmin 重置密码 停止服务 # systemctl 启动的使用这个停止 $ sudo systemctl stop mysql# mac 本机…...
机器学习深度学习——图像分类数据集
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——softmax回归(下) 📚订阅专栏:机器学习&&深度学习…...
【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2
第一道栈迁移题目,跌跌撞撞理解了 前言 当前溢出可用空间比较少时(极端情况下仅能覆写ebp和ret),可以通过栈迁移的方式,扩大shellcode的容纳空间,其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋…...
网络编程(13): 网络通信常用命令(后续待补充)
ifconfig 一般用于查看网卡信息 ping 一般用于侦测本机到目标网络主机的网络是否通常: ping ip/域名 telnet 可以用于指定ip地址和端口的侦听服务是否存在:telnet ip port, 也可以模拟客户端给服务器发数据 netstat 用于查看网络连接状态 -a: 显示所有选项 -t&#…...
flask创建数据库连接池
flask创建数据库连接池 在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…...
C语言手撕顺序表
目录 一、概念 1、静态顺序表:使用定长数组存储元素。 2、动态顺序表:使用动态开辟的数组存储 二、接口实现 1、对顺序表的初始化 2、对数据的销毁 3、对数据的打印 4、检查是否需要扩容 5、尾插 6、头插 7、尾删 8、头删 9、在pos位置插入x …...
常见的排序算法
常见的排序算法 常见的排序算法包括: 冒泡排序(Bubble Sort):依次比较相邻的元素,将较大的元素交换到右侧,逐步将最大元素移动到末尾。插入排序(Insertion Sort):将数组…...
C#如何使用SQLite数据库?
文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库,它的库文件非常小巧,不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用ÿ…...
如何将表格中的状态数据转换为Tag标签显示
考虑到系统前端页面的美观程度,通常通过Tag标签来代替某条数据中的状态信息。仅通过一点操作,便能够使得页面美观程度得到较大提升,前后对比如下所示。代码基于Vue以及Element-ui组件实现。 修改前: 修改后: 修改前…...
centos中修改防火墙端口开放配置
1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 (1)添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT (2)添加需要开放的某个网段端口 4001:4020 …...
程序设计 算法基础
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
ubuntu开机自启动
ubuntu开机自启动 1、建一个test.sh脚本,并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件(sudo vim /etc/systemd/system/rc-local.service)…...
Git将其他分支合并至主分支
主要思想: 把分支代码合并到master,合给谁,就先切换到谁的分支 1. 当前分支是dev,开发完成后,需要合并到master分支 先把该提交的提交,需要push的push完成后,再切换分支。 否则也会告诉你要提交…...
Python+request+pytest 接口自动化测试框架入门(与unittest的比较)
1. Pythonrequestpytest 接口自动化测试框架入门 - 简书 pytest和unittest的比较: pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试&a…...
数据结构——复杂度
总有一天你要一个人,再暗夜中,向那座桥走过去 文章目录 一、算法的复杂度 考察形式范例 二、算法的时间复杂度 大O的渐进表示法 常见的复杂度对比 例题:消失的数字 题目的三种思路 1.排序遍历 2.减法 3.单身狗思想 三、空间复杂度…...
使用goldengate 迁移Oracle到postgresql
环境: --源端: IP:10.0.4.16 hostname:tencent Oracle数据库版本:12.2.0.1.0 ogg for oracle版本:19.1.0.0.4 SID:orcl --目标端: IP:10.0.4.16 hostname&#…...
ESP-C3入门20. CentOS开发环境及Jenkins流水线
一、准备环境 CentOS8已经正常安装Jenkins 二、升级 cmake cmake 升到 3.16以上。 cmake --version # 安装 g sudo yum install gcc-c export CXXg# 安装 CMake 的依赖项 sudo yum install -y openssl-devel# 下载 CMake 源码并进行编译安装 wget https://github.com/Kitwa…...
服务器被爬虫恶意攻击怎么办?
在有预算的情况可以采购第三方服务防火墙,没钱就使用开源的WAF进行防护。 # WAF防火墙的基本防护原理 WAF(Web 应用防火墙)可以使用多种技术来防止恶意爬虫攻击,例如: 1. 黑名单:WAF 可以使用黑名单技术来…...
公司网站备案是什么意思/营销策划方案模板
原始代码: void split(char * p,char * str){/*传入一个数组进行p和一个以什么进行分割的str,返回切片后的值*/ int i 0, j 0;char tmp[32][32] {0};char *p1 (char *)malloc(1024);while((p1 strchr(p, *str)) ! NULL) //10行{strncpy(tmp[i], p, …...
个人网站可以做充值/适合30岁短期培训班
大家都知道在Windows下怎么使用任务管理器来管理进程,真人接口源码出售【企鹅21717-93408】那么在linux下呢?今天简单介绍一下怎么在linux使用任务管理器管理进程,让我们的linux服务器运行的很流畅,可以使用的命令有:1…...
xiu主题做的网站/seo软件定制
一、产业链概述 砂石是砂子和石子的统称,因其良好的硬度和稳定的化学性质,常常作为优质的建筑材料、混凝土原料而广泛应用于房屋、道路、公路、铁路、工程等领域。砂石产业的上游包括原材料、相关机械设备、爆破材料等,中游是砂石的处理环节&…...
wordpress主题屋/进入百度app查看
E此浏览器不支持画布C G Am G F梨花香 缠着衣角掠过熙攘 复悄入红帘深帐C F G听枝头黄鹂逗趣儿 细风绕指淌C G Am G F坐船舫 兰桨拨开雾霭迷茫 不觉已一日过半C G C过眼的葱郁风光 悉数泛了黄Dm G Em褪尽温度的风 无言牵引中 便清晰了在此的眉目F Dm Em暮色的消融 隐约了晦朔葱…...
徐州网上阳光招生平台/seo推广多少钱
Windows作为最流行的个人计算机操作系统,成为了我们学习、工作和生活的一部分。我们几乎每天都会经历打开文件管理器,进入具体磁盘,打开具体文件,而Windows采用文件系统管理着所有的文件和磁盘空间,这个文件系统就是NT…...
潍坊个人网站制作/添加友情链接的技巧
引入 在使用全站仪时,每次的测量的坐标均可保存在储存中,便于后期内业导入Cass中成图。导出的.dat数据的格式如下(随手编造的数据) 其中每一行为一个点的数据,用英文逗号隔开,分别表示代号,(空值),X坐标,…...