目录
前言
Redis是一个高性能的key-value的内存数据库 ,在内存上的数据会随着掉电而通通消失,所以就有了不同的持久化的方式(搞到硬盘上)。Redis没有关系型数据库那种复杂查询的功能,而换来的是简单易用和高性能~~
Redis支持哪些数据类型
五种核心类型
- String
- Hashmap
- List
- Set
- Zset
后续新增了一些数据类型~
- Bitmap:通过二进制位表示某个数是否存在
- Bitfield:把字符串当作位图,进行位操作
- Hyperloglog:基于位图实现计数效果
- Geospatial:地理信息,存储经纬度,并可以进行一些空间计算
- Stream:消息队列
Zset为什么用跳表不用红黑树 ?
跳表的插入、删除、查询的时间复杂度一样是O(logN),与红黑树一样。但是跳表更简单,不需要重新平衡这种操作
Redis常见的应用场景?
- 缓存:用来保存常见的热点数据,减少数据库的压力
- 计数器:统计点击次数、收藏、点赞次数等
- 排行榜:可以基于Zset简单实现
- 分布式会话:使用Redis存储会话信息,可以让用户访问到系统的不同模块的时候都使用同一个公共会话
- 分布式锁:对于分布式的一种并发控制手段,可以基于Redis来实现,上篇文章有详细展开
- 消息队列:Redis自身支持Stream数据类型,可以作为简单的消息队列使用
如何检测Redis的连通性?
给服务端发送一个 "ping" ,通顺的话就会收到 "pong"
如何设置key的过期时间?
可以在set key的时候通过EX选项指定过期时间,也可以再使用expire对已存在的key设置过期时间
Redis为什么是单线程模型?
Redis内部逻辑较为简单,大部分的性能瓶颈都是出现在IO或内存上,很少是CPU。因此使用多线程还没多大收益,还容易引入线程安全问题
从Redis6.0开始,Redis引入多线程,此时它也只是使用多线程去处理网络请求+协议解析,真正执行Redis命令的仍然是单线程完成,这样可以提高IO处理效率
Redis里的IO多路复用是什么?
Redis主要是基于Linux提供的epoll机制来完成IO多路复用(之前文章详细讲述过)
所谓IO多路复用,其实就是一个线程来管理多个 socket ,并按需激活线程
| 假如在同一个单位时间内,有多个Redis客户端的请求到来了.....
| 使用传统的方式是给每一个客户端连接开一个线程,但是大部分的客户端不会频繁的给你 传输,即多数是空闲线程(不活跃) , 所以搞一堆线程不如就用一个线程来处理,反正并 发量不会太高而且处理速度又飞快
上述的操作被Linux封装好了,就是IO多路复用
在Linux中有三种实现方式:
- select
- poll
- epoll
epoll是最新,也是最高效的版本(之前文章有详细讲述)这里浅浅谈一下
epoll在内核维护了