Redis原理是什么?
摘要:Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
与My
本文使用第一人称来介绍Redis
一、概述
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
提及我的诞生,我与关系数据库MySQL之间有着不解之缘。在我尚未降临这个世界之前,MySQL历经艰辛,伴随着互联网的飞速发展,它所承载的数据量日益庞大,用户请求也如潮水般汹涌而至。每一次的用户请求,都化作了对它无尽的读写挑战,使得MySQL备受煎熬。特别是在“双11”、“618”这样的全民购物狂欢节,对MySQL而言,无疑是难熬的考验时刻。
后来,MySQL向我透露了一个秘密。它告诉我,其实大多数的用户请求都是读取操作,而且往往都是对同一数据的反复查询,这导致它不得不花费大量时间进行磁盘I/O操作,这无疑是一种巨大的资源浪费。
有人开始深思,是否可以借鉴CPU的工作原理,为数据库也添加一个缓存机制呢?于是,我便应运而生,踏上了这个世界的舞台。
自诞生之初,我便与MySQL结下了深厚的友谊。我们携手并肩,共同出现在后端服务器的舞台上。每当应用程序需要从MySQL查询数据时,它们会首先在我这里进行登记。当再次需要这些数据时,它们会首先向我发出请求。如果我这里有它们所需的数据,它们便无需再劳烦MySQL;若我这里没有,它们才会转向MySQL寻求帮助。
如此,我便成为了MySQL的得力助手,与它共同应对着日益增长的数据挑战。我们携手前行,共同书写着数据库世界的辉煌篇章。
二、支持的数据结构
大多数小伙伴都知道,为了方便使用,我支持以下这五种基本类型:
String(字符串)
Hash(哈希)
List(列表)
Set(集合)
zset(有序集合)
string
字符串最基础的数据结构。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字 (整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
字符串主要有以下几个典型使用场景:
缓存功能
计数
共享Session
限速
hash
哈希类型是指键值本身又是一个键值对结构。
哈希主要有以下典型应用场景:
缓存用户信息
缓存对象
list
列表(list)类型是用来存储多个有序的字符串。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色
列表主要有以下几种使用场景:
消息队列
文章列表
set
集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的。
集合主要有如下使用场景:
标签(tag)
共同关注
sorted set
有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个权重(score)作为排序的依据。
有序集合主要应用场景:
用户点赞统计
用户排序
我还有三种特殊的数据结构类型
Geospatial
Hyperloglog
Bitmap
因为我把登记的数据都记录在内存中,不用去执行慢如蜗牛的I/O操作,所以找我要比找MySQL要省去了不少的时间呢。
可别小瞧这简单的一个改变,我可为MySQL减轻了不小的负担!随着程序的运行,我缓存的数据越来越多,有相当部分时间我都给它挡住了用户请求,这一下它可乐得清闲自在了!
有了我的加入,网络服务的性能提升了不少,这都归功于我为数据库挡下了不少的事儿。
三、缓存过期 && 缓存淘汰
不过很快我发现事情不妙了,我缓存的数据都是在内存中,可是就算是在服务器上,内存的空间资源还是很有限的,不能无节制的这么存下去,我得想个办法,不然吃枣药丸。
不久,我想到了一个办法:给缓存内容设置一个超时时间,具体设置多长交给应用程序们去设置,我要做的就是把过期了的内容从我里面删除掉,及时腾出空间就行了。
超时时间有了,我该在什么时候去干这个清理的活呢?
最简单的就是定期删除,我决定100ms就做一次,一秒钟就是10次!
我清理的时候也不能一口气把所有过期的都给删除掉,我这里面存了大量的数据,要全面扫一遍的话那不知道要花多久时间,会严重影响我接待新的客户请求的!
时间紧任务重,我只好随机选择一部分来清理,能缓解内存压力就行了。
