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
开启客户端连接服务: