Redis的使用和认识

目录

1.Redis的认识

2.Memcached和redis的区别和联系

3.为什么要用redis/为什么要用缓存

4.Redis的单线程模型

5.Redis的过期时间

6.Redis 保证持久化

7.Redis遇到的问题


1.Redis的认识

  • redis是一个高性能的 key-value 数据库,

  • 是使用C语言开发的数据库,

  • 它和传统数据库不一样的是redis的数据存在内存中,也就是说,它是内存数据 库,所以读写速度很快,

  • 因此redis经常用于缓存。

2.Memcached和redis的区别和联系

  • 相同点:

    1. 都是内存数据库,一般都用来做缓存。

    2. 都有过期策略。

    3. 性能都很高。

  • 不同点:

    1. redis支持多种数据类型。它除了支持简单的k/v类型【String :⼀般常⽤在需要计数的场景,⽐如⽤户的访问次数、热点⽂章的点赞转发数量 】,还支持list【存有序可重复,朋友圈点赞】、set【存无序不重复,共同好友】、hash【 存map,系统中对象数据的存储 】、sorted_set【 各种礼物排行榜】等类型的数据结构;Memcached只支持k/v数据类型。

    2. redis支持数据的持久化,可以把内存中的数据保存到磁盘,重启后,可以再加载使用,而Memcached把数据全部保存到内存中。

    3. redis有灾难恢复机制。因为可以把缓存中的数据持久化到磁盘上。

    4. redis在服务器内存使用完后,可以把不用的数据放到磁盘。但是Memcached在服务器内存使用完后,会直接报异常。

    5. Memcached没有原生的集群模式,需要靠客户端往集群中分片写入数据;但是Redis目前是原生支持cluster 模式的。

    6. Memcached是多线程,非阻塞I/O复用网络模型;Redis是单线程的多路I/O复用模型。(Redis6.0引入了多 线程I/O)

    7. Memcached过期数据的删除策略,只有惰性删除;而Redis同时使用了惰性删除和定期删除。

3.为什么要用redis/为什么要用缓存

高性能:提高用户体验

如果用户第一次访问数据库中的某些数据,过程会很慢。但是用户访问的数据如果是高频数据而且不经常改变的 话,我们就可以把它存到缓存中。这样可以保证用户下一次再访问这些数据的时候,访问速度更快。

高并发:应对更多的用户

直接操作缓存可以承受的数据库请求数量远大于直接访问数据库的,所以我们可以把数据库中的部分数据转移 到缓存中,这样一部分的请求会直接到缓存,不用经过数据库,我们也就提高了系统整体的并发能力。

4.Redis的单线程模型

Redis采用多路IO复用模型,也就是监听多个套接字,每个套接字关联不同的事件处理器。

使用单线程的好处:

  • 单线程编程容易并且更容易维护;

  • Redis 的性能瓶颈不再 CPU ,主要在内存和⽹络;

  • 多线程就会存在死锁、线程上下⽂切换等问题,甚⾄会影响性能。

但是Redis6.0开始引入多线程:来提⾼⽹络 IO 读写性能,

Redis6.0 的多线程默认是禁⽤的,只使⽤主线程。如需开启需要修改 redis 配置文件 io-threads-do-reads:yes;开启多线程后,还需要设置线程数,否则是不⽣效的:io-threads 4

5.Redis的过期时间

一方面设置过期时间来减少内存,否则会出现堆内存溢出的现象;另一方面设置过期时间是因为有一些业务就是需要某个数据在一段时间内出现,比如:短信验证码在60s内存在。

Redis的过期时间是通过过期字典来保存过期数据的。过期字典的键指向 Redis数据库中的某个key(键),过期字典的值是⼀个long long类型的整数,这个整数保存了key所 指向的数据库键的过期时间。

Redis过期数据的删除策略

        - 惰性删除:只会在取出key的时候才对数据进行过期检查。这样对CPU最友好,但是可能会 造成太多过期 key 没有被删除。

        - 定期删除:每隔⼀段时间抽取⼀批 key 执行删除过期key操作。

Redis的内存淘汰机制:

        仅仅通过给 key 设置过期时间还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。

        - 从已经设置过期时间的数据集中挑选最少使用的数据淘汰;

        -  从已经设置过期时间的数据集中挑选即将过期的数据淘汰;

        -  从已经设置过期时间的数据集中挑选随机的数据淘汰;

        -  从已经设置过期时间的数据集中挑选最不经常使用的数据淘汰;

        - 当内存不⾜以容纳新写⼊数据时,挑选最少使用的数据淘汰;

        - 当内存不⾜以容纳新写⼊数据时,挑选即将过期的数据淘汰;

        - 当内存不⾜以容纳新写⼊数据时,挑选随机的数据淘汰;

        - 当内存不⾜以容纳新写⼊数据时,挑选最不经常使用的数据淘汰。

6.Redis 保证持久化

快照:获得存储在内存⾥面的数据在某个时间点上的副本。

可以将快照复制到其他服务器从⽽创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器的时候 使⽤。

只追加:与快照持久化相⽐,AOF 持久化 的实时 性更好

  • appendfsync always # 每次有数据修改发⽣时都会写⼊AOF⽂件,这样会严重降低Redis的速度

  • appendfsync everysec # 每秒钟同步⼀次,显示地将多个写命令同步到硬盘

  • appendfsync no # 让操作系统决定何时进行同步

7.Redis遇到的问题

缓存穿透:

问题:高并发情况下,由于缓存和数据库中都没有需要的数据。

解决:

  • 客户端进行授权(判断id>0)

  • 在缓存中缓存空数据(key=-1,value=null,需要设置失效时间)

  • 布隆过滤器:把所有可能查询的参数放在布隆过滤器中,当用户发送请求,先判断查询的参数是否在布隆过滤器 中。不存在的话,直接返回请求参数错误信息给客户端。

缓存击穿:

问题:大量并发访问同一个数据,缓存中没有,但是数据库中有(可能失效了)

解决:

  • 热点数据永不失效(不推荐)

  • 互斥锁

缓存雪崩:

问题:大量并发访问不同的数据,缓存中没有数据,但数据库中有。

解决:

  • 针对redis服务不可用:

    • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中,设置热点数据永不过期。

    • 限流,避免同时处理大量请求。

  • 针对缓存失效的情况:

    • 设置不同的失效时间,比如随机设置缓存失效时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值