这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
1.Redis简介
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。
简单来说 Redis 就是⼀个使⽤C语⾔开发的数据库,不过与传统数据库不同的是Redis的数据是存在内存中的,也就是它是内存数据库,所以读写速度⾮常快,因此 Redis 被⼴泛应⽤于缓存⽅向。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。
另外,Redis 除了做缓存之外,Redis 也经常⽤来做分布式锁,甚⾄是消息队列。 Redis 提供了多种数据类型来⽀持不同的业务场景。Redis 还⽀持事务 、持久化、Lua 脚本、多种集群⽅案。
2.Redis数据类型
2.1 String类型
string 数据结构是简单的 key-value 类型。
2.1.1 应用场景
⼀般常⽤在需要计数的场景,⽐如⽤户的访问次数、热点⽂章的点赞转发数量等等
2.1.2 常用命令
SET key valueGET keyGETRANGE key start end返回 key 中字符串值的子字符MGET key1 [key2..]获取所有(一个或多个)给定 key 的值。SETBIT key offset value对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
2.2. Hash命令
hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表)。不过,Redis 的 hash 做了更多优化。另外,hash 是⼀个 string 类型的 field 和 value 的映射表,特别适合⽤于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。
2.2.1 应用场景
系统中对象数据的存储。
2.2.2 常用命令
HDEL key field1 [field2]删除一个或多个哈希表字段HGETALL key获取在哈希表中指定 key 的所有字段和值
2.3 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
Redis中的List可以理解为一种队列,有先进先出和先进后出两种模式。
Redis 的 list 的实现为⼀个双向链表,即可以⽀持反向查找和遍历,更⽅便操作,不过带来了部分额外的内存开销。
2.3.1 应用场景
发布与订阅或者说消息队列、慢查询。
2.3.2 常用命令
BLPOP key1 [key2 ] timeout移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOP key1 [key2 ] timeout移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。LINSERT key BEFORE|AFTER pivot value在列表的元素前或者后插入元素
2.4 Set
set 类似于 Java 中的 HashSet 。Redis 中的 set 类型是⼀种⽆序集合,集合中的元素没有先后顺序。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
2.4.1 应用场景
需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
2.4.2 常用命令
SADD key member1 [member2]向集合添加一个或多个成员SCARD key获取集合的成员数
2.5 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。和 set 相⽐,sorted set 还增加了⼀个权重参数 score(double类型)
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
2.5.1 应用场景
需要对数据根据某个权重进⾏排序的场景。⽐如在直播系统中,实时排⾏信息包 含直播间在线⽤户列表,各种礼物排⾏榜,弹幕消息(可以理解为按消息维度的消息排⾏ 榜)等信息。
2.5.2 常用命令
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
- ZCOUNT key min max 计算在有序集合中指定区间分数的成员数