Redis 缓存需要了解和注意的问题

Redis 75 浏览

Redis缓存想必大家都很熟悉,但是工作中可能使用到的地方都很片面,我们需要有个整体的认识。结合网上查询的和自己的理解,我们也具体总结下。

什么是Redis?

Redis是一个开源的底层使用C语言编写的key-value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型:string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set:有序集合)。

为什么要使用Redis?

高并发:单机缓存支持每秒QPS十几万,远远超过数据库;

高性能:缓存使用内存读写性能远超磁盘。

为什么Redis这么快?

1、Redis是纯内存操作,不需要频繁对磁盘I/O,只需要定时持久化到硬盘中;

2、Redis是单线程,避免多线程中上下文频繁切换的操作;

3、Redis数据结构简单、对数据的操作也比较简单;

4、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

5、使用多路I/O复用模型,非阻塞I/O。

多路I/O复用: I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作

Redis能做什么?

缓存数据:最常用,比如电商初始化页面的数据;新闻网站实时热点、微博热搜等需要频繁查询的数据

消息队列:比如订阅、发短信、发邮件等。

计数器:比如统计点击率、点赞率,redis具有原子性,可以避免并发问题。

| Redis数据类型应用场景

String:字符串是最常用的数据类型,他能够存储任何类型的字符串,当然也包括二进制、JSON化的对象、甚至是base64编码之后的图片。在Redis中一个字符串最大的容量为512MB,可以说是无所不能了。

Hash:常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息,只需要通过Key取出Value进行反序列化修改某一项的值,再序列化存储到Redis中,Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。

List:List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。另外,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。

Set:set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,这个时候就可以选择使用set。

Sort Set:可以按照某个条件的权重进行排序,比如可以通过点击数做出排行榜的数据应用;同时有序集合也可以做分页,且高并发支持比较好。

| Redis过期策略和内存淘汰机制

定期删除:Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。

惰性删除:由于定期删除是随机的,可能会有漏网之鱼。所以,当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接回删除过期的key。

内存淘汰:内存淘汰是指用户存储的一部分key是可以被Redis自动的删除,从而会出现从缓存中查不到数据的情况。假如我们的服务器内存为2G、但是随着业务的发展缓存的数据已经超过2G了。但是这并不影响我们程序的运行,因为操作系统的可见内存并不受物理内存的限制。物理内存不够用没关系,计算机会从硬盘中划出一片空间来作为虚拟内存。这就是Redis设计两种应用场景的初衷:缓存、持久存储。


使用Redis我们需要注意什么?

Redis 缓存数据一致性的理解和方案

Redis 缓存穿透、缓存雪崩、缓存击穿的理解和解决方案

Redis 并发竞争的理解和方案

|  版权声明:本文为博主原创文章,转载请注明出处。