redis设计与实现

一.哨兵(sentinel)

1.sentinel可以监控其他sentinel【和sentinel监视同样master的哨兵】,主服务器(master),从服务器 (slave0,slave1...)

2.检测是否下线,sentinel会用每秒一次的频率向它所监控的其他sentinel,主服务器(master),从服务器 (slave0,slave1...)发送ping命令

有效回复:实例返回+PONG、-LOADING、-MASTERDOWN  

无效回复:除+PONG、-LOADING、-MASTERDOWN外都是无效回复

如果一个实例在指定时间down-after-millisconds时间内向sentinel都返回的是无效回复,那么就认为实例主观下线了;sentinel会再去询问同样观测主从服务器的其他sentinel,如果超过一定个数的其他sentinel也认为这个实例下线了,那么这个实例就是客观下线,sentinel就会进行针对主服务器进行故障转移操作。

3.对于监视同一个主服务器和从服务器的多个sentinel来说,它们会以每两秒一次的频率,通过向被监视服务器的_sentinel_:hello频道发送消息来告诉其他sentinel自己的存在

 

二.redis集群:

集群的整个数据库被分为16384个槽(slot)

 

三.事务隔离性

事务隔离性指的是,及时数据库中有多个事务并发地执行,各个事务之间也不会互相影响。

因为redis使用单线程的方式执行事务(以及事务队列中的命令),并且服务器保证执行事务期间不会对事物进行中断。因此,redis

redis的事务总是以串行的方式运行的,并且事务也总是具有隔离性

 

四.

a.对key对应的value排序

sort

 

五.过期键的删除策略:

a.定时删除:订一定时间,到了一定时间后删除

优点:对内存友好,可以节省内存

缺点:但是如果需删除的键过多的话,会影响正常业务对cpu的影响

b.惰性删除:只有在查询时会看key是否过期,过期的话再删掉,没有查询时这个key还是存在的

优点:对cpu友好

缺点:占用内存,导致内存浪费

c.定期删除:定期是定时和惰性的一种综合,但如果过期时间和删除key的个数设置不合适的话会影响cpu和内存使用

 

六.

1.redis端口6379是merz【愚蠢】的键盘对应数字的组合

2.redis的五种基本数据类型:

a.String(字符串):一个字符串自大长度是512M

b.list(列表):

redis的list相当于java中的LinkedList,是链表不是数组,插入,删除很快,查询很慢。

右边进左边出:队列(先进先出)

> rpush books python java golang

(integer) 3

> llen books

(integer) 3

> lpop books

"python"

> lpop books

"java"

> lpop books

"golang"

> lpop books

(nil)

右边进右边出:栈(先进后出)

> rpush books python java golang

(integer) 3 > rpop books "golang"

> rpop books

"java"

> rpop books

"python"

> rpop books

c.set(集合):

相当于java中的hashSet,无序,无重复

d.hash(字典):

内部实现结构和java中的hashMap一致,数组+链表的二维结构

注:Hincrby 命令用于为哈希表中的字段值加上指定增量值。

e.zset(有序集合)

1.ZRANGE key start stop [WITHSCORES] : 获取出来的是从小到大排序的

2.ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:获取的是从大到小排序的

 

七.分布式锁

实现分布式锁的两种方法:

1.> set lock:codehole true ex 5 nx

OK ... do something critical ...

> del lock:codehole

上面这个指令就是 setnx 和 expire 组合在一起的原子指令

2.使用lua脚本

注:Redis 的分布式锁不能解决超时问题,如果在加锁和释放锁之间的逻辑执行的太长,以至 于超出了锁的超时限制,就会出现问题。因为这时候锁过期了,第二个线程重新持有了这把锁, 但是紧接着第一个线程执行完了业务逻辑,就把锁给释放了,第三个线程就会在第二个线程逻 辑执行完之间拿到了锁。 为了避免这个问题,Redis 分布式锁不要用于较长时间的任务。如果真的偶尔出现了,数 据出现的小波错乱可能需要人工介入解决

八.延时队列

1.blpop/brpop

缺点:如果线程一直阻塞在哪里,Redis 的客户端连接就成了闲置连接,闲置过久,服务器一般 会主动断开连接,减少闲置资源占用。这个时候 blpop/brpop 会抛出异常来。 所以编写客户端消费者的时候要小心,注意捕获异常,还要重试。

2.使用zset ,zrangebyscore 和 zrem,lua【保证任务的原子性操作】实现redis延时队列

九.HyperLogLog提供不精确的去重计数方案

HyperLogLog 提供了两个指令 pfadd 和 pfcount,根据字面意义很好理解,一个是增加 计数,一个是获取计数

注:标准误差是 0.81%,这样的精确度已经可以满足 UV 统计需求了,因为一般这点误差的数量,对于统计网站用户访问量,一般老板对这点误差的用户访问统计是可以忽略的,如果要统计几乎无误差的,HyperLogLog就不推荐使用;HyperLogLog中是没有判断是否包含这个key的方法的

UV:https://www.zhihu.com/question/20448467

缺点:HyperLogLog 这个数据结构不是免费的,不是说使用这个数据结构要花钱,它需要占据 一定 12k 的存储空间,所以它不适合统计单个用户相关的数据。如果你的用户上亿,可以算 算,这个空间成本是非常惊人的。但是相比 set 存储方案,HyperLogLog 所使用的空间那真 是可以使用千斤对比四两来形容了

九.布隆过滤器

布隆过滤器有二个基本指令,bf.add 添加元素,bf.exists 查询元素是否存在

注:存在一定误判率

布隆过滤器的 initial_size 估计的过大,会浪费存储空间,估计的过小,就会影响准确 率,用户在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避 免实际元素可能会意外高出估计值很多。 布隆过滤器的 error_rate 越小,需要的存储空间就越大,对于不需要过于精确的场合, error_rate 设置稍大一点也无伤大雅。比如在新闻去重上而言,误判率高一点只会让小部分文 章不能让合适的人看到,文章的整体阅读量不会因为这点误判率就带来巨大的改变

十.

1.redis是个单线程程序

2.Redis 单线程为什么还能这么快?

所有数据都是存储在内存中的,所有运算都是内存级别的运算

3.Redis 单线程如何处理那么多的并发客户端连接?

 

十一.Redis 的持久化机制

Redis 的持久化机制有两种:

第一种是快照,第二种是 AOF 日志

注:Redis 的主节点是不会进行持久化操作,持久化操作主要在从节点进行。从节 点是备份节点,没有来自客户端请求的压力,它的操作系统资源往往比较充沛。

 

十二.管道

十三.主从同步

注:主从同步,同步的是指令不是数据,从服务器执行同步过来的指令就达到数据同步的效果

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值