Redis 学习笔记2

1, 为什么要用Redis?

  •  redis是基于内存存储计算,性能速读远超mysql等数据库,计算速度很快,所以在使用的时候数据响应很快,

  • redis是系统必备的分布式缓存中间件,主要用来解决高并发下分担DB资源的负载,从而提升系统吞吐量。

  •     redis的集群部署也增强了redis的高可用性,以及对数据的易扩容。

  •     丰富的数据类型支持(string、list、set、sortedset(有序集合)、hash,Stream,等),

2. Redis 可以做什么?

缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;

排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;

计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;

好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;

简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;

Session共享,分布式的项目中,各个子项目之间可以共享session信息。

3. 什么是Redis的IO多路复用技术?

IO多路复用技术,现在我们模拟一个tcp服务器处理30个客户的socket,如何快速的处理掉这30个请求呢?

在不了解原理的情况下,我们类比一个实例:在课堂上让全班30个人同时做作业,做完后老师检查,30个学生的作业都检查完成才能下课。如何在有限的资源下,以最快的速度下课呢?

第一种:安排一个老师,按顺序逐个检查。先检查A,然后是B,之后是C、D

这中间如果有一个学生卡住,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。这种方式只需要一个老师,但是耗时时间会比较长。

第二种:安排30个老师,每个老师检查一个学生的作业。这种类似于为每一个socket创建一个进程或者线程处理连接。这种方式需要30个老师(最消耗资源),但是速度最快。

第三种:安排一个老师,站在讲台上,谁解答完谁举手。这时C、D举手,表示他们作业做完了,老师下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。这种方式可以在最小的资源消耗的情况下,最快的处理完任务。

第三种就是IO复用模型(Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。)

4. Redis 为什么不用多线程?

Redis官方解释:Redis的操作都是基于内存的,CPU不是 Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。因为Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。再说了,单线程切换开销小,容易实现既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了

Reds是C语言写的,性能极高。单台redis情况下,官方提供的数据为:读的速度是110000次/s,写的速度是81000次/s

若CPU成为你的Redis瓶颈,可通过多起几个Redis进程进行解决

原因:在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常迅速,使用单线程可以省去多线程时CPU上下文会切换的时间,也不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。对于内存系统来说,多次读写都是在一个CPU上,没有上下文切换效率就是最高的!既然单线程容易实现,而且CPU 不会成为瓶颈,那就顺理成章的采用单线程的方案了。

5.  公司有多个项目,都想使用Redis, 如何划分?

现在我们企业中,做的项目产品肯定不止一个;或者一个大的平台中,会有很多业务线。不同的项目和业务线肯定是不同的团队进行开发的。那大家都会用到redis,那怎么去划分?

  • 独立redis集群

这种方案就是不同的业务用不同的redis集群,这种方案针对一些小项目或业务线不复杂,以及用到redis缓存范围不大的话,是对服务器资源的浪费,而且增加了运维的工作量。

当然也有好处,就是redis资源的独立性,不干扰;一般会用在大项目中。

  • 公共redis集群

这种方案就是一些业务共用一个redis集群,增强了对redis资源的利用率。

在一般企业中,不同的业务线一般我们采用的是公共redis集群,因为业务线都不大,独立集群没有必要。这样虽然对redis资源充分利用了,但会出现一些问题。

如何区分业务

多业务间用redis,会出现很多缓存Key,根本没法知道哪些key是属于哪个业务的,如:

KEY:user:1000、user:book、book、user:like:book、book:user;甚至会出现key冲突。

redis的key在开发的使用是要合理进行设计规划的,但两个不同的团队,技术和管理都不一样,即使有规范文档,但不同的业务团队间,规范的执行就不得而知。

 

更多学习资料 请关注微信公众号

个人学习微信公众号

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值