-
什么是reids
-
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成
-
读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
-
对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
-
支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片集群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等
-
redis和memcached有什么区别
-
Memcached 也是基于内存的数据库
-
Redis 与 Memcached 共同点:
-
都是基于内存的数据库,一般都用来当做缓存使用。
-
都有过期策略。
-
两者的性能都非常高。
-
-
Redis 与 Memcached 区别:
-
Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
-
Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
-
Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
-
Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持
-
-
-
为什么使用redis作为mysql的缓存
-
redis具有 高性能 和 高并发
-
高性能
-
用户第一次取数据,数据在硬盘上取出,会比较慢,将数据缓存到redis中,下次取数据就很快,只需要从缓存(在内存中)中取出即可。
-
Mysql更新数据,redis缓存也会更新,不存在不一致性问题。
-
-
高并发
-
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。
-
所以我们考虑把数据库放到缓存中,用户请求就直接访问缓存,不用访问数据库,提高性能。
-
-
-
-
redis数据结构
-
redis数据类型以及使用的场景分别是什么
-
String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)
-
版本更新后新增:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)
-
使用的场景
-
String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。
-
List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
-
Hash 类型:缓存对象、购物车等。
-
Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
-
Zset 类型:排序场景,比如排行榜、电话和姓名排序等。
-
BitMap(2.2 版新增):二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数等;
-
HyperLogLog(2.8 版新增):海量数据基数统计的场景,比如百万级网页 UV 计数等;
-
GEO(3.2 版新增):存储地理位置信息的场景,比如滴滴叫车;
-
Stream(5.0 版新增):消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据。
-
-
五种常见的redis数据结构是怎么实现的?
-
String
-
主要使用SDS(简单动态字符串)
-
SDS相比较于C的原生字符串:
-
SDS可以保存文本数据,也可以保存二进制数据。
-
SDS获取字符串长度的时间复杂度是O(1)。
-
Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。
-
-
-
List
-
底层是 双向链表或者是压缩列表 实现
-
如果列表的元素个数小于 512 个(默认值,可由 list-max-ziplist-entries 配置),列表每个元素的值都小于 64 字节(默认值,可由 list-max-ziplist-value 配置),Redis 会使用压缩列表作为 List 类型的底层数据结构
-
如果列表的元素不满足上面的条件,Redis 会使用双向链表作为 List 类型的底层数据结构
-
-
3.2之后,底层就直接使用quicklist实现
-
-
Hash
-
底层使用的压缩列表或者是哈希表
-
如果哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构;
-
如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的底层数据结构。
-
-
7.0之后,用listpack实现
-
-
Set
-
哈希表或者是整数集实现
-
如果集合中的元素都是整数且元素个数小于 512 (默认值,set-maxintset-entries配置)个,Redis 会使用整数集合作为 Set 类型的底层数据结构;
-
如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。
-
-
-
Zset
-
底层用 压缩列表或者是跳表实现
-
如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构;
-
如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;
-
-
7.0之后用listpack实现
-
-
-
-
-
redis线程模型
-
redis是单线程吗
-
Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的
-
Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的
-
2.6版本,2个后台线程,作用是处理关闭文件,AOF刷盘
-
4.0之后,多一个后台线程,异步释放redis内存,lazyfree线程。
-
Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的
-
把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了
-
-
-
redis单线程模式是怎么样的
-
redis初始化
-
调用 epoll_create() 创建一个 epoll 对象和调用 socket() 创建一个服务端 socket
-
调用 bind() 绑定端口和调用 listen() 监听该 socket;
-
将调用 epoll_ctl() 将 listen socket 加入到 epoll,同时注册「连接事件」处理函数。
-
-
初始化完毕之后就开始进行事件循环函数
-
调用处理发送队列函数
-
调用 epoll_wait 函数等待事件的到来
-
连接事件到来,则会调用连接事件处理函数
-
读事件到来,则会调用读事件处理函数
-
写事件到来,则会调用写事件处理函数
-
-
-
-
redis采用单线程为什么还是这么快
-
redis知识详解
最新推荐文章于 2024-08-21 17:10:13 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)