Redis探险 -《Redis开发与运维》笔记,精华分享。

142 阅读6分钟
原文链接: mp.weixin.qq.com

最近看完了《Redis开发与运维》分享给大家。

全面讲解Redis基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后的原因, 包含大规模集群开发与管理的场景、应用案例与开发技巧,为高效开发运维提供了大量实际经验和建议。本书不要求读者有任何Redis使用经验,对入门与进阶DevOps的开发者提供有价值的帮助。 主要内容包括:Redis的安装配置、API、各种高效功能、客户端、持久化、复制、高可用、内存、哨兵、集群、缓存设计等,Redis高可用集群解决方案,Redis设计和使用中的问题,最后提供了一个开源工具:Redis监控运维云平台CacheCloud。

用心之作。唯一个人认为可以再优化的是,监控软件的安装,很多配置都默认写在一些文件,导致自定义安装目录时带来部分不变,,,但是依然不能妨碍书本身的精品。 大力推荐 ,不管是 redis 新手 老手,都能学到很多。

Redis相关书籍里面内容属于特别上乘的。书中有好多以前没有发现和注意的细节点,而且内容的连贯性,深度等各个点都写的非常的好,书中也会提及很多开发人员对redis认知的盲区,该书能更好的让你做好redis相关的工作,在授之以鱼之时也授之以渔。 最近也作为我强力推荐的一本redis好书在推荐给身边的朋友看。

初识Redis

单线程面向快速执行场景的内纯数据库

特性

  1. 数据结构:string字符串(位图bitmaps,hyperloglog),hash哈希表,list列表,set集合,zset有序集合

  2. 单线程模型

  3. 持久化方式:RDB,AOF

  4. 主从复制

5种数据类型

String

字符串类型是Redis最基础的数据结构。首先键都是字符串类型的, 而且其他几种数据结构都是在字符串的基础上构建的。 字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(JSON/XML等))、数字(整数、浮点数)、甚至是二进制、但是值最大不能超过512M。

List

类似 Java 中的 List ,按照插入顺序排序的字符串链表,在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除

Set Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。 因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

Sorted Set

和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。 另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。

Hash 在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。 简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值

全局命令

  • keys *:查看所有键

  • dbsize:键的总数

  • exists key:查看键是否存在

  • del key:删除键

  • expire key seconds:键过期

  • type key::查看键的数据类型

单线程架构

命令到达服务端后,按队列依次单线程执行

纯内存存储、 IO多路复用技术、单线程架构是造就 Redis高性能的三个因素。

epoll I/O多路复用提升IO性能

redis快的原因:

  1. 纯内存访问

  2. I/O多路复用:epoll

  3. 单线程避免线程竞争

keys全量遍历键可能导致redis阻塞,可以在从节点上执行,或者使用渐进式的scan代替(可能漏掉期间进行的更新)

应用场景

  • 缓存。

  • 排行榜系统。redis提供了列表和有序集合支持。

  • 计数器应用。

  • 社交网络。

  • 消息队列系统。redis提供了订阅发布和阻塞队列功能,虽然和专业的消息队列软件比不够强大,但是可以满足一般的消息队列需求

Pipeline概念

edis客户端执行一条命令分为如下四个过程:

1)发送命令

2)命令排队

3)命令执行

4)返回结果其中

1到4称为 Round Trip Time( RTT,往返时间)。

Pipeline(流水线)机制能将一组 Redis命令进行组装,通过一次 RTT传输给 Redis,再将这组 Redis命令的执行结果按顺序返回给客户端。

Redis命令真正执行的时间通常在微秒级别,所以才会有 Redis性能瓶颈是网络这样的说法。

持久

  1. RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。

  2. AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。 写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。