2018-12-14

Redis 有哪些数据类型

String字符串:可以是字符串,整数或者浮点数,整数和浮点数可执行自增操作:incr key,整数自增可以用来实现全局唯一id的生成。String是最常用的一种类型,以key-value形式存在于内存中。

List列表:底层采用链表或者ziplist实现,里面的元素可重复。可以用来存储一些按时间顺序的消息显示.

Set集合:底层采用hashtable或者intset实现。不能有重复元素。可用来执行交集,并集,差集等。可用来实现获得共同好友等功能

Zset有序集合:底层采用ziplist或者skiplist来实现。集合内元素有序且无重复,由于集合内元素带有权重属性,可用来实现排行榜等功能。

Hash散列:底层采用ziplist或者hashtable实现。可以用来存储复杂对象。

详见:redis设计与实现读书笔记——底层数据结构

Redis 持久化机制

RDB:RDB持久化既可以手动执行也可以根据服务器配置选项定期执行,手动执行有两种命令:

BGSAVE:派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。

SAVE:阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求

自动间隔性保存配置,若提供以下配置:

Save 900 1

Save 300 10

Save 60 1000

只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:

服务器在900秒之内,至少执行了一次修改;服务器在300秒之内至少执行了10次修改,服务器在60秒之内至少进行了1000次修改。

原理:服务器状态的数据结构中保存了dirty(距离上一次成功执行SAVE或者BGSAVE命令后,服务器对数据库状态进行了几次更改),lastsave(记录上次成功执行SAVE或BGSAVE命令的时间),每100ms统计一次currenttime-lastsave和dirty大小,如果同时满足条件之一,则执行BGSAVE命令。

AOF:通过保存Redis服务器所执行的写命令来记录数据库状态。

服务器每次结束一个事件循环之前都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件中,其行为取决于appendfsync:

Always:将aof_buf缓冲区中的所有内容写入并同步AOF文件

No:将aof_buf缓冲区中的所有内容写入AOF文件,不进行同步操作,何时同步由操作系统来决定。

Everysec:将aof_buf缓冲区中的所有内容写入AOF文件,如果上次同步AOF文件的时间距离现在超过1s,则对其进行同步

Redis 为什么是单线程的

 Redis客户端对服务端的每次调用都经过了服务端接收客户端命令-执行命令-返回结果三个过程,redis的单线程指的是执行命令过程使用单个线程执行。多个客户端并发请求执行的命令会被放在队列里依次执行。因为CPU不是redis的瓶颈,由于redis命令基本都是纯内存操作,每个命令都执行的很快,单线程实现简单且避免了线程切换和竞态的消耗,所以选择了单线程实现。如果CPU成为redis瓶颈了,可以使用多开几个redis进程搭建集群。

使用缓存的合理性问题

缓存雪崩:redis服务器出现故障,所有请求到达数据库层,数据库崩溃。

缓存穿透:伪造请求恶意攻击缓存,即发送大量请求查找不存在于缓存种的数据,缓存被穿透就会访问数据库,会对数据库造成很大压力甚至崩溃。解决方案:将不存在的数据也缓存起来或者使用布隆过滤器过滤恶意请求。

缓存预热:redis服务器开机时,直接加载热点数据。

缓存更新:数据库被更新时,缓存需要被同步更新

缓存降级:为了防止redis服务器出现故障时,数据库跟着崩溃。如果无法通过redis获得请求数据,直接返回默认数据而不请求数据库。

热点数据才有必要被缓存

对每个键设置失效时间

经常修改的数据不应该被放入缓存

Redis常见的回收策略

Redis数据量达到设定的最大内存时,需要驱逐数据,有以下6种策略。

Noeviction:不删除策略,如果存达到使用上线,则报错

Allkeys-lru:对所有的key,使用lru算法回收最近最少使用的键。

Volatile-lru:对设置了过期时间的key,使用lru算法回收最近最少使用的键。

Allkeys-random:对所有key,随机回收部分key

Volatile-lru:对设置了过期时间的key,随机回收部分key

Volatile-ttl:对设置了过期时间的key,回收剩余存活时间最短的key

对于volatile-*策略,如果数据库种没有设置过期时间的key,则基本与noevinction策略相同。

Redis过期策略是怎么实现的呢

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存友好,对CPU不友好。通过无序链表维护时间事件,遍历链表寻找到期的时间事件,执行删除键操作

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;否则,返回该键。对cpu友好,对内存不友好。

定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。设置每次检查的数据库数量n和每个数据库检查的键数量k,数据库通过遍历方式访问,访问到当前数据库时,每次随机抽取一个键,如果过期则删除,共抽取k次,然后访问下一个数据库。若过程中达到了时间上限,则停止删除,下次再从停止的数据库开始。

Redis集群方案与实现

redis官方的redis-cluster:使用hash slot方式,将16348个hash slot 覆盖到所有节点上。对于存储的每个key值,使用CRC16(KEY)&16348=slot得到他对应的hash slot。在访问key时就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据。节点之间使用轻量协议通信,减少带宽占用,性能很高,自动实现负载均衡与高可用,自动实现failover  并且支持动态扩展。官方已经玩到可以1000个节点 实现的复杂度低。

由于redis选举机制,每个redis集群至少需要三个主节点;要保证集群的高可用,每个主节点都至少需要配备一个从节点。所以一共至少需要6个节点。

将一个节点加入集群:CLUSTER MEET <ip> <port>

将槽指派给节点负责:CLUSTER ADDSLOTS <slot> [slot…]

当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库属于哪个槽,并检查这个槽是否指派给了自己:如果键所在的槽刚好指派给当前节点,那么节点直接执行这个命令;否则,节点向客户端返回一个MOVED错误,指引客户端转向正确的节点,并再次发送之前想要执行的命令。

详见:redis设计与实现读书笔记——集群

Redis复制的过程

复制分为同步和命令传播两个操作:同步操作用于将从服务器的数据库状态更改至主服务器当前所处的数据库状态;命令传播操作则用于在主服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。

同步:客户端向从服务器发送SALVEOF命令要求从服务器复制主服务器时,从服务器首先需要执行同步操作。

从服务器向主服务器发送SYNC命令。

收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有命令。

当主服务的BGSAVE命令执行完毕时,主服务器会将BG命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。

主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库更新至主服务器当前的状态。

命令传播:主服务器将收到的写命令传播给从服务器。

---------------------

作者:CCCCC_SSSSS

来源:CSDN

原文:https://blog.csdn.net/CCCCC_SSSSS/article/details/82663836

版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明...
    不变甄心阅读 690评论 0 4
  • 前言 在上一篇文章中,介绍了Redis内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复...
    Java架构阅读 2,287评论 3 21
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,936评论 2 27
  • 1次人流造成3年不孕 放下思想包袱2个月喜得儿 结婚生子,是一生中最...
    风起兮灬云飞扬阅读 192评论 0 0
  • 响应式Web设计(简称RWD)是一种新的网站设计模式,以此构建的网站可自动适应不同的访问设备(从桌面电脑、平板电脑...
    肥崽儿阅读 435评论 0 0