Redis相关总结
一、缓存雪崩、缓存穿透
现象:缓存雪崩:大量缓存同时过期、缓存中间件宕机
缓存穿透:访问不存在key、缓存过期
解决:缓存雪崩:设置不同过期时间
缓存穿透:不存在key也存入缓存、使用布隆过滤器、使用分布式锁
二、Redis集群
主从复制:支持redis读写分离,不支持故障恢复
哨兵集群 :在主从复制模式下增加哨兵监控,当主节点故障,会选取一个新的主节点(无法扩容)
Cluster模式:分片模式,slot槽,可以扩容
三、RDB、AOF
RDB:快照模式
文件:dump.rdb
配置参数:save x y(x秒内有y个写入)
可以配置多个规则
//RDB模式默认是开启的 save 900 1
save 300 10
save 60 10000
触发:手动执行bgsave命令触发异步快照、执行save命令触发同步快照,根据redis.conf文件里的配置,自动触发bgsave,主从复制时触发
流程图:

AOF:日志模式
文件:appendfsync.aof
配置参数:
//AOF持久化,默认是关闭的。 打开 redis.conf, 找到如下配置 appendonly no # 改为 yes 就开启了 AOF appendfilename "appendonly.aof" # aof 文件名 # appendfsync always #每执行一个命令保存一次
appendfsync everysec # 默认,每一秒保存一次
# appendfsync no # 不主动执行保存,由操作系统决定
当执行指令时会将执行命令追加到缓冲区,再通过子线程把缓冲区数据写入到aof文件
由于aof文件会很大,aof文件到达一定大小会有一个重写机制
aof重写机制:对相同key的指令只保留最新的指令,然后将过滤后的指令写入到新的aof文件,然后删除旧的aof文件
在重写过程中,新的指令会存入到重写缓冲区中,重写完成后再将重写缓冲区内的指令写入到新的aof文件
流程图:

四:Redis存在线程安全问题吗?
redis是线程安全的,redis多线程模型只是针对IO网络。
执行多个指令无法保证原子性会出现线程安全问题,可以通过事务和lua脚本、锁实现
事务和lua脚本无法保证完全的原子性,因为不存在回滚机制
事务:MULTI 开启事务
指令1
指令2
EXEC 执行事务
#region Redis事务 StackChange.Redis
if (RedisTranBool)
{
var db = RedisHelper1.One.CacheRedis; if (db.KeyExists("Count") && (int)db.StringGet("Count") == 0)
{
db.KeyDelete("Count");
db.KeyDelete("Index");
db.KeyDelete("Record");
}
Console.WriteLine("删除成功");
if (!db.KeyExists("Count"))
{
db.StringSet("Count", 10000);
}
if (!db.KeyExists("Index"))
{
db.StringSet("Index", 0);
}
Console.WriteLine("初始化成功");
await Task.Run(async () =>
{
try
{
while (true)
{
var Count = (int)db.StringGet("Count");
var Index = (int)db.StringGet("Index");
var tran = db.CreateTransaction();
tran.AddCondition(Condition.StringEqual("Count", Count));
tran.AddCondition(Condition.StringEqual("Index", Index));
if (Count > 0)
{
tran.StringGetAsync("Count");
tran.StringDecrementAsync("Count", 1);
tran.StringIncrementAsync("Index", 1);
tran.SortedSetAddAsync("Record", JsonConvert.SerializeObject(new { index = Index, id = Guid.NewGuid(), time = DateTime.Now.ToString("YYYY-MM-DD HH:mm:ss") }), Index);
}
bool IsResult = await tran.ExecuteAsync();
if (IsResult)
{
Console.Clear();
var _count = db.StringGet("Count").ToString();
Console.WriteLine(_count);
var _index = db.StringGet("Index").ToString();
Console.WriteLine(_index);
var record = db.SortedSetScan("Record")?
.OrderBy(c => c.Score)
.Select(c => JsonConvert.DeserializeObject(c.Element))?
//.OrderBy(c =>c?.GetType().GetProperty("index"))
.ToList();
record?.ForEach((r) => { Console.WriteLine(r); });
} Thread.Sleep(5000);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
});
}
#endregion
原子性指令
1. SET key value:将字符串值 value 关联到 key。
SETEX key seconds value 设置键值对和过期时间
2. GET key:返回 key 所关联的字符串值。
3. INCR key:将 key 中存储的数字值增一。
4. DECR key:将 key 中储存的值减一。
5. APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
6. HSET key field value:将哈希表 key 中的字段 field 的值设为 value。
7. HGET key field:返回哈希表 key 中给定字段 field 的值。
8. SADD key member:将 member 元素加入到集合 key 当中。
9. SPOP key:移除并返回集合中的一个随机元素。
10.SETNX
五:内存淘汰机制
触发淘汰:当到达了设置的最大内存
1、Random,随机淘汰算法
2、TTL ,在设置了过期时间的key中找到最早过期的key进行移除
3、LRU,移除最近很少使用的key
4、LFU,访问频次和上次访问时间
六:key过期了为啥没有释放内存空间
redis并不是实时删除过期数据,而且通过定期删除和过惰性删除,
定期删除是一定时间间隔会随机选取一批数据来判断是否过期,如果过期则删除
惰性删除是当一个key被查询时,会去检测这个key是否过期,如果过期则删除
七:使用keys指令可能会有什么问题
1、keys指令需要遍历整个redis的键空间,如果redis的key非常庞大会非常耗时影响性能
2、阻塞问题:keys指令是一阻塞命令,在keys执行完成之前,其他客户端无法访问redis
八:redis中大key怎么处理
定义:key对应的value数据很大
九:redis实现分布式锁,及相关问题
首先redis实现分布式锁使用的是setNX指令,表示插入一个key,能插入成功就获得锁
问题一(死锁):集群环境下如果一个节点获得了锁,然后这个节点挂掉了,锁就无法释放会发生死锁,这时可以引入锁过期机制,
通过lua脚本保证setNX和设置key过期指令原子性
问题二(锁续期):引入过期机制以后,如果业务没有处理完,锁就过期了。这时可以增加一个线程(类似看门狗),如果当前获得锁的进程还存在,则自动增加过期时间(锁续期问题)
问题三(锁释放):在问题二的基础上,假如线程A执行业务没有完成,锁提前过期了,这时线程B拿到锁,执行业务逻辑。这时线程A业务逻辑完成,释放了锁。此时释放的是线程B拿到的锁。
要解决这个问题,可以在加锁时,每个线程将value值设置成guid,释放锁时先判断value是否为当前线程。
Redis相关总结的更多相关文章
- redis 相关知识
1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...
- redis相关配置
redis相关配置1.yum 源码 rpm yum 快速,间接,高效,解决依赖关系,(自动安装到某个路径,不可控),通过yum安装的软件查询命令 rpm -ql nginx yum源的软件包可能版本非 ...
- 【面试】我是如何在面试别人Redis相关知识时“软怼”他的
事出有因 Redis是一个分布式NoSQL数据库,因其数据都存储在内存中,所以访问速度极快,因此几乎所有公司都拿它做缓存使用,所以Redis常被称为分布式缓存. 一次我的一个同事让我帮他看Redis相 ...
- Redis相关知识整理
Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在 ...
- Redis相关命令及Jedis的demo(转)
org.springframework.data.redis.core.RedisTemplate在List操作时的一个注意事项:BoundListOperations boundListOperat ...
- Redis的安装和使用之------Redis相关运用
原文 http://wangzhijian.blog.51cto.com/6427016/1731962 一.简介 REmote DIctionary Server(Redis) 是一个由 Salv ...
- redis相关运维命令
1. 查询redis里面的大key? 在redis实例上执行bgsave,然后我们对dump出来的rdb文件进行分析,找到其中的大KEY 有个不太推荐的命令,debug object xxx 可以看到 ...
- redis相关问题
什么是Redis?Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...
- redis 相关知识点
(1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Value类型的 ...
- Redis 相关操作
1.安装 下载地址:http://www.redis.cn/ 在使用Redis时,开始就遇到了问题,客户端打不开,原因是需要先开启服务端,这需要先配置—— 1.下载好redis安装包,解压安装之后,复 ...
随机推荐
- ubuntu 18.0.4.6部署k8s 1.24
一.系统安装 https://ubuntu.com/download/server 二.安装containerd sudo su - apt-get remove docker \ docker-cl ...
- Oracle常用统计
测试, 这是测消息 1.按天 select to_char(t.STARTDATE+15/24, 'YYYY-MM-DD') as 天,sum(1) as 数量from HOLIDAY tgroup ...
- Spring MVC 中使用 RESTFul 编程风格
1. Spring MVC 中使用 RESTFul 编程风格 @ 目录 1. Spring MVC 中使用 RESTFul 编程风格 2. RESTFul 编程风格 2.1 RESTFul 是什么 2 ...
- 量子算法抛转(以及Oracle函数初步)
接下来要接触量子算法了,我们会看到怎么利用量子并行机制和干涉原理.干涉在算法对结果进行测量求值时举足轻重. Deutsch-Jozsa 算法 DJ算法是量子算法的入门算法,就像编程界的"He ...
- Eureka 客户端依赖管理模块
<dependencies> <!--Eureka客户端依赖--> <dependency> <groupId>org.springframework. ...
- 松灵机器人scout mini小车 自主导航(2)——仿真指南
松灵机器人Scout mini小车仿真指南 之前介绍了如何通过CAN TO USB串口实现用键盘控制小车移动.但是一直用小车测试缺乏安全性.而松灵官方贴心的为我们准备了gazebo仿真环境,提供了完整 ...
- vue项目的简单创建与插件下载
准备工作 安装node.js 安装node.js过程全部采用默认配置,一步一步next即可 检验node.js是否安装成功:在cmd命令行中输入node -v以及npm -v 通过cmd创建 安装vu ...
- 诺基亚8110 4G手机强制格式化方法
关机状态下,先按住上键,再按住开机键,出现开机动画时松开开机键,出现硬割界面下键选择第一个wipe用开机键确认yes,再次出现硬格界面,下键选择第二个wipe用开机键确认yes,再次出现硬格界面开机键 ...
- LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021
论文提出了用于快速图像分类推理的混合神经网络LeVIT,在不同的硬件平台上进行不同的效率衡量标准的测试.总体而言,LeViT在速度/准确性权衡方面明显优于现有的卷积神经网络和ViT,比如在80%的Im ...
- centos7 扩展硬盘
新增硬盘后 fdisk -l fdisk /dev/sdb (以后再加改成c) 阿里云叫vdb fdisk -l 注意,最好跟第一块硬盘一样! df -T 查看硬盘分区格式 注意,文件夹不能已存在的! ...