《Redis官方文档》 FAQ-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:240回复:0

  《Redis官方文档》 FAQ

楼主#
更多 发布于:2016-06-02 20:26

为何Redis与其他的k-v存储比较不相同

有两个首要的原因

redis在键-值数据库中是一个不相同的发展方向,值能够包括更杂乱的数据类型,一起很多原子操作界说在这些数据类型上。redis的数据类型和根本数据结构密切相关,没有额外的笼统层,相同关于程序员也是直接可见的。

redis是一个在内存中可是能够持久化到磁盘上的数据库,所以它代表了一个不相同的权衡,高速读写被完结,可是对数据集有约束,那即是不能大于内存的巨细。在内存中的数据库还有另外的长处,内存中表明的杂乱数据结构比一些在磁盘中的数据结构更简单操作,所以redis能够做很多操作而内部并不杂乱。一起,两种磁盘存储格局(RDB和AOF)也不需求适合于随机存储。所以,数据是紧凑的,而且总是在结尾增加生成。

Redis的内存占用

下面给出一些例子:

一个空的实例~1MB

一百万个小的字符串key->value ~100MB

一百万个哈希key->value,表明一个有五个字段的对象 ~ 200MB

测验你的用例是很简单的。运用redis-benchmark东西生成随机数据,然后运用Info memory检查空间运用。

当存储一些相同的key的时分,64位体系将比32位体系运用更多的内存,除非key和value很小。这是因为在64位体系运用8个字节的指针。当然,64位体系的长处是你能够具有更多的内存,所以为了运转大型的redis效劳,一个64位体系或多或少是需求的。还有一种挑选是分片。

我喜爱redis的高档操作和特性,可是我不喜爱它在内存中做了一切的作业,而且我不能具有比内存更大的数据集。怎样方案改动这点?

在过去,redis开发者尝试用虚拟内存和其他体系,为了答应比内存更大的数据集的运用。可是终究咱们很愿意只做好一件事:内存用来数据效劳,磁盘用来数据存储。所以如今还没有方案来创立一个关于redis的磁盘上的后端。究竟,redis是它当时规划的直接成果。

你真实的疑问不是一共的内存需求,事实上你需求把你的数据切分到多个redis实例中。,请阅览Partitioning page获取更多信息。

Redis和一个磁盘上的数据库一起运用是个好主意吗?

是的,一个一般的规划模式是把写十分密布的小数据放在redis中,大的二进制数据块放在SQL数据库或在磁盘数据库中坚持终究共同。

我是不是能够做些作业来降低Redis的内存运用?

假如能够的话,运用32位的Redis

实例。相同,运用小的哈希、列表、有序集和整数集也是极好的,因为Redis能够在一些元素的特别状况下表明那些数据类型,以一种愈加紧凑的方法。更多的信息请参阅Memory

Optimization page。

假如Redis运转时内存不足会发生啥?

Redis要么被Linux

kill,一个过错致使溃散,要么就开端慢下来。现代操作体系的malloc()函数回来null是不多见的,一般效劳开端互换,redis的性能开端降级,所以你也许会注意到有一些过错的作业。

INFO指令能够 报告redis正在运用的内存巨细,所以你能够写个脚本经过检查一些临界条件来监视你的redis效劳。

Redis有一个保护措施答应运用者设置一个内存运用的最大限度,在配置文件里运用maxmemory选项来设置一个Redis能够运用的内存约束。假如约束到达,redis将回复写命令一个过错(可是依然能够持续承受只读命令),或许当你运用redis作为缓存的状况下,当最大内存约束到达的时分,你能够配置redis来丢掉某些key值。

能够参阅Redis as an LRU cache。

在Linux下后台存储失利且有一个fork()过错,尽管我有很多闲暇内存

简略的答复:echo 1 > /proc/sys/vm/overcommit_memory

下面开端更长的答案:

Redis在后台的存储机制依赖于操作体系中fork的copy-on-write:也即是redis

fork(创立一个子进程)是父进程的一个完好准确仿制。子进程转储到磁盘上的数据库然后退出。理论上来说,子进程作为一个副本应当运用和爸爸相同多的内存,可是实践上因为大多数现代操作体系的copy-on-write的完结,父进程和子进程将同享内存页。当他被父进程或许子进程改动的时分,一个内存页将被仿制。因而,从理论上讲,当子进程存储的时分,一切内存页也许被改动,Linux不能提早通知子进程多少内存被运用,所以假如overcommit_memory设置被设置为0,创立将会失利,除非有相同多的闲暇内存。成果是,假如你有3GB的redis数据而且只要2GB的闲暇内存,它将会失利。

把overcommit_memory设置为1来通知Linux以愈加达观的方法来履行fork操作,而且这确实是你想要的。

Redis的磁盘快照是原子的吗?

是的,redis的后台存储进程总是被fork当效劳没有履行履行的时分,所以内存中每个变成一个原子的指令从检查磁盘快照来说也是原子的。

Redis是单进程的,我怎样运用多CPU?

Redis中CPU变成你的瓶颈是十分不也许的,一般redis要么是内存要么即是网络绑定。例如,在一台一般的Linux体系上运用流水线redis每秒能够传输500k的恳求,所以假如你的应用首要运用O(N)

或 O(log(N))的指令,很难运用太多的 CPU。

可是,为了CPU运用率最大化,你能够在同一个机器上发动多个redis实例,并把它们当作不相同的效劳对待。在有些时刻,单个机器也许还不行,所以假如你想运用多个CPU你能够开端思考一些方法去更早的碎片化。

运用多个redis实例请参阅Partitioning page。

单个redis能持有的key的最大数量是多少?一个哈希表、列表、调集 、有序调集中元素的最大数量呢?

Redis能够处理2^32个key,在实践的测验中,单个实例最少处理2.5亿 个key。

每个哈希表、列表、调集、有序调集能持有 2^32个元素。

换句话说,你的约束也许即是你体系的可用内存。

我的从节点与主节点比较,有不相同数量的key。为何?

假如你运用有约束时刻的key,这是正常的状况。下面是发生了啥:

在从节点首次同步的时分,主节点生成一个RDB文件。

这个RDB文件不包括在主节点中现已过期的key。可是这些key依然在内存中。

可是这些key依然在主节点Redis的内存中,即使现已过期了。它们被思考为不存在,可是内存不久以后将被收回。可是这些key不是数据集的一部分,在INFO中和运用DBSIZE指令被广告。

当从节点读取主节点生成的RDB文件,这些key将不会被load。

作为成果,运用者有很多设置了有效期的key在从节点中看着少很多是很多见的,可是在实例中并没有啥实践的影响。

Redis的真实意思?

它的意思是REmote DIctionary Server。

为何要开端Redis项目?

开始,redis为了衡量LLOOGG。可是当我完结根本的效劳作业,我有了一个把它共享给其他人的主意,然后redis就变成了一个开源的项目。

优质IT资源分享社区为你提供此文。

本站有大量优质Java教程视频,资料等资源,包含java基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

java教程视频`

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客