Redis详解
Redis详解
- Redis
-
- 一、基本信息
-
- 基本特性
- 数据结构详解
- 特殊数据结构
- 应用场景
- 优缺点
- 二、基础命令
-
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- Sorted Set(有序集合)
- 三、Redis为什么这么快?
- 四、Redis的持久化机制
-
- RDB持久化
- AOF持久化
- 混合持久化(Redis 4.0及以上版本)
- 五、过期策略与内存淘汰策略
- 六、Redis事务机制
- 七、什么是缓存击穿、缓存穿透、缓存雪崩?
- 八、缓存与数据库一致性问题
-
- 产生原因
- 方案
- 九、集群
-
- 主从复制模式(Master-Slave)
- 哨兵模式(Sentinel)
- Cluster模式
Redis
一、基本信息
基本特性
- 高性能:Redis的读写性能非常优异,其读的速度能达到110000次/s,写的速度是81000次/s。这得益于其基于内存的操作和单线程的读写模块。
- 多种数据结构支持:Redis支持丰富的数据类型,包括字符串(String)、列表(List)、哈希(Hash)、集合(Set)和有序集合(Sorted Set,简称zset)等。这些数据类型都支持多种操作,且这些操作都是原子性的。
- 数据持久化:Redis支持数据持久化,可以将内存中的数据保存到磁盘中,以便在服务器重启后能够恢复数据。Redis提供了两种持久化方式:RDB(快照)和AOF(追加文件)。
- 主从复制与集群:Redis支持主从复制,可以实现读写分离和数据的备份。此外,Redis还支持集群模式,可以实现数据的分布式存储和负载均衡。
数据结构详解
- 字符串(String):字符串是Redis中最基本的数据类型,可以存储任何形式的数据,如整数、浮点数、字符串等。字符串类型支持多种操作,如获取、设置、增加、减少、拼接和位运算等。
- 列表(List):列表是一个有序的字符串列表,可以在列表的两端进行插入和删除操作。列表类型适合用于存储一些按照顺序排列的数据,如任务队列、消息队列等。
- 哈希(Hash):哈希是一个键值对集合,可以存储多个字段和值。哈希类型适合用于存储一些具有结构化的数据,如用户信息、文章信息等。
- 集合(Set):集合是一个无序的字符串集合,支持求交集、并集和差集等操作。集合类型适合用于存储一些不需要按照顺序排列的数据,如用户关注列表、用户点赞列表等。
- 有序集合(Sorted Set,zset):有序集合是一个有序的字符串集合,每个成员都有一个分数,支持分数排序和范围查找等操作。有序集合类型适合用于存储一些按照权重或者评分进行排序的数据,如排行榜、热门文章等。
特殊数据结构
- 地理空间(Geospatial):地理空间用于存储地理位置信息和执行地理位置相关的操作。允许在Redis中存储地理位置坐标,并提供了一组强大的命令来执行距离计算、位置查询等操作。通过有序集合(Sorted Set)来实现
- HyperLogLogs(超级日志日志):用于估计数据集合中的唯一元素数量,尤其是当元素数量非常大时。能够以固定的空间复杂度来实现近似计数,而不需要为每个唯一元素存储一个计数器。
- 位图(Bitmaps):用于存储位的集合,每个位代表一个状态或标记。在Redis中,位图被实现为字符串类型,但它们可以以位为单位进行操作。
应用场景
- 缓存:Redis可以缓存数据的计算结果、页面内容、数据库查询结果等,通过提高数据访问速度和响应速度,提升系统性能和用户体验。
- 消息队列:Redis支持列表数据类型,可以将消息存储在列表中,并且支持阻塞式操作,可以实现消息队列的等待和通知机制。
- 分布式锁:Redis可以作为一种分布式锁的存储层,通过缓存锁信息和锁状态,实现分布式锁和并发控制。
- 计数器:Redis支持原子操作,可以实现计数器的自增和自减,支持高并发的计数操作。
- 数据库:Redis还可以作为一种轻量级的数据库使用,支持持久化和数据备份,可以用于存储少量的数据和应用场景。
优缺点
优点:
- 读写性能优异。
- 支持多种数据结构。
- 支持数据持久化。
- 支持主从复制和集群模式。
缺点:
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写。
- 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败。
- 主机宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题。
- 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
二、基础命令
String(字符串)
-
基本命令:
- SET key value:设置键值对。
- GET key:获取key对应的值。
- APPEND key value:将value追加到key对应的值的末尾。
- STRLEN key:返回key对应的值的长度。
-
自增/自减命令:
- INCR key:将key对应的值自增1。
- DECR key:将key对应的值自减1。
- INCRBY key increment:将key对应的值增加increment。
- DECRBY key decrement:将key对应的值减少decrement。
-
其他命令:
- SETEX key seconds value:设置带有过期时间的键值对,单位为秒。
- GETSET key value:获取key对应的值,并将key设为新的值value。
- MSET key1 value1 key2 value2 …:设置多个键值对。
- MGET key1 key2 …:获取多个key对应的值。
- SETNX key value:当key不存在时,设置键值对。
- MSETNX key1 value1 key2 value2 …:当所有给定的key都不存在时,设置多个键值对。
- GETRANGE key start end:获取key对应的值的指定范围的子字符串。
- SETRANGE key offset value:将key对应的值在指定偏移量offset处开始替换为value。
- SETBIT key offset value:将key对应的值的指定偏移量offset处的位设置为value。
Hash(哈希)
-
基本命令:
- HSET key field value:将哈希表key中的域field的值设置为value。
- HGET key field:返回哈希表key中给定域field的值。
- HMSET key field1 value1 field2 value2 …:将哈希表key中的多个域field的值设置为多个value。
- HMGET key field1 field2 …:返回哈希表key中,一个或多个