《Redis开发与运维》读书笔记

1、 数据结构

字符串、哈希(hash)、列表(list)、集合(set)、有序集合

 

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

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。

第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间

第三,单线程避免了线程切换和竞态产生的消耗。

 

3、慢查询配置

       主要两个参数为slowlog-log-slower-than和slowlog-max-len,慢查询不包含命令网络传输和排队时间,有必要将慢查询定期存放。

 

4、持久化

       1)Redis提供了两种持久化方式:RDB和AOF。

2)RDB使用一次性生成内存快照的方式,产生的文件紧凑压缩比更高,因此读取RDB恢复速度更快。由于每次生成RDB开销较大,无法做到实时持久化,一般用于数据冷备和复制传输。

3)save命令会阻塞主线程不建议使用,bgsave命令通过fork操作创建子进程生成RDB避免阻塞。

4)AOF通过追加写命令到文件实现持久化,通过appendfsync参数可以控制实时/秒级持久化。因为需要不断追加写命令,所以AOF文件体积逐渐变大,需要定期执行重写操作来降低文件体积。

5)AOF重写可以通过auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数控制自动触发,也可以使用bgrewriteaof命令手动触发。

 

5、Redis阻塞

1)阻塞的内在原因:确认主线程是否存在阻塞,检查慢查询等信息,发现不合理使用API或数据结构的情况,如keys、sort、hgetall等。关注CPU使用率防止单核跑满。当硬盘IO资源紧张时,AOF追加也会阻塞主线程。

2)阻塞的外在原因:从CPU竞争、内存交换、网络问题等方面入手排查是否因为系统层面问题引起阻塞。

 

6、内存

       当Redis内存不足时,首先考虑的问题不是加机器做水平扩展,应该先尝试做内存优化,当遇到瓶颈时,再去考虑水平扩展。即使对于集群化方案,垂直层面优化也同样重要,避免不必要的资源浪费和集群化后的管理成本。

 

1)Redis实际内存消耗主要包括:键值对象、缓冲区内存、内存碎片。

2)通过调整maxmemory控制Redis最大可用内存。当内存使用超出时,根据maxmemory-policy控制内存回收策略。

3)内存是相对宝贵的资源,通过合理的优化可以有效地降低内存的使用量,内存优化的思路包括:

·精简键值对大小,键值字面量精简,使用高效二进制序列化工具。

·使用对象共享池优化小整数对象。

·数据优先使用整数,比字符串类型更节省空间。

·优化字符串使用,避免预分配造成的内存浪费。

·使用ziplist压缩编码优化hash、list等结构,注重效率和空间的平衡。

·使用intset编码优化整数集合。

·使用ziplist编码的hash结构降低小对象链规模。

 

7、缓存设计

1)缓存的更新策略

低一致性业务建议配置最大内存和淘汰策略的方式使用。

高一致性业务可以结合使用超时剔除和主动更新,这样即使主动更新

出了问题,也能保证数据过期时间后删除脏数据。

 

       2)缓存粒度控制

 

       3)穿透优化

       4)雪崩优化

a.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

b.可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存

c.不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

d.做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

 

8、最大内存及策略

 

 

 

 

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyyingsun/article/details/80346020
文章标签: Redis
个人分类: NoSQL
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭