Full_stack_knowledge_system
大约 4 分钟
Redis入门指南
9 种数据类型
BitMap 二值状态统计的场景
Stream 消息队列
HyperLogLog 海量数据基数统计的场景
GEO 地理位置信息
HSET key field value
KEYS
LPUSH LPOP
RPUSH RPOP
LLEN KEY
SADD KEY member
SREM KEY member
ZADD KEY [score member]...
ZADD studend 89 tom 98 jack 76 rose
MULTI
...
EXEC
Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入
开发者必须在事务执行出错后自己收拾剩下的摊子(将数据库复原回事务执行前的状态等)
Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 (CAS)
EXPIRE
SORT
SORT key ALPHA [字典排序]
SORT key DESC
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w
单线程的 Redis QPS 可以达到 10W/每秒
脑裂:多个主节点的现象
(主节点没有问题但是哨兵发现主节点无法连通将从节点选举为主节点的时候)
被降格为从节点的旧主节点
由于第一次同步是全量同步的方式,此时的从节点(A)会清空掉自己本地的数据,然后再做全量同步
脑裂导致数据丢失,本质上是旧主节点降格为从节点之后,被清空数据再同步新主节点导致
脑裂解决方案
从节点下线时,禁止主节点写数据,直接返回error给客户端
min-slaves-to-write x:主节点必须要有至少 x 个从节点连接,如果小于,主节点禁止写数据
min-slaves-max-lag x,主从数据复制和同步的延迟不能超过 x 秒
避免原主库是假故障(哨兵认为故障,客户端认为非故障继续写数据,导致客户端写的数据丢失)
过期删除策略
过期字典
惰性删除: 访问key后发现已经过期就删除
定期删除:定时随机取出一定数量的key检查并删除其中过期的部分,如果比例超出25%则会再次执行检查
注意: 过期删除策略和内存淘汰策略不是同一个东西
从库不会进行过期扫描,从库对过期的处理是被动的
Redis 内存满了,会出发内存淘汰机制、
内存淘汰算法
LRU 全称是 Least Recently Used 翻译为最近最少使用,选择淘汰最近最少使用的数据
(随机采样的方式来淘汰数据,默认随机5个淘汰最久没有使用的那个)
LFU 全称是 Least Frequently Used 翻译为最近最不常用的,依据数据访问次数来淘汰数据
缓存设计
- 缓存雪崩 - 大量缓存同时过期(解决方案:将缓存失效时间随机打散、设置不过期)
- 缓存击穿 - 热点数据过期(业务请求加锁、不给热点数据设置过期时间而是后台主动更新缓存)
- 缓存穿透 - 数据库没有数据,缓存中也没法构建数据(非法请求限制、构建默认值)
一个很长的二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合中
它的优点是空间效率和查询时间都远远超过一般的算法
Redis的ZSet 加 zrangebysocre 实现延迟队列
Redis 的大 key 如何处理?
- 客户端超时阻塞
- 网络阻塞
- del大key会阻塞工作线程
- 内存分配不均(集群slot分配均匀的情况下)
String 类型的值大于 10 KB \ Hash、List、Set、ZSet 类型的元素的个数超过 5000个 通常叫做大Key
### 自带命令发现大key(集合只知道个数而不是实际内存量)
redis-cli --bigkeys
### 查看具体大小
MEMORY USAGE keyname1
### 字符串
STRLEN
### 列表List
LLEN
### hash哈希
HLEN
### Set类型
SCARD
### Sorted Set类型
ZCARD
### 第三方工具使用 RdbTools 工具查找大 key
redis-rdb-tools
Redis管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,提高交互性能
Redis是不支持事务回滚的,需要程序员手动回滚
Redis分布式锁 SETNX KEY_NAME VALUE
- 锁超时时间,守护进程自旋,无法限制业务执行时长
- redis集群模式下同步延迟(Redlock)