password
tags
type
status
date
slug
summary
category
icon
Redis是什么?
是一个缓存中间件,内存型键值对数据库,说人话就是和你手机上的抖音、支付宝一样,一个软件/应用而已,只不过是在命令行操作而已。
下载
先安装Docker进行下载Redis,也可以通过其他方式安装软件
进入到redis客户端命令行,代表成功。
简单使用
数据类型
- string 字符串,一个key对应一个value
- set 无序列表,一个key对应一个去重的结构
- list 列表,一个key对应一个列表,没有排序功能
- zset 有序列表,一个key对应一组列表,根据score进行排序
- hash 哈希,一个key对应一组map
- bitmap 位操作
- geo 地理位置
- hyperloglog 基数统计
可靠性设计
持久化机制
- RDB:save配置默认规则
- AOF:appendonly是否开启追加日志,appendfsync设置同步方式(always、everysec、no)
内存淘汰策略
当达到Redis Max Memory值的时候 会对key进行清理淘汰算法:LRU、Random、LFU、
集群
- 主从复制:读写分离
- 哨兵模式
场景设计
Redis实现锁
锁:有一些临界资源需要竞争,锁让并行变为串行,保证同一时刻只有一个线程拿到锁,执行后续的逻辑
在Java中实现线程同步可以用synchronized(基于对象头)关键字或者reentranlock(基于AQS)锁,保证在单体应用中实现互斥的效果,换句话说就是在只能在一个JVM实例中只能有一个线程拿到这把锁,但是随着业务的发展减少单节点服务器压力开始做集群多个服务节点,在分布式场景下(多个JVM实例,多个进程多线程)下这些单机锁就会失效,我们可以使用第三方服务获取锁,Redis分布式锁,但Redis集群获取锁可能会有新的问题
Redis本身是单线程指令执行,所以可以作锁。
缓存穿透
定义:缓存穿透就是查询一个不存在的数据,当用户太多缓存没有命中缓存,频繁查库,导致数据库连接堆积,甚至导致数据库宕机。
那么在真实的环境有哪些接口会先查缓存,再走数据库呢?
如何解决缓存穿透?
- 缓存预加载,需要考虑内存占用量、缓存和数据库数据同步,一般采用最终一致性方案,例如定时同步缓存,定时多久需要根据业务决定。
- 数据库查询一次为null填充值,并设置过期时间,最终一致性
缓存击穿
热点数据快要过期,查库
缓存雪崩
大量key在同时失效,导致请求都打到数据库,可能导致查询异常/RT长
如何解决缓存雪崩?
- 设置不同的过期时间、让缓存失效的时间尽可能均匀分布
- 定时更新/移除缓存
- Author:武帅祺
- URL:https://qqqi.top//article/43ff139e-c286-411f-9e99-d33f36f8d36e
- Copyright:本文章为原创内容,版权归作者所有。如需转载,请联系我,谢谢!