redis内容记录
redis的基本数据类型
- String:是最基本的数据类型,它可以存储任何二进制安全的数据。
不仅能存放文本数据,还能保存图片、音频、视频、压缩文件等二进制数据。它们通常用于缓存。 - Hash:哈希类型,其中键值对中的值本身又是一个键值对结构,hash 特别适合用于存储对象。
- List:Redis列表,一个列表最多可以包含 2^32 - 1 个元素(40多亿)
特点:元素是有序的(可以按照插入顺序排序),元素可以重复
使用rpush 命令,将元素往数组左边插入,如果列表不存在,一个空列表会被创建并执行rpush操作

使用lpush 命令,将元素往数组左边插入

使用lpop命令移出并获取列表的第一个元素

等等具体的命令可以查看redis文档学习
用到的场景:1> 文章列表。可以做到分页,范围查找。 - Set:无序集合。可以存2^32-1个元素。可以做交集(sinter),并集(sunion),差集(sdiff),如果元素非常多,耗时会很多。
特点:集合元素是无序,唯一的。
使用sadd命令添加元素,使用smembers 查看集合元素,使用scard查看集合元素数量


set集合做交集:

- ZSet:有序集合,每个元素都会关联一个double 类型的分数,通过分数来为元素做排序
特点:集合元素不重复
zrevrange 从大到小查询,zrange 从小到大查询

BitMap:
实现对位的操作,实际上就是string(字符串)数据类型,但是它可以对字符串的位进行操作。类似bit数组。每个bit位存储0或1。时间复杂度为O(1)。占用空间小。
布隆过滤器:是一种算法,用来判断一个元素是否再一个集合中,这种算法由一个二进制数组和一个Hash算法组成。
特点:高效的插入和查询
带有一定的误判性,通过hash计算在数组上的不一定在集合里(哈希冲突);通过hash计算不在数组上的一定不在集合里。
优化方案:
- 增大数组(减少哈希冲突),不推荐
- 增加hash函数
使用场景:
- 判断用户是否存在
- 判断用户是否在线
redis的缓存穿透:
查询一个key,缓存中不存在这个key,就需要去查询数据库,导致这个不存在的数据每次请求都需要到数据库中查询。
解决方案:
- 可以使用布隆过滤器
详细说明: - 缓存空对象
redis的发布和订阅:
是提供了类似消息中间件的功能。
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的客户端。订阅者是被动的,相当于启一个监听。
特点:发送即忘的原则。如果用作消息中间件,会出现消息的丢失,这个是不被容忍的。

redis 5.0版本之后,增加了Stream数据结构,用来支持消息中间件的。
增加消息列表

查看消息列表

为什么在消息中间件中,消费的时候要用到群组,因为生产者和消费者的速度不一样,消费者需要处理其他业务,所以效率更低一些,所以需要群组。
redis本身是轻量级的key-value缓存数据库,更适合做缓存,Stream功能有限,如果资源可以,使用更加专业的消息中间件更合适。
redis的key和value用什么结构组织
全局哈希表(数组+链表)
为了实现从键到值的快速访问,Redis使用了全局哈希表来保持所有的键值对。一个哈希表就是数据+链表,使用链表来解决哈希冲突问题。
其中entry元素包含了key-value,key就是Redis的键,value就对应Redis实际的各个数据类型的值。

如果链表变长,时间复杂度就会增加,就需要扩大数组,原数组要重新计算hash值,放到新数组里对应位置上,来减少哈希冲突,这个过程就是rehash。
但是元素移动的时候,同时外部也会有请求过来进行元素增加、删除等操作,如果一次性将元素拷贝到新数组上,会线程阻塞,即Rehash会出现IO阻塞问题,实际中不能造成redis卡顿,为了解决这个问题,使用了渐进式rehash。
Redis使用渐进式rehash:
使用了2张全局哈希表,如果不涉及到扩容,哈希表2为空的。
过程:
- 首先创建另外一张更大的全局哈希表,客户端请求过来时,先遍历原来老数组,拿到老数组上第一个元素,将元素放在新数组上做rehash,将元素分散,这个请求上IO阻塞时间会变少
- 当第二个请求过来,同样将对应索引上的哈希链rehash到第二张哈希表上,以此类推...
- 若没有请求也会定时执行渐进式rehash
另外:哈希表是成倍扩容的
扩容条件(任意一个满足会进行扩容):
- 装载因子>=1,同时,哈希表被允许进行rehash。在进行RDB生成和AOF重写时,哈希表的rehash是被禁止的,这是为了避免对RDB和AOF重写造成影响
- 装载因子>=5
装载因子的计算方式是,哈希表中所有 entry 的个数除以哈希表的的数组长度。

浙公网安备 33010602011771号