Redis,单线程,高速缓存系统!!!(个人总结)_JavaerMrQiu的博客-程序员ITS203_缓存项目线程那个快

技术标签: 数据库  redis  nosql  

Redis,单线程,高速缓存系统!!!(个人总结)

Redis相关知识

曾经面试中面试官问到过Redis相关的东西,由于当时是开发小白,对此了解的相对比较片面,后面的工作中,项目里用到Redis这一款集缓存和数据持久化的nosql数据库系统,现在对这项技术进行简单的总结,希望可以对自己有所提升,为广大开发者提供相关的帮助,本篇文章是本人凭个人记忆进行总结,如和其他开发者有雷同或者重叠的部分,请多多指教,文章如果有不到位的地方,还请各位大佬提出合理意见或建议!

什么是Redis?

Redis是一款高速,单线程,集缓存和数据持久化的nosql数据库,目前在数据库流行排行榜排名第八的一款缓存系统,从流行度上面我们可以看出Redis在市面上的受欢迎程度。Redis是由c语言编写的,所以,Redis的编译过程离不开gcc编译器。同时,Redis可支持事务,日志等功能。

Redis支持的数据类型

Redis支持五种数据类型:
1、String(字符串):string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
2、hash(哈希):Redis hash 是一个键值(key=>value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
3、List(列表):Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
4、Set(集合):Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
5、Sorted Set(zset,有序集合):Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis是单线程,为什么速度还那么快?

众所周知,Redis是单线程,但是执行速度却非常快,主要因为以下三方面的因素:
1、Redis大多数操作都是运行在内存上进行,完全基于内存,速度非常快。
2、Redis是单线程,可以有效的避免不必要的上下文切换和资源竞争关系。
3、Redis采用的是非阻塞IO,IO多路复用方式(epoll-IO方式)。
说到IO多路复用,不得不说多路复用的三种方式:select,poll,epoll,其中select,poll是线程不安全的,epoll是线程安全的。redis内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。
转自:https://blog.csdn.net/lch_2016/article/details/81078243

Redis的两种持久化方式

Redis有两种持久化方式:AOF和RDB。
RDB方式:

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
AOF方式:
在这里插入图片描述
两张图片可以清晰的展示出两种不同方式的持久化方式。

Redis的过期策略

Redis有6种过期策略:
1、volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
6、no-enviction(驱逐):禁止驱逐数据,新写入操作会报错。
开发的过程不只是死记硬背,而是结合实际开发过程中,不断地去理解和感悟,才能更加深刻的
对相关知识进行总结和掌握。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JavaerMrQiu/article/details/105614654

智能推荐

python安装各项插件教程(适用于大部分插件安装)_小peng友!的博客-程序员ITS203

说明:本文章是基于pycharm打开pycharm,其余的跟着我的图片来就可以啦!!安装好后,会提示你安装成功,这样就可以啦!!注意:如果你的加号是灰色的那就说明你还没有安装python环境,检查是否安装python环境方法如下:1.打开cmd输入python2.如果出现你安装的版本号,说明你已经安装好啦!如果出现跳转应用市场让你安装就说明你还没有安装哦~那就赶快去安装吧!...

python 关闭窗口事件_python - 如何处理Tkinter中的窗口关闭事件?_weixin_39884144的博客-程序员ITS203

Matt展示了关闭按钮的一个经典修改。另一种是使关闭按钮最小化窗口。您可以通过iconify方法重现此行为是协议方法的第二个参数。这是一个在Windows 7上测试的工作示例:# Python 3import tkinterimport tkinter.scrolledtext as scrolledtextclass GUI(object):def __init__(self):root = s...

Qt 主窗口点击按钮 弹出另一个自定义窗口_coldplayplay的博客-程序员ITS203_qmainwindow中运行别的窗口

1.问题重述这个其实是对C++类的理解程度有一定要求。 窗口1定义为类A,窗口2定义为类B,问题:如何点击窗口1中的按钮,打开窗口2.2.问题思考 把类理解成数据类型,把窗口理解成类的实例。 只要在类A的定义中添加类B的定义和对象,编写适当的槽函数处理这个对象即可.3.程序代码 (1)头文件#ifndef GLOBAL_H#define GLOBAL_H#include <QMainWin

python3中函数里的return和yield共存时的细节_北渔。的博客-程序员ITS203_return和yield 可以一块用吗

在python3中,生成器的创建方式有两种:利用列表生成式和函数中添加yield。在这需要注意的是,当采集函数创建生成器时,如果函数中含有return,则不会通过return得到任凭结果,return中止当前生成器,如果执行next()会报错。def f1(): for i in range(10): print(i) i +=1 ...

只会用Excel吗?这套全面的数据分析工具打包送你_銨靜菂等芐紶的博客-程序员ITS203_数据分析常用工具

转载自品略图书馆http://www.pinlue.com/article/2020/04/0210/5110100879443.html未来的大数据时代最赚钱的岗位或者技能是啥?有人说AI工程师,也有人说高级咨询师,还有人说网络安全工程师.....从百度,知乎看到的答案层出不穷,但80%的答案里都出现了一个相同的职业,那就是数据分析师。现在越来越多岗位都对数据分析能力有要求,...

随便推点

时间子系统三——低精度定时器和高精度定时器_liuhangtiant的博客-程序员ITS203_低精度和高精度有什么区别

先有低精度定时器,后来引入了高精度定时器。低精度定时器只能提供毫秒级别的定时时间,因为它实际上是依赖于jiffies的,一个jiffies的时间,就是其能够提供的最小定时时间,比如CONFIG_HZ配置为250,那么一个jiffies就是4ms,所以低精度定时器的精度就是4ms;而高精度定时器则不一样,它不依赖于jiffies,甚至jiffies是依赖于高精度定时器的,因为jiffies的累加实际...

Redis五种基本数据类型_颜颜颜颜颜越的博客-程序员ITS203_redis数据库五种数据类型

什么是Redisredis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。Redis常识Redis默认有16个数据库默认使用的是第0个数据库端口号 默认6379可以使用select 数字来切换数据库DBSIZE 查看DB大小keys * 查看数据库所有的keyflushdb 清空

php-Arrays 函数-array_pad-用值将数组填补到指定长度_zuodefeng的博客-程序员ITS203

array_pad() 用值将数组填补到指定长度【功能】         该函数将返回指定数组的一个复制,并用指定的值将其填补到指定的长度。         如果指定长度为正,则数组被填补到右侧,如果为负则从左侧开始填补。         如果指定长度的绝对值小于或等于原数组的长度,则没有任何填补         有可能一次最多填补1048576个数组元

Android 页面上滑置顶悬停实现 (CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+NestedScrollView)_深海呐的博客-程序员ITS203

我开始炒冷饭了啊,有人说这套组合已经被用烂了,有人说这玩意谁都会,其实没有人说哈,我就是怕被人说,提前预警哈.最近,工作比较忙,好久都没有写一下博客来说点什么.刚刚我去翻了一下项目,发现去年的上滑置顶页面可以给大家拿出来讲一下:上滑触发置顶后的样子:好,如果你也想要实现类似的效果,那么请你调整一下坐姿,开始进入正题.内个谁! 后排的童鞋帮忙把同桌喊一下,别睡了...(...

request.getContextPath();及request.getScheme()+"://"+request.getServerName()+":"+request.getServerPo_宝贝笑的博客-程序员ITS203

JSP中语句&amp;lt;% String path = request.getContextPath(); String basePath...的含义 &amp;lt;%String path = request.getContextPath();String basePath = request.getScheme()+&quot;://&quot;+request.getServerName()+&quot;:&quot;+requ...

oracle alert 监控,Nagios监控ORACLE ALERT日志脚本_weixin_39934613的博客-程序员ITS203

会点Nagios的知道怎么用吧#把nagios加入oinstall组#usermod -a -G oinstall nagios#! /bin/shdbversion=11bdump=/u01/app/oracle/oradata/PROD/dump/diag/rdbms/prod/PROD/trace/alert_PROD.logSTATE_OK=0STATE_WARNING=1STATE_CR...

推荐文章

热门文章

相关标签