Redis知识点整理
第一部分:Redis基础知识点
- 1、数据类型
- 5种常用基础类型:string,hash,list,set,zset – 字符串,Hash表,List顺序集合,Set无序集合,ZSet有序集合
- 3中特殊类型:bitmap-字节地图, hyperloglog-统计日志,geospatial-地理位置计算
- 2、底层数据结构
- String: 基于SDS字典结构
- Hash表 : 由zipList/quickList组成,底层有Dict保存
- List集合: 基于LinkedList数据接口的ZipList和QuickList结构
- Set集合: intSet和Dict组合,其中Dict由Hashtable和DictEntry和Dict组成
- ZSet集合:HashTable+SkipList+IntSet
- 说明:
- ZipList压缩表用于当元素数量小于128时,用于对集合压缩,减少内存占用,但是虽节省内存但是需要连续空间,会造成内存碎片
- QuickList则在ZipList上使用LinkedList来避免申请连续空间,减少内存碎片产生
- SkipList跳表则是采用类似于加索引方式,提升查询效率
- 3、持久化方式
- rdb快照模式, 数据恢复快,效率高,但是会丢失数据
- aof命令拼接模式:数据恢复慢,效率低,数据安全
- 常用RDB+AOF结合方式。
- 4、内存淘汰策略
- allkey-lru,allkey-lfu,allkey-random,nonvice,volite-lru,volite-lfu,volite-ttl
- LRU算法:最近最少使用,
- 底层原理基于HashTable+LinkedList即Hash表和双向链表实现
- 即HashTable用于快速查找,LinkedList采用后进先出方式,保证最近访问的放在前面,只淘汰尾部即可
- LFU算法:最近不频繁使用
- 底层原理使用RedisObject的lru字段的后半部分保存访问的次数
- TTL算法:对于设置了存活时间(TTL)的key,TTL值越小,越先淘汰
- Random算法 :随机算法
- 5、集群方式
- 主从模式,哨兵模式,代理分片模式,redis-cluster模式
- 6、redis常见问题
- 缓存雪崩,缓存穿透,缓存击穿,bigkey,hotkey,双写一致性
- 7、redis特性
- 内存,单线程模型,多路复用,epoll
- 8、redis锁八大机制
- 加锁,可重入锁,维持加锁-看门狗机制,锁互斥, 手动释放锁,自动释放锁,加锁超时,超时释放锁
- 9、过期策略
- 定时过期,惰性过期,定期过期
- 10、redis 集群模式
- 主从模式,哨兵模式,Redis-Clustor
- 11、Redis为什么快?
- 内存模式+内存淘汰策略:内存模式保证查询快,内存淘汰保证安全
- 网络模型
- RESP协议是CS架构,内部数据结构简单,准确
- epoll,非阻塞的多路复用,基于信号IO驱动
- 零拷贝
- 持久化,保证数据安全性
- 原子事务
- 12、Redis的特性
- 内存,持久化,事务,Io多路服务,Epoll机制
第二部分:Redis实战场景
1、Redis的应用场景
- 1、分布式缓存:旁路缓存,对象缓存,全页缓存,热点数据缓存
- 2、分布式锁
- 3、分布式Session共享
- 4、分布式唯一ID生成
- 5、分布式限流
- 6、计数器
- 7、排行榜
- 8、位统计功能:签到打卡,用户留存率,用户活跃度
- 9、延时操作:
- 10、点赞,关注和推荐,朋友圈可见
- 11、消息队列
- 12、抽奖
- 13、标签
- 14、过滤(布隆过滤器),筛选
- 15、业务处理:交集,差集,并集
2、Redis问题以及解决方案
- 1、缓存雪崩
- 原因: 缓存同时过期
- 方案:
- (1)加随机过期时间
- (2)多级缓存
- (3)限流+读锁
- 2、缓存穿透
- 原因:大量访问缓存和数据库不存在数据
- 方案:
- (1)访问校验
- (2)Hash拦截
- (2)布隆过滤
- (3)空值缓存
- (4)混合方式解决,即空值短缓存,频繁请求加校验
- 3、缓存击穿
- 原因:热点数据过期
- 方案:
- (1)多级缓存
- (2)不过期
- (3)加锁
- 4、热点key问题
- 原因:热点数据超频繁,造成服务过载
- 方案:
- (1)多级缓存
- (2)集群扩容,分片负载
- (3)热点分散
- 5、redis大key问题
- 原因:Hash,List,set,zset等集合由于时间累积造成key过大
- 方案:
- (1)定时过期重建key
- (2)压缩value
- (3)拆分bigkey
- (4)定期检查key移除失效元素,进行瘦身
- 6、双写一致性问题
- 原因:高并发场景下缓存和DB更新导致读写不一致问题
- 方案:
- 1、更新cache,更新DB-问题:更新DB失败造成脏数据
- 2、更新DB,更新Cache-问题:更新Cache失败造成脏数据
- 3、删除cache,更新DB-问题:高并发场景,会读取到未更新DB的脏数据
- 4、延迟双删,删除Cache,更新DB,删除Cache:一定程度上可以保证,但是
- 5、更新DB,延迟更新Cache-通过Canol或MQ方式延迟更新Cache,某种方式来说可以解决更新Cache失败问题
第三部分:深入Redis原理
1、Redis数据类型以及应用场景
- 数据类型
- string,Hash,List,Set,ZSet,BitMap,Geo,LogLog
- 使用场景:
- 分布式缓存(旁路缓存,读写缓存),分布式锁,分布式Session,
- 计数器,布隆过滤器,限流器
- 消息队列,秒杀,红包,抽奖.点赞,关注,签到,榜单,
2、持久化机制
- 持久化方式
- RDB方式:恢复快,文件小,数据安全低
- RDB持久化:save指定触发后,redis会fork出一个线程,拷贝出当前运行时副本,成功后
- AOF方式:内容多,文件大,恢复慢,数据安全高
- AOF大小触发重做后,redis会fork出一个新线程,拷贝出当前运行时数据副本的保存命令,后再执行增量数据命令
- RDB方式:恢复快,文件小,数据安全低
- 持久化策略
- 自动保存,手动保存
3、redis锁机制,事务机制,原子性等
- 锁机制
- 过程
- getLock,如果true,则setnx,执行程序,主动释放lock,完成,如果程序超时,通过expire被动释放lock
- getLock,如果false,则自旋等待已经占有锁线程释放lock
- 作用:
- 保证分布式环境下,线程竞争资源的正常运行。
- 过程
- 原子性
- redis的原子操作指令:incr和decr,setnx
- 自定义实现方式
- 使用Lua脚本
- 使用事务+监控方式:
- 1、监控:watch key,2、事务开始:MULTI,3、定义事务原子操作:SET key 100 4、执行事务: EXEC
- 事务机制
- 原子性,一致性,隔离性,持久性,顺序性
- Redis事务流程
- 事务开始 MULTI,WATCH,命令入队,取消入队DISCARD,事务执行 EXEC
2、Redis的数据结构
- SDS 动态字符数组,每个数组由头部,len,freelen组成
- LinkedList 双向链表结构
- ZipList 压缩链表结构,集合长度小于512或长度小于64k时采用压缩表结构
- QuickList 快速链表结构,v3.2以后改进,由linked+ziplist组成,linkedlist保证快速遍历,ziplist保证数据压缩
- hashtable 哈希表结构,redis全局也是hash表结构
- skiplist - 跳表结构-结构上结点之间有多个指针,能够根据key快速跳到对应的位置
3、Redis快速的原因
- 基于内存实现的KV结构,便于快速查找
- 高效的数据结构和数据编码
- 单线程模型,避免线程上下文切换
- 高效的网路传输协议,使用epoll实现IO多路复用机制
- 高效的内存淘汰机制,保证缓存命中率
4、Redis线程模型,IO模型,网络模型等
- 线程模型
- 单线程模型:即网络请求采用单线程,分为文件事件处理器-包括请求连接,命令请求,命令响应
- 多线程模型:连接,持久化,语法检查
- 网络Io模型
- 参考JavaIO模型
- 多路复用
- 多路是网络请求多路
- 复用是处理线程复用
- 内存模型
- 本身内存,数据内存,缓冲内存,碎片内存
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Redis知识点整理
第一部分:Redis基础知识点 1、数据类型 5种常用基础类型:string,hash,list,set,zset – 字符串,Hash表,List顺序集合,Set无序集合,ZSet有序集合3中特殊类型:bitmap-字节地图, hyperloglog-统计…...
![](https://img-blog.csdnimg.cn/img_convert/64c27bf6f44a902bc1a5f70e1b152ef2.png)
React笔记(一)初识React
一、React概述 1、什么是react react的官网:React 用于构建用户界面的 JavaScript 库,它也是一个渐进式的用于构建用户界面的javascript框架 2、主要特征 声明式:使用原生JS编写的页面存在着开发效率低下、性能较差的情况,使用react大家就…...
![](https://img-blog.csdnimg.cn/8bdf46db095d4e39aea46cafefb23677.png)
C语言——指针进阶(一)
目录 编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 编辑 五.…...
![](https://csdnimg.cn/release/blog_editor_html/release2.2.9/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N4N7)
【ArcGIS Pro二次开发】(62):复制字段
应网友需求,做了这么一个复制字段的小工具。 假定这样一个场景,手头有一个要素1,要素里有10个字段,另一个要素2,除了shape_area等图形字段外,没有其它字段。 现在的需求是,想把要素1中的8个字…...
![](https://img-blog.csdnimg.cn/img_convert/a24c531ddb16eab274e279ae826dec97.png)
【Tkinter系列02/5】界面初步和布局
本文是系列文章第二部分。前文见:【Tkinter系列01/5】界面初步和布局_无水先生的博客-CSDN博客 说明 一般来说,界面开发中,如果不是大型的软件,就不必用QT之类的实现,用Tkinter已经足够,然而即便是Tkinter规…...
![](https://img-blog.csdnimg.cn/dd302e6d847743b5904f46de99ee8f58.png)
2023年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:最佳路径 如下所示的由正整数数字构成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的…...
![](https://www.ngui.cc/images/no-images.jpg)
介绍一些编程语言— CSS 语言
介绍一些编程语言— CSS 语言 CSS 语言 简介 CSS,层叠样式表,是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。 CSS 能够对网页中元素位置的排版进…...
![](https://www.ngui.cc/images/no-images.jpg)
一文讲清楚c/c++中的宏
一文讲清楚c/c中的宏 文章目录 一文讲清楚c/c中的宏一、如何理解这个“宏”字面的意思呢?二、c/c中的宏详解三、宏的使用场景 一、如何理解这个“宏”字面的意思呢? 在刚开始学习C语言的时候,始终有点分不清楚"宏"这个字面上的意思…...
![](https://www.ngui.cc/images/no-images.jpg)
typescript进阶语法
typescript进阶语法 interface 接口定义 interface userType {name:string,age:number,sex?:string }type接口定义 type userType {name:string,age:number,sex?:string } type userType username # 固定值写法 let user:userType age # 报错 只能等于usernamepick摘取…...
![](https://www.ngui.cc/images/no-images.jpg)
宝塔终端 查看 7003端口 占用 并且杀死
要查看端口是否被占用并杀死相关进程,你可以按照以下步骤执行: 打开宝塔面板,进入服务器管理页面。在左侧导航栏中选择「工具」,然后选择「终端」进入宝塔终端界面。输入以下命令查看端口占用情况:netstat -tuln | gr…...
![](https://img-blog.csdnimg.cn/d2b4498d6bd946cfa10446319c9c4a3f.png)
可解释性的相关介绍
一、可解释性的元定义(Meta-definitions of Interpretability) The extent to which an individual can comprehend the cause of a model’s outcome. [1]The degree to which a human can consistently predict a model’s outcome. [2] 可解释性&am…...
![](https://img-blog.csdnimg.cn/11735902d74b44d988b57c06d485509f.png)
AUTOSAR规范与ECU软件开发(实践篇)6.7 服务软件组件与应用层软件组件端口连接
在生成了BSW模块的代码后, 切换到ISOLAR-A系统级设计界面,会发现产生一些基础软件模块的服务软件组件: BswM、 ComM、 Det和EcuM等, 如图6.60所示。 图6.60 生成了BSW后的服务软件组件 此时, 如果涉及服务软件组件与应用层软件组件的交互, 就需要为应用层软件组…...
![](https://www.ngui.cc/images/no-images.jpg)
菜鸟教程《Python 3 教程》笔记(6):列表
菜鸟教程《Python 3 教程》笔记(6) 6 列表6.1 删除列表元素6.2 列表函数和方法6.2.1 max()、min()6.2.2 reverse()6.2.3 sort() 6 列表 出处: 菜鸟教程 - Python3 列表 6.1 删除列表元素 >>> list [Google, Runoob, 1997, 2000]…...
![](https://img-blog.csdnimg.cn/img_convert/e5e58e10581b6eda5c0d89add0742df7.png#pic_center)
LeetCode-56-合并区间
题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList,…...
![](https://www.ngui.cc/images/no-images.jpg)
Git gui教程---番外篇 gitignore 的文件使用
想说的 .gitignore 的文件一般大型的编译器带git的都会生成,他可以将你不想提交的文件在git下忽略掉,你应该不想将一大堆编译生成的过程文件,还有一些贼大的文件提交上git的。 凡是都有例外,一些冥顽不灵的编辑器,只能…...
![](https://www.ngui.cc/images/no-images.jpg)
javaee spring 用注解的方式实现ioc
spring 用注解的方式实现ioc spring核心依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux基础(二)
这里写目录标题 一、网络管理1- 网络状态查看1.1 net-tools1.2 iproute2 2- 网络故障排除 !step1:检测当前主机和目标主机是否畅通 [ping]step2:检测网络质量,追踪路由 [traceroute]step3:检测网络质量,检查是否有数据包丢失 [mrt]step4: 检查端口是否畅通 [telnet]…...
![](https://www.ngui.cc/images/no-images.jpg)
155. 最小栈(中等系列)
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int…...
![](https://img-blog.csdnimg.cn/1c0446777b224c44808e3af326e86209.gif)
用python从零开始做一个最简单的小说爬虫带GUI界面(3/3)
目录 上一章内容 前言 出现的一些问题 requests包爬取小说的不便之处 利用aiohttp包来异步爬取小说 介绍 代码 main.py test_1.py test_3.py 代码大致讲解 注意 系列总结 上一章内容 用python从零开始做一个最简单的小说爬虫带GUI界面(2/3)_…...
![](https://www.ngui.cc/images/no-images.jpg)
SpringBoot+Vue如何写一个HelloWorld
一、SpringBoot介绍 Spring Boot是一个用于创建独立且可执行的Spring应用程序的框架。它简化了基于Spring框架的应用程序的开发过程,并提供了一种快速和简便的方式来构建Java应用程序。 Spring Boot提供了自动配置机制,通过引入适当的依赖项࿰…...
![](https://img-blog.csdnimg.cn/img_convert/efd420f41082c633a29d468e34b2fe06.png)
深度强化学习。介绍。深度 Q 网络 (DQN) 算法
马库斯布赫霍尔茨 一. 引言 深度强化学习的起源是纯粹的强化学习,其中问题通常被框定为马尔可夫决策过程(MDP)。MDP 由一组状态 S 和操作 A 组成。状态之间的转换使用转移概率 P、奖励 R 和贴现因子 gamma 执行。概率转换P(系统动…...
![](https://www.ngui.cc/images/no-images.jpg)
【C++随笔02】左值和右值
【C随笔02】左值和右值 一、左值和右值1、字面理解——左值、右值2、字面理解的问题3、左值、右值4、左值的特征5、 右值的特征6、x和x是左值还是右值7、复合例子8、通常字面量都是一个右值,除字符串字面量以外: 二、左值引用和右值引用三、左值引用1、常…...
![](https://img-blog.csdnimg.cn/c81e6990c8184d93a3126a62f31a1996.png)
几个nlp的小任务(多选问答)
@TOC 安装库 多选问答介绍 定义参数、导入加载函数 缓存数据集 随机选择一些数据展示 进行数据预处理部分(tokenizer) 调用t...
![](https://www.ngui.cc/images/no-images.jpg)
【C++学习记录】为什么需要异常处理,以及Try Catch的使用方法
1.什么是异常,什么是错误? 程序无法保证100%正确运行,万无一失。有的错误在编译时能发现,比如:关键字拼写、变量名未定义、括号不配对、语句末尾缺分号等。这是在编译阶段发现的,称为编译错误。 有的能正常…...
![](https://img-blog.csdnimg.cn/0aed3291b7ca4658b0b60e9f99355478.png)
孪生网络(Siamese Network)
基本概念 孪生网络(Siamese Network)是一类神经网络结构,它是由两个或更多个完全相同的网络组成的。孪生网络通常被用于解决基于相似度比较的任务,例如人脸识别、语音识别、目标跟踪等问题。 孪生网络的基本思想是将输入数据同时…...
![](https://img-blog.csdnimg.cn/3cd330db08544470a72b6cc8ae24fdd5.png)
【Redis】Redis是什么、能干什么、主要功能和工作原理的详细讲解
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…...
![](https://www.ngui.cc/images/no-images.jpg)
8月26日,每日信息差
1、上海发布两项支持高级别自动驾驶的5G网络标准,在上海市通管局的指导下,由上海移动和中国信息通信研究院牵头组织二十余家标准起草单位共同参与编写的《支持高级别自动驾驶的5G网络规划建设和验收要求》和《支持高级别自动驾驶的5G网络性能要求》等两项…...
![](https://www.ngui.cc/images/no-images.jpg)
云和恩墨面试(部分)
一面 软件架构设计方案应该包含哪些内容,哪些维度 二面 架构师如何保证软件产品质量线程屏障(或者说线程栅栏)是什么,为什么要使用线程屏障事务传播⾏为为NESTED时,当内部事务发生异常时,外部事务会回滚吗?newBing:…...
![](https://img-blog.csdnimg.cn/1f14771783064c08acc714fc8cba2bec.png)
volatile 关键字详解
目录 volatile volatile 关键用在什么场景下: volatile 关键字防止编译器优化: volatile 是一个在许多编程语言中(包括C和C)用作关键字的标识符。它用于告诉编译器不要对带有该关键字修饰的变量进行优化,以确保变量在…...
![](https://img-blog.csdnimg.cn/img_convert/dbc592825e46ac3b6acf0b969d0a0fc5.jpeg)
Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构
LVS 和 LVSkeepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVSOSPF。这个架构实际上是LVSKeepalived 的升级版本,我们所知道LVSKeepalived 架构是这样子的: 随着业务的扩展,我们可以对web服务器做水平扩展…...
![](/images/no-images.jpg)
类似于众人帮的做任务赚佣金网站/友情链接交换要注意哪些问题
要在 Java 中获取字符串的编码格式,您可以使用 Java 的 Charset 类。您可以通过以下方式获取字符串的编码: String str "your string"; Charset charset Charset.forName("UTF-8"); System.out.println(charset.displayName());其中…...
![](https://img-blog.csdnimg.cn/img_convert/59431808e531f97dec42d356394c7594.png)
wordpress悬浮导航栏/百度搜索排行榜前十名
EasyNVS是TSINGSEE青犀视频团队为了对EasyNVR进行统一管理而开发的视频综合管理平台,EasyNVS可以获取到EasyNVR的视频能力,不仅限于EasyNVR平台,国标GB28181协议平台EasyGBS也可以通过EasyNVS进行统一管理,极大方便了运维人员的日…...
![](/images/no-images.jpg)
开发微信小程序需要多少钱/汉中网站seo
list接口方法 List接口是Collection接口的子接口 List集合类中元素有序(即添加顺序和去除新婚徐一致)、且可重复 List集合中每个元素都有其对应的顺序索引,及支持索引 List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容…...
![](http://www.leiphone.com/wp-content/uploads/2011/11/apkudo_reports.jpg)
百度seo手机/搜索引擎优化指的是
测试Android应用的bug是一个非常繁重的工程。有许多只能在Titanium, Sencha 或者Eclipse这样的框架下测试。应用崩溃甚至某些时候开发者也不知道为啥在某个或者某几个机器上面就崩溃了,尤其是在Android这样一个智能机海的世界中更加要命。 Gorilla Logic的Apkudo 和…...
![](/images/no-images.jpg)
没有营业执照可以做网站吗/邵阳疫情最新消息
为什么不使用opacityCSS3 还允许通过opacity 声明来设置元素的透明度。该透明度的值也是一个介于0 到1 之间的小数(如将opacity 设置为0.1 表示为10%透明)。但是这种透明度与RGBA 及HSLA 有所不同,这种方式设置的透明度会对整个元素产生影响&…...
![](https://img-blog.csdnimg.cn/7ca32caec6034e92845a37e2a66d3e1c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4oie5aSn5piO55m9,size_20,color_FFFFFF,t_70,g_se,x_16)
wordpress输出菜单/产品优化是什么意思
extern “C”是c可以正确使用c中代码而产生的,虽然c兼容c,但是在c程序调用c的库时,也会产生链接错误。因为c的库中函数的修饰规则与c的函数修饰规则不同,这会导致,c程序跑不起来,因为在编译链接时就出了错误…...