五个常用的基本类型
一.string
1.string 数据结构是简单的 key-value 类型。构建了一种简单动态字符串SDS,Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据,并且获取字符串长度复杂度为 O(1),Redis 的 SDS API 是安全的,不会造成缓冲区溢出。
2. 常用命令:set,get,strlen,exists,dect,incr,setex` 等等。
3. 应用场景 :一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
二.list
1. list链表, Redis 实现了自己的链表数据结构。Redis 的 list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
2. 常用命令: `rpush,lpop,lpush,rpop,lrange、llen` 等。
3. 应用场景: 发布与订阅或者说消息队列、慢查询。
三.hash
1.hash内部实现也差不多(数组 + 链表)。hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。
2. 常用命令:`hset,hmset,hexists,hget,hgetall,hkeys,hvals` 等。
3. 应用场景: 系统中对象数据的存储。
四.set
1.Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,可以基于 set 轻易实现交集、并集、差集的操作。
2. 常用命令:`sadd,spop,smembers,sismember,scard,sinterstore,sunion` 等。
3. 应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
五.sorted set
1.sorted set 压缩列表 跳表 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。
2. 常用命令:`zadd,zcard,zscore,zrange,zrevrange,zrem` 等。
3. 应用场景:需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。
六.Redis 单线程模型
Redis 通过IO 多路复用程序来监听来自客户端的大量连接,注册到内核中并监听每个事件是否发生。
这样的好处非常明显: I/O 多路复用技术的使用让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗。
1. 单线程编程容易并且更容易维护;
2. Redis 的性能瓶颈不再 CPU ,主要在内存和网络;
3. 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。
Redis6.0 之后为何引入了多线程?
提高网络 IO 读写性能,因为这个算是 Redis 中的一个性能瓶颈。虽然,Redis6.0 引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了, 执行命令仍然是单线程顺序执行。因此,你也不需要担心线程安全问题。