Redis_百度百科


本站和网页 https://baike.baidu.com/item/Redis 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Redis_百度百科
百度首页
网页
新闻
贴吧
知道
网盘
图片
视频
地图
文库
百科
进入词条
全站搜索
帮助
清除历史记录关闭
近期有不法分子冒充百度百科官方人员,以删除词条为由威胁并敲诈相关企业。在此严正声明:百度百科是免费编辑平台,绝不存在收费代编服务,请勿上当受骗!详情>>
首页
历史上的今天
百科冷知识
图解百科
秒懂百科
懂啦
秒懂本尊答
秒懂大师说
秒懂看瓦特
秒懂五千年
秒懂全视界
特色百科
数字博物馆
非遗百科
恐龙百科
多肉百科
艺术百科
科学百科
用户
蝌蚪团
热词团
百科校园
分类达人
百科任务
百科商城
知识专题
权威合作
合作模式
常见问题
联系方式
下载百科APP
个人中心
Redis
播报
编辑
锁定
上传视频
特型编辑
远程字典服务
收藏
查看我的收藏
有用+1
已投票
本词条由“科普中国”科学百科词条编写与应用工作项目
审核
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
中文名
远程字典服务
外文名
Remote Dictionary Server
简 称
Redis
分 类
数据库
相 关
NoSql 数据存储
开发语言
ANSIC语言
特 点
速度快
目录
定义
作者
性能
支持语言
常用命令
数据模型
数据结构
存储
安装
10
版本发布
Redis定义
编辑
播报
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
[1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis作者
编辑
播报
redis
[2]
的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。
Redis性能
编辑
播报
下面是官方的bench-mark数据:
[1]
测试完成了50个并发执行100000个请求。设置和获取的值是一个256字节字符串。Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz。文本执行使用loopback接口(127.0.0.1)。结果:读的速度是110000次/s,写的速度是81000次/s 。
Redis支持语言
编辑
播报
许多语言都包含Redis支持,包括:
[1]
授权协议:BSD开源组织:无开发语言:C/C++ 查看源码 »地区:不详操作系统:Linux投 递 者:红薯软件类型:开源软件适用人群:未知所属分类:服务器软件、 缓存服务器收录时间:2009-04-14
Redis常用命令
编辑
播报
就DB来说,Redis成绩已经很惊人了,且不说memcachedb和Tokyo Cabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。不介绍mc里面已经有的内容,只列出特殊的:TYPE key — 用来获取某key的类型KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)RANDOMKEY - 返回随机的一个keyRENAME oldkeynewkey— key也可以改名列表操作,精华RPUSH key string — 将某个值加入到一个key列表末尾LPUSH key string — 将某个值加入到一个key列表头部LLEN key — 列表长度LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样LTRIM key start end — 只保留列表中某个范围的值LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度LSET key index value — 设置列表中某个位置的值LPOP keyRPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了集合操作SADD key member — 增加元素SREM key member — 删除元素SCARD key — 返回集合大小SISMEMBER key member — 判断某个值是否在集合中SINTER key1 key2 ... keyN — 获取多个集合的交集元素SMEMBERS key — 列出集合的所有元素还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0。
Redis数据模型
编辑
播报
Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型
[1]
不仅限于字符串,还支持如下抽象数据类型:字符串列表无序不重复的字符串集合有序不重复的字符串集合键、值都为字符串的哈希表
[1]
值的类型决定了值本身支持的操作。Redis支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。
Redis数据结构
编辑
播报
redis提供五种数据类型:string,hash,list,set及zset(sorted set)。string(字符串)string是最简单的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。redis采用结构sdshdr和sds封装了字符串,字符串相关的操作实现在源文件sds.h/sds.c中。数据结构定义如下:typedefchar*sds;
structsdshdr{
longlen;
longfree;
charbuf[];
};
list(双向链表)list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。对list的定义和实现在源文件adlist.h/adlist.c,相关的数据结构定义如下://list迭代器
typedefstructlistIter{
listNode*next;
intdirection;
}listIter;
//list数据结构
typedefstructlist{
listNode*head;
listNode*tail;
void*(*dup)(void*ptr);
void(*free)(void*ptr);
int(*match)(void*ptr,void*key);
unsignedintlen;
listIteriter;
}list;
dict(hash表)set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。在源文件dict.h/dict.c中实现了hashtable的操作,数据结构的定义如下://dict中的元素项
typedefstructdictEntry{
void*key;
void*val;
structdictEntry*next;
}dictEntry;
//dict相关配置函数
typedefstructdictType{
unsignedint(*hashFunction)(constvoid*key);
void*(*keyDup)(void*privdata,constvoid*key);
void*(*valDup)(void*privdata,constvoid*obj);
int(*keyCompare)(void*privdata,constvoid*key1,constvoid*key2);
void(*keyDestructor)(void*privdata,void*key);
void(*valDestructor)(void*privdata,void*obj);
}dictType;
//dict定义
typedefstructdict{
dictEntry**table;
dictType*type;
unsignedlongsize;
unsignedlongsizemask;
unsignedlongused;
void*privdata;
}dict;
//dict迭代器
typedefstructdictIterator{
dict*ht;
intindex;
dictEntry*entry,*nextEntry;
}dictIterator;
dict中table为dictEntry指针的数组,数组中每个成员为hash值相同元素的单向链表。set是在dict的基础上实现的,指定了key的比较函数为dictEncObjKeyCompare,若key相等则不再插入。zset(排序set)zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。typedefstructzskiplistNode{
structzskiplistNode**forward;
structzskiplistNode*backward;
doublescore;
robj*obj;
}zskiplistNode;
typedefstructzskiplist{
structzskiplistNode*header,*tail;
unsignedlonglength;
intlevel;
}zskiplist;
typedefstructzset{
dict*dict;
zskiplist*zsl;
}zset;
zset利用dict维护key -> value的映射关系,用zsl(zskiplist)保存value的有序关系。zsl实际是叉数不稳定的多叉树,每条链上的元素从根节点到叶子节点保持升序排序。
Redis存储
编辑
播报
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
Redis安装
编辑
播报
获取源码、解压、进入源码目录使用wget工具等下载:wget (百度不让用链接)tar xzf redis-1.2.6.tar.gzcd redis-1.2.6。编译生成可执行文件由于makefile文件已经写好,我们只需要直接在源码目录执行make命令进行编译即可:makemake-testsudo make installmake命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:redis-server:Redis服务器的daemon启动程序redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。建立Redis目录(非必须)这个过程不是必须的,只是为了将Redis相关的资源统一管理而进行的操作。执行以下命令建立相关目录并拷贝相关文件至目录中:sudo -smkdir -p /usr/local/redis/binmkdir -p /usr/local/redis/etcmkdir -p /usr/local/redis/varcp redis-server redis-cli redis-benchmark redis-stat /usr/local/redis/bin/cp redis.conf /usr/local/redis/etc/配置参数在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主要配置参数的意义:daemonize:是否以后台daemon方式运行pidfile:pid文件位置port:监听的端口号timeout:请求超时时间loglevel:log信息级别logfile:log文件位置databases:开启数据库的数量save * *:保存快照的频率,第一个*表示多长时间,第二个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。rdbcompression:是否使用压缩dbfilename:数据快照文件名(只是文件名,不包括目录)dir:数据快照的保存目录(这个是目录)appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)下面是一个略做修改后的配置文件内容:daemonizeyes
pidfile/usr/local/redis/var/redis.pid
port6379
timeout300
logleveldebug
logfile/usr/local/redis/var/redis.log
databases16
save9001
save30010
save6010000
rdbcompressionyes
dbfilenamedump.rdb
dir/usr/local/redis/var/
appendonlyno
appendfsyncalways
glueoutputbufyes
shareobjectsno
shareobjectspoolsize1024
将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下然后在命令行执行:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf即可在后台启动redis服务,这时你通过telnet127.0.0.16379即可连接到你的redis服务Redis常用内存优化手段与参数通过我们上面的一些实现上的分析可以看出redis实际上的内存管理成本非常高,即占用了过多的内存,作者对这点也非常清楚,所以提供了一系列的参数和手段来控制和节省内存,我们分别来讨论下。首先最重要的一点是不要开启Redis的VM选项,即虚拟内存功能,这个本来是作为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但是其内存管理成本也非常的高,并且我们后续会分析此种持久化策略并不成熟,所以要关闭VM功能,请检查你的redis.conf文件中 vm-enabled 为 no。其次最好设置下redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。另外Redis为不同数据类型分别提供了一组参数来控制内存使用,我们在前面详细分析过Redis Hash是value内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map, 即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项:hash-max-zipmap-entries 64hash-max-zipmap-value 512hash-max-zipmap-entries含义是当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,即value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。hash-max-zipmap-value 含义是当 value这个Map内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是不是设置的越大越好呢,答案当然是否定的,HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好这个值的设置,总体上还是最根本的时间成本和空间成本上的权衡。同样类似的参数list-max-ziplist-entries 512说明:list数据类型多少节点以下会采用去指针的紧凑存储格式。list-max-ziplist-value 64说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。set-max-intset-entries 512说明:set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。最后想说的是Redis内部实现没有对内存分配方面做过多的优化,在一定程度上会存在内存碎片,不过大多数情况下这个不会成为Redis的性能瓶颈,不过如果在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销,即在系统启动时先分配一个从1~n 那么多个数值对象放在一个池子中,如果存储的数据恰好是这个数值范围内的数据,则直接从池子里取出该对象,并且通过引用计数的方式来共享,这样在系统存储了大量数值下,也能一定程度上节省内存并且提高性能,这个参数值n的设置需要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值默认是10000,可以根据自己的需要进行修改,修改后重新编译就可以了。另外redis 的6种过期策略redis 中的默认的过期策略是volatile-lru 。设置方式config set maxmemory-policy volatile-lrumaxmemory-policy 六种方式volatile-lru:只对设置了过期时间的key进行LRU(默认值)allkeys-lru : 是从所有key里 删除 不经常使用的keyvolatile-random:随机删除即将过期keyallkeys-random:随机删除volatile-ttl : 删除即将过期的noeviction : 永不过期,返回错误maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项)
Redis版本发布
编辑
播报
2012年08月02日,Redis 2.4.16 小更新版本 NoSQL。
[3]
2012年08月31日 ,Redis 2.4.17 小更新版本 NoSQL。
[4]
2012年11月7日 Redis 2.6.3 发布,高性能K/V服务器2013年4月30日Redis 2.6.13 发布,高性能K/V服务器
[5]
2013年11月25日,Redis 2.8.1发布。
[6]
2015年2月,Redis3.0.0发布.
[7]
2016年12月2日,Redis 4.0.0-RC1发布。
[8]
2018年10月17日,Redis 5.0.0发布。2019年9月25日,Redis 5.0.6发布。2019年11月19日,Redis 5.0.7发布。2020年3月12日,Redis 5.0.8发布。2020年4月17日,Redis 5.0.9发布。Redis 7.0.1 是最新的稳定版本。
百度百科内容由网友共同编辑,如您发现自己的词条内容不准确或不完善,欢迎使用本人词条编辑服务(免费)参与修正。立即前往>>
词条图册
更多图册
参考资料
超高性能 key-value 数据库 Redis
.开源社区网[引用日期2012-09-08]
超强、超详细Redis数据库入门教程
.藏宝阁.2014-12-06[引用日期2014-12-23]
Redis 2.4.16 小更新版本 NoSQL
.开源社区网[引用日期2012-09-25]
Redis 2.4.17 小更新版本 NoSQL
.开源社区网[引用日期2012-09-25]
Redis 2.6.13 发布,高性能K/V服务器
.Linux公社[引用日期2013-06-19]
Redis 2.8 release notes
.git hub[引用日期2013-11-26]
Redis 3.0.0 RC3 发布,高性能 K/V 数据库
.Redis 3.0.0 RC3 发布[引用日期2015-02-11]
redis各个版本发布的新特性
.it技术博客.2019-08-17[引用日期2019-08-21]
图集
Redis的概述图(1张)
V百科往期回顾
权威合作编辑
“科普中国”科学百科词条编写与应用工作项目
“科普中国”是为我国科普信息化建设塑造的全...
什么是权威编辑
资源提供
中国电子学会
中国电子学会(Chinese Instit...
提供资源类型:内容
什么是资源合作
词条统计
浏览次数:次
编辑次数:68次历史版本
最近更新:
cppcsc
(2022-06-12)
定义
作者
性能
支持语言
常用命令
数据模型
数据结构
存储
安装
10
版本发布
为您推荐广告
新手上路
成长任务
编辑入门
编辑规则
本人编辑
我有疑问
内容质疑
在线客服
官方贴吧
意见反馈
投诉建议
举报不良信息
未通过词条申诉
投诉侵权信息
封禁查询与解封
©2022 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号
京公网安备11000002000001号
进入词条
清除历史记录关闭
播报
编辑
收藏
登录
扫码下载百科APP
领取50财富值奖励
分享到微信朋友圈
打开微信“扫一扫”即可将网页分享至朋友圈
选择朗读音色
00:00
00:00