一、为什么需要redis?

这个视频讲的太好了,看10遍都不为过!我决定每次看到这句话都点开这个视频看一遍。

https://www.bilibili.com/video/BV18jBiYpEDJ?spm_id_from=333.788.videopod.sections&vd_source=4e5addbe07f6c2c1f970580da6513dd6

        为什么需要redis?就是因为Mysql抗不住上万级别的查询,但是redis能分担。

        秒杀、抢票这种业务场景下必须用redis,用其他的都得完蛋:比如双十一零点的时候,淘宝的数据一定提前从MySQL拷贝到了redis里,没有redis只用MySQL的话,淘宝一秒崩

二、redis概述

  • redis全称:remote dictionary server远程字典服务。既然是字典,那么肯定与我们的“中华字典”有相似之处。其实redis里就是key-value的模式,根据key去查value,就好比我们根据拼音或者偏旁部首去查文字一样。然而这个value又有很多形式,可以是String,可以是一整个集合list,map、set。

  • 其实redis一共有3个功能:

  • 数据库

  • 缓存

  • 消息中间件(可以实现简单的发布和订阅,如果更复杂的场景肯定要用rocketmq和卡夫卡这种专业的去做)

但是人们总误以为redis就等于缓存。就和误以为maven只是一个导包工具一样,其实maven是一个功能很强大的项目管理工具。

  • 开源、C语言编写的、key-value数据库

  • 官方给出的读的速度:11万 次/s(超快!), 写的速度:8万次/s

  • 默认有16个数据库db0~db15,默认连接的是db0。

  • 在redis命令行里少用中文(不用中文),会变成一些转义的东西

  • 之后不会单独使用redis客户端去操作redis,一律都在springboot中

2.1 redis能干嘛

  • 高速缓存:作为MySQL的cache,把mysql磁盘级别的查询直接提升到内存级别。有一个问题,我们想访问的数据是MySQL的数据,但是有了redis以后访问的是redis的数据,万一二者不一致怎么办?  redis最初设计的时候,就是利用了数据的不一致性这一点打了个“容错差”,所以不一致性是永远存在的。只要更新数据库和维护缓存这两步不是原子操作,就一定会出现时间窗口内的不一致。我们能做的,是让不一致的时间尽可能短,达到最终一致即可。

    • 反例:对于银行账务这种强一致性的数据,你就直接不要用redis啊,直接去查数据库最准了。

    • 正例:比如视频网站播放量,缓存里是 10.2 万,数据库里已经 10.3 万了,页面展示多几千少几千没人计较。

    • 正例:秒杀商品详情页的“仅剩XX件”:显示 5 件,实际上数据库里只剩 2 件了,这没关系。因为真正下单时,系统会去数据库里再做一次强一致性扣减。库存展示只是给用户一个心理预期,不是最终的扣减依据。

  • 持久化(从内存到硬盘,RDB,AOF)

  • 作为数据库实现内存存储,比如用户的token这种短暂生效的信息,我直接不用mysql存了,只用redis存

  • 订阅发布 (充当简单的消息队列)

  • 地图信息分析(“附近的人”)

  • 计时器、计数器(“公众号浏览量”),不是浏览一次就执行一次mysql的update让浏览量+1,而是用Redis 的 INCR 在内存里累积,定期刷回数据库

官方不建议在Windows下使用redis!会出现兼容性问题。

2.2 单线程

1、redis为什么这么快?

  • 最主要的是完全运行在内存里,从内存取数据当然比去磁盘IO快多了

  • 第二个原因是Redis是只有主线程这一个单线程,没有上下文切换带来的消耗

  • 再就是网络IO层面,采用IO多路复用(redis源码调用了操作系统提供的select,epoll系统调用),这样一个单线程的redis可以处理11万/秒的客户端读请求。

  • 第四是因为它是key-value型数据库,找到一个数据的时间复杂度为仅为O(1)。

  • 第五可有可无哈哈哈,因为redis是用C写的,自然会快一些。

2、为什么redis是单线程?换句话讲,为什么不设计成多线程?

       两点,一个是上下文切换带来的开销,一个是加锁带来的开销。

1)redis运行在内存里,单线程查一个数据可能纳秒级别就查完了,但是你切线程的时间比人家查数据的时间都长,换句话讲,你用来切线程的时间我都能查好几百条数据返给客户端了。那如果我是8核CPU,我只开8个线程,不用切换了呀。所以看2)

2)对于资源竞争强烈的,不适合用多线程。如果多线程同时写一个数据的话,还要加锁,切换过去以后发现数据被锁了,还要切走。更慢了,不如单线程,单线程我们就不用加锁了

3、增加CPU核数会提高redis执行速度吗?

        不会,因为redis是单线程的,一个线程只占一个核。

        此外,多说一些。redis的运行速度只和内存大小(以及网络带宽)有关。和CPU的核数无关哦。但是和CPU的频数依然是有关的,因为redis毕竟也是一个用C语言写的程序,既然是程序,底层就是一条条的微指令,一个微指令又由很多微命令组成,一个CPU时钟周期执行一个微命令,频数越大,时钟周期越短自然程序执行越快,所以redis的执行速度当然和CPU的性能有关。

PS :这里我们一直在强调的单线程,只是在处理我们的一个网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的,因为会有多个用户的网络请求呀(IO多路复用),也可能会出现多个线程同时操作一个redis数据的情况,也是需要加锁操作的。

这里需要大家明确的注意一下。例如Redis进行持久化的时候会以子进程或者子线程的方式执行。

2.3 TCP级别的通信

redis不是基于HTTP通信,而是基于TCP。因为HTTP封装的字段redis都用不到,索性不如自己基于TCP协议自己做,端口号是6379

PS:为什么redis的端口号是6379?

作者是粉丝,还挺浪漫

四、常用命令

  • select 切换数据库

  • DBSIZE查看【当前】数据库大小

  • flushall 删除所有数据库中的所有数据

  • flushdb 删除当前库的数据

  • keys *: 查看当前数据库键值的个数

  • ping :返回“PONG”表示目前是cli是连接上redis-server的状态

  • EXISTS 键值:返回“1”表示键值存在,“0”不存在

  • move 键值 1: 命令中的“1”表示当前数据库,是必写的

  • clear:清屏

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐