Redis总结(未整理)

   Redis是什么?

开源的基于内存的数据存储系统,用作数据库缓存、消息队列等。NoSQL

随用户访问量增大,MySQL的磁盘IO读写速度太慢了,所以用Redis把数据放在内存里,

优势

  • 性能极高
  • 数据类型丰富,单键值对最大支持512M大小的
  • 数据简单易用,支持所有主流编程语言
  • 支持数据持久化主从复制哨兵模式高可用特性

Redis 数据一致性的保证机制

Redis的数据一致性需要从两个角度来理解:
一是Redis节点内部数据的一致性,即持久化文件与内存数据的一致性;二是在集群环境下,不同节点间数据的一致性。
对于第一个角度,需要正确配置和使用RDB和AOF来保证;对于第二个角度,则涉及到主从复制和集群状态维护等复杂问题。

确保Redis和MySQL之间的数据一致性

代码中同时对MySQL和Redis进行更新,通常先更新MySQL,然后更新Redis。

异步更新先更新MySQL,然后发送消息到队列,由消费者处理并更新Redis。

定时任务同步,会有延迟。

使用MySQL的binlog,更新Redis

发布订阅功能无法持久化,无法记录历史消息,消息队列解决

Redis持久化

Redis支持10种数据类型

基本

字符串 string
列表 List
集合 Set
有序集合 Sortedset

哈希 Hash

高级

消息队列 Stream

地理空间 Geospatial
HyperLogLog

位图 Bitmap:签到, 记录用户在线状态,点赞
位域 Bitfield:用于游戏等级等?
 

事务

MULTI事务开始,EXEC事务执行,将所有命令缓存进一个队列,有一条失败其他也会继续执行,其他客户端的请求也不会插入

redis是内存数据库,它的数据都存储在内存中,重启断电宕机->数据丢失,如果不把数据保存到磁盘里,那么服务器进程一旦退出,服务器的数据就丢失了。所以需要持久化

通过两种方式:

RDB(Persistence DB):RDB类似快照,将某一时刻的快照写入磁盘。RDB持久化后,文件将被保存至同文件夹下的dump.rdb文件中,且以压缩的二进制文件表示,服务器重启都会加载该文件以加载数据。(1)假设server在最后一次快照后宕机,最后一次快照后修改的内容会丢失,所以AOF(2)一般在凌晨,内存写入硬盘时,redis阻塞,可以用BGsave在后台运行,但是fork进程还是会阻塞,所以AOF

两种实现:手动写入(不常用),改配置文件(常用)。


AOF(Append Only File):AOF可以支持实时的数据持久化。AOF持久化功能通过保存redis服务器所执行的写命令来记录数据库状态,默认存储在appendonly.aof中,AOF文件中存储的都是redis相关命令。重启执行AOF,重建,

主从复制->数据一致性

主节点的change自动更新到从节点上

数据只能单向从主节点流到从节点

主节点处理写请求,从节点可以处理读请求,分散读负载

当主节点出现故障时或者死机,手动或自动(使用Redis Sentinel)将从节点提升为新的主节点(自动故障处理:哨兵)

哨兵:监控、通知、自动故障转移,

实际生产中,通常选3个哨兵,再选举一个领导,保证高可用性

redis是线程安全的吗?
安全。使用单线程模型,多个客户端的请求被串行化处理,这是因为 Redis 将所有的数据的操作都存储在内存中,并且使用了 多路复用的方式,将多个操作合并成一个操作进行处理,减少了 IO 的次数,进而提高了内存和 CPU 的利用率,

Redis 的命令是原子的,而且在执行期间,不能被其他客户"端插入,从而保证命令的 原子性只 和线程安全性。

zset(有序集合)的两种实现方式
  • ziplist(压缩列表):满足以下两个条件的时候
    • 元素量少于128的时候
    • 每个元素的长度小于64字节
  • skiplist(跳表):不满足上述两个条件就会使用跳表,具体来说是组合了map和skiplist
    • map用来存储member到score的映射,这样就可以在O(1)时间内找到member对应的分数
    • skiplist按从小到大的顺序存储分数,链表形式
    • skiplist每个元素的值都是[score,value]对

基本操作

启动服务:redis-server

开启客户端连接服务: