• 展开微博窗口
  • QQ:826945906
  • 微信:u200714928
  • 展开分类目录
胡伟

redis读书笔记

1.当字符串长度小于1MB时,扩容都是加倍现有空间,如果字符串长度超过1MB,扩容时一次只会多扩容1MB。需要注意的是,字符串的最大长度是512MB
2.可以对多个字符串进行批量读写,节省网络耗时的开销
3.redis自增是有范围的,它的范围是signed long的最大值和最小值之间,超出则会报错
4.redis 分布式锁setnx存在超时不是原子操作的情况,在2.8版本之后,对set命令进行了扩展,使得setnx和expire可以一起执行
5.redis分布式锁不能解决超时问题,因为还存在着临界区逻辑代码未执行完锁就超时了的情况,所以,redis分布式锁不要用于较长时间的任务。还有个安全点的方案是,将
set命令的value参数设置为一个随机数,释放锁的时候先匹配随机数是否一致,然后再删除key。这样做是为了确保当前线程占有的锁不会被其他线程释放,除非这个锁
是因为过期了而被服务器自动释放。但是匹配value和删除key不是一个原子操作,这样可以使用lua脚本,因为lua能保证连续的多个指令原子性执行。
6.redis对于只有一组消费者的消息队列,可以轻松实现,但redis消息队列不是专业消息队列,没有很多的高级特性,没有ack保证,如果对消息的可靠性要求极高,就不适用了。
7.redis 阻塞对在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来,消息的延迟几乎为零。
8.上述阻塞方式有个问题就是客户端连接闲置过久,服务器一般会主动断开链接,减少资源占用,这个时候blpop,brpop就会抛出异常,所以客户端消费时得捕获异常,进行重试。
9.可以用set/get来设置和获取整个位图内容,也可以使用位图操作getbit/setbit等将byte数组看成位数组来处理。redis提供了位图统计指令bitcount,bitpos统计1的
个数,以及在指定范围查找首个1或0的位置。熟悉bitfield,getrange指令
10.HyperLogLog提供不精确的去重计数方案,标准误差是0.81%,pfadd,pfcount,pfmerge。这个结构在不采用稀疏矩阵时会需要占据12KB左右的空间,不适合统计单个用户相关的数据。
11.布隆过滤器可以看作不怎么精确的set,当布隆过滤器说某个值存在时它可能不存在,但它说某个值不存在时,它一定不存在(对于已经见过的元素肯定不会误判,对于未见过的可能误判) bf.add,bf.exists,bf.madd,bf.mexists
12.在集群环境中,单个key对应的数据量不宜超过1MB,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。所以建议Geo数据使用单独的Redis实例部署,不实用集群环境。
13.scan函数中,服务器不需要为游标保存状态,游标的唯一状态就是scan返回给客户端的游标整数。返回的结果可能会有重复,需要客户端去重。遍历时候,如果有数据修改,改动后的
数据能不能遍历到是不确定的。单次返回的结果是空并不意味着遍历结束,而要看返回的游标值是否为零。scan limit不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。scan遍历的顺序也非常特别,它不是从第一维数组的第0位一直遍历到末尾,而是采用了高位进位加法来遍历。
14.redis如何查大key?可以使用 –bigkeys命令,如果担心指令会导致阻塞,可以增加休眠参数 -i
15.redis使用了会有点费流量的文本协议,使用一个单线程对外提供服务,单个节点在跑满一个CPU的情况下,可以达到10w/s QPS
16.scan返回的是有个嵌套数组,数组的第一个值表示游标的值,如果这个值为零,则说明遍历完毕。如果不为零,使用这个值作为scan命令的参数进行下一次遍历,数组的第二个值是一个数组,是遍历到的key列表
17.redis在收到客户端修改指令后,会先进行参数校验、逻辑处理,如果没有问题,才将指令文本存储到aof日志,也就是说先执行指令,后将日志存盘。这点不同于leveldb,hbase存储引擎,它们是先存储日志,才做逻辑处理。
18.通常不在redis主节点做持久化操作,而在从节点中进行
19.redis的事务不具备原子性,而仅仅满足了事务的隔离性中的串行话,当前执行的事物不被其它事务打断。当事务遇到指令执行失败后,还会继续执行。
20.操作系统以页为单位管理内存,所以回收的时候,也不是有多少回收多少,要看所在的页里面的key是否都释放
21.当发生故障时能自动进行主从切换,程序可以不用重启。redis采用Sentinel(哨兵)机制,可以将Sentinel看作是一个zookeeper集群。客户端连接redis的时候,会先连接Sentinel,通过Sentinel来查询主从节点的地址,然后再连接主从节点进行数据交互。
22.redis采用异步复制,意味着,主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息就丢失了,如果主从延迟比较大,那么丢失的数据就可能会比较多。Sentinel无法保证消息完全不丢失,但是也能尽量保证消息少丢失,可以配置选项,闲置主从延迟过大,但是会损失可用性。
23.单个redis的内存不宜过大,内存过大会导致rdb文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也消耗很长时间加载数据到内存,其次,还体现在cpu的利用率上,单个redis实例只能利用单个核心,所以数据量大,cpu压力也会变大。
24.redis集群方案有开源的codis,也有官方的redis cluster系统
25.从节点不会进行过期扫描,从节点对过期的处理时被动的,主节点在key到期时,会在aof文件中增加一条del指令,同步到所有的从节点,从节点通过执行这条指令来对过期数据进行删除。
26.

码字很辛苦,转载请注明来自胡伟的博客《redis读书笔记》

评论