掘金 后端 ( ) • 2024-04-17 16:39

简介

什么是redis

Redis(Remote Dictionary Server)是一个开源的内存数据库。它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。

Redis有什么特点

性能极高: Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作。

丰富的数据类型: Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。

原子性操作: Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。

持久化: Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。

支持发布/订阅模式: Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。

单线程模型: 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。

主从复制: Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。

Redis数据结构

Redis是(key-value)存储系统,我们说的不同的数据类型ue的数据类型。

redis命令

https://redis.com.cn/commands.html

常见的五种数据类型

类型 类型存储的值 操作 String 字符串、整数或浮点数 对字符串整个操作, 对整数或浮点数进行累加 List 链表 对列表两端进行操作,读取任意个元素,根据值进行查找或删除 Set 字符串集合 添加、获取、删除,判断值是否存在,交集、并集等集合运算 Hash hash表 单个元素进行查询、添加、修改、删除、累加操作,所有元素查询、删除 Zset <String,Double>hash表 Hash表中元素根据分数排序。添加、获取、删除单个元素,根据分值范围查询

String字符串

String是redis中最基本的数据类型。String类型是二进制安全的,意思是Redis的String可以包含任意数据。如数字、字符串或序列化的对象。

image.png

常用命令

命令 描述 GET key 获取指定 key 的值 SET key value 设置指定 key 的值 GETSET key value 将key的值设为value,并返回key的旧值 MGET key1 key2.. 获取Key对应的值 SETEX key seconds value 设置指定key的值,并设置过期时间 SETNX key value 只有在 key 不存在时设置 key 的值 INCR key 将 key 中储存的数字值增一 INCRBY key increment 将 key 中储存的数字值增加指定值 DECR key 将 key 中储存的数字值减一 DECR key increment 将 key 中储存的数字值减少指定值

使用场景

  • 缓存:手机短信验证码、分布式锁、减轻mysql压力
  • 计数器:登录次数

List

Redis中的List用双端链表实现

image.png

常用命令

命令 描述 BLPOP key1 key2 timeout 移除并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOP key1 key2 timeout 移除并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 LINDEX key index 通过索引获取列表中的元素 LLEN key 获取列表长度 LPOP key 移出并获取列表的第一个元素 LPUSH key value1 value2 将一个或多个值插入到列表头部 LRANGE key start stop 获取列表指定范围内的元素 LREM key count value 移除列表元素,删除count个value LTRIM key start stop 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

使用场景

  • 时间轴
  • 消息队列

Set

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

image.png

常用命令

命令 描述 SADD key member1 member2 集合中添加一个或多个数据 SCARD key 查询集合个数 SDIFF key1 key2 返回第一个集合与其他集合之间的差异 SDIFFSTORE destination key1 key2 返回给定所有集合的差集并存储在 destination 中 SISMEMBER key member 判断 member 元素是否是集合 key 的成员 SMEMBERS key 返回集合所有元素 SPOP key 移除并返回集合中的一个随机元素 SRANDMEMBER key count 返回集合中一个或多个随机数

使用场景

  • 朋友圈点赞
  • 标签:用户添加标签

hash

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

image.png

常用命令

命令 描述 HDEL key field1 field2 删除一个或多个哈希表字段 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在 HGET key field 获取存储在哈希表中指定字段的值 HGETALL key 获取在哈希表中指定 key 的所有字段和值 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment HMSET key field1 value1 field2 value2 同时将多个 field-value对设置到哈希表 key 中 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值 HSCAN key cursor MATCH pattern COUNT count 迭代哈希表中的键值对

使用场景

  • 缓存:针对单个key 多个维度数据

Zset

Redis 有序集合和集合一样不允许重复的成员。不同的是每个元素都有一个double类型的分数。通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

image.png

常用命令

命令 描述 ZADD key score1 member1 score2 member2 添加一个或多个元素,或者修改已有元素分数 ZCARD key 获取集合内元素个数 ZCOUNT key min max 获取集合内指定分数区间元素个数 ZINCRBY key increment member 有序集合中对指定成员的分数加上increment ZLEXCOUNT key min max 分数相同 对集合元素进行字段排序 ZRANGE key start stop WITHSCORES 通过索引区间返回有序集合指定区间内的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 ZRANK key member 返回有序集合中指定成员的索引 ZSCORE key member 返回有序集中,成员的分数值

使用场景

  • 排行榜
  • 时间范围查询

不常见的三种数据类型

HyperLogLogs(基数统计)

集合中不重复的元素个数称为基数

优势:

一个大型的网站,每天 IP 比如有 100 万,粗算一个 IP 消耗 15 字节,那么 100 万个 IP 就是 15M。而 HyperLogLog 在 Redis 中每个键占用的内容都是 12K,理论存储近似接近 2^64 个值,不管存储的内容是什么,它一个基于基数估算的算法,只能比较准确的估算出基数,可以使用少量固定的内存去存储并识别集合中的唯一元素。而且这个估算的基数并不一定准确,是一个带有 0.81% 标准错误的近似值(对于可以接受一定容错的业务场景,比如IP数统计,UV等,是可以忽略不计的)。

常用命令

命令 描述 PFADD key element [element ...] 添加指定元素到 HyperLogLog 中 PFCOUNT key 返回给定 HyperLogLog 的基数估算值 PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog

Bitmap(位存储)

位图数据结构,操作二进制位来进行记录,只有0、1两个状态

用来记录打卡天数(为什么登录不能算打卡!!) image.png

相关使用命令

命令 描述 SETBIT KEY value 1/0 将位图某个值设置为1或0 GETBIT KEY value 查询key某个位图的值 BITCOUNT key start end 计算字符串中被设置为1的位数

geospatial(地理位置)

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作

常用命令

命令 描述 GEOADD 添加地址位置的坐标 GEOPOS 获取地址位置坐标 GEODIST 计算两个位置之间的距离 GEORADIUS 获取指定坐标指定范围内的地理位置集合 GEOHASH 获取地理位置GEOHash地址

使用场景

  • 附近的人、附近商家

总结

Redis的8种数据数据类型、常用命令、常用使用场景。

其中不常用的数据类型,例如hyperloglogs在解决海量数据的基数统计、geo在地理位置、两个地址相隔距离方面的问题,让人耳目一新,以前认为很复杂的功能,原来这么简单。

本文是Redis的基础篇,也是Redis系列的第一篇,这个系列会系统全面的梳理Redis的知识体系,如果有遗漏或者错误,欢迎留言沟通交流。

如果你都看到这了,点赞支持弥金吧。