中间件redis之基础知识

一 redis有哪些数据结构?

(1)string

redis string内部实现是通过SDS(Simple Dynamic String 简单动态字符串)来存储的,不同长度的字符串使用不同的结构体表示。

应用场景:①缓存数据库数据,降低数据库压力②计数器③用户session管理

(2)hash

类似于一种map结构

(3)list

有序列表

应用场景:①消息队列:数据生产者通过Lpush从左插入数据,多个数据消费者可以使用BRpop命令阻塞的消费列表尾部数据。②分页查询

(4)set

无序集合,自动去重

(5)sorted set

是排序的set,去重可排序,排序规则根据score大小

应用场景:①排行榜②带权重的队列

(6)bitmap

位图是按bit来存储信息,可以用来实现布隆过滤器

(7)HyperLogLog

供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计 UV

(8)geospatial

可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。有没有想过用Redis来实现附近的人?或者计算最优地图路径?

二 缓存淘汰策略

因为内存限制,当存储数据超过缓存容量时需要对缓存进行剔除。一般提出策略有三种:

FIFO(淘汰最早数据),LRU(淘汰最近最少使用),LFU(淘汰最近使用频率最低)

  • noeviction:内存不足,返回错误
  • allkeys-lru:尝试回收最近最少使用的key(全部的key)
  • volatile-lru:尝试回收最近最少使用的key(仅限于过期集合的key)
  • allkeys-random:尝试回收随机的key(全部的key)
  • volatile-random:尝试回收随机的key(仅限于过期集合的key)
  • volatile-ttl:回收过期集合的key,并有限回收存活时间较短的key

三 Memcache和redis比较

 Memcacheredis
线程模型多线程异步IO,性能好单线程,因为①非阻塞异步事件处理机制②避免线程上下文切换的代价
持久化不支持持久化支持持久化
数据结构仅支持K-V结构string,list,set,hash,sorted set
主从同步不支持主从同步支持主从同步以及集群部署能力,提供高可用服务

 

 

 

 

 

 

 

 

四 持久化

redis提供RDB和AOF两种持久化方式:

(1)RDB

持久化过程:redis通过fork一个子进程,子进程创建后,主进程与子进程会共享内存中的代码块和数据段,redis将快照持久化交由子进程处理,主进程继续处理客户端请求,然后对内存数据结构进行不间断修改。

COW(copy on write):主进程fork子进程,内核把内存页权限设置为只读,主进程和子进程都只读内存,当主进程要修改内存数据时,会触发页面异常中断,内核会把页面复制一份,因此主进程和子进程各持有一份内存页面,主进程修改自己持有的那份内存页面。

优点:对redis性能影响小,同步数据时由子进程处理,数据恢复时比AOF快,适合做冷备。

缺点:RDB都是快照文件,默认五分钟生成一次,意味着最多会丢掉五分钟的数据,而AOF最多丢一秒数据。RDB在进行数据快照时,如果文件太大,会使客户端卡顿。

(2)AOF

持久化过程:对每条写操作的命令作为日志,以append-only的模式追加写入一个日志文件,如果重启redis,则会根据AOF日志文件顺序执行所有指令来恢复数据。

优点:AOF通过后台线程做同步日志文件的操作,最多丢一秒数据。追加方式记录日志,减少了磁盘寻址的开销。

缺点:AOF文件比RDB文件大,重启redis时,数据恢复慢。

五 高可用(集群模式)

redis支持主从同步,提供cluster集群部署模式,通过sentinel哨兵来监控redis主服务器状态,当主节点挂了,从节点根据一定策略选举新的主节点,并调整其他从节点到新的主节点。

选主的策略简单来说有三个:

  • slave 的 priority 设置的越低,优先级越高;

  • 同等情况下,slave 复制的数据越多优先级越高;

  • 相同的条件下 runid 越小越容易被选中。

在 Redis 集群中,sentinel 也会进行多实例部署,sentinel 之间通过 Raft 协议来保证自身的高可用。Redis Cluster 使用分片机制,在内部分为 16384 个 slot 插槽,分布在所有 master 节点上,每个 master 节点负责一部分 slot。数据操作时按 key 做 CRC16 来计算在哪个 slot,由哪个 master 进行处理。数据的冗余是通过 slave 节点来保障。

六 哨兵模式

哨兵组件的主要功能:

  • 集群监控:负责监控 Redis master 和 slave 进程是否正常工作。

  • 消息通知:如果某个 Redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。

  • 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。

  • 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。

七 主从模式

如果从节点第一次连接到master则会触发全量复制,master会启动一个线程,生成rdb快照,还会把新的写请求都缓存到内存中,master会把rdb快照发送给从节点,从节点拿到快照先保存到本地磁盘,然后加载到内存,然后master再把刚缓存的新写操作发给从节点。之后master会通过日志增量AOF文件,同步给从服务器。

八 缓存常见问题

(1)缓存更新

异步更新:设置key失效时间,失效时不清除数据,继续使用旧数据,由异步线程更新缓存。

定时更新:定时对数据进行分批次更新。

(2)数据不一致

数据库数据更新,也需要更新缓存。要么通过异步任务来更新缓存,要么删除缓存(被动更新)。

(3)缓存雪崩

造成原因:redis宕机或者某一时间点key失效,同时又有大量请求,则大量请求会打在DB上。

解决办法:使用快速失败的熔断策略,或者使用主从和集群模式来尽量保证缓存服务高可用。

(4)缓存穿透

造成原因:恶意用户使用id=-1来查询数据,导致缓存不命中,穿透DB查询依然不命中。

解决办法:①检查用户传参②使用 BloomFilter 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在。非常适合解决这类的问题。

(5)缓存击穿

造成原因:热点key失效时,大量针对这个数据的请求会穿透到数据源

解决办法:①加互斥锁,保证针对同一个数据的请求不会并发请求到DB②设置热点数据永不过期。

九 高级用法

(1)pub/sub

使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列,在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。

(2)lua脚本

利用它的原子性

(3)事务

redis提供的不是严格的事务,redis只保证串行执行命令,并且能保证全部执行,但是执行命令失败,并不会回滚,而是继续执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值