第一章.初识Redis

        

目录

一.盛赞 Redis

二.Redis 特性

三.Redis使用场景

Redis可以做什么:

Redis不可以做什么:

四.Redis版本号了解

五.安装并启动Redis

六.Redis重要文件及作用

七.Redis 命令⾏客⼾端

 八.总结


        本章将带领读者进⼊ Redis 的世界,了解它的前世今⽣、众多特性、典型应⽤场景、安装配置、如何⽤好等,最后会对 Redis 发展过程中的重要版本进⾏说明,本章主要内容如下:

  • 盛赞 Redis
  • Redis 特性
  • Redis 使⽤场景
  • ⽤好 Redis 的建议
  • 正确安装启动 Redis
  • Redis 重⼤版本

一.盛赞 Redis

        Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis可以满⾜很多的应⽤场景,⽽且因为 Redis 会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。不仅如此,Redis 还可以将内存的数据利⽤快照和⽇志的形式保存到硬盘上,这样在发⽣类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis 还提供了键过期、发布订阅、事务、流⽔线、Lua 脚本等附加功能。总之,如果在合适的场景使⽤号 Redis,它就会像⼀把瑞⼠军⼑⼀样所向披靡。

        2008 年,Redis 的作者 Salvatore Sanfilippo 在开发⼀个叫 LLOOGG 的⽹站时,需要实现⼀个⾼性能的队列功能,最开始是使⽤ MySQL 来实现的,但后来发现⽆论怎么优化 SQL 语句等都不能使⽹站的性能提⾼上去,再加上⾃⼰囊中羞涩,于是他决定⾃⼰做⼀个专属于 LLOOGG 的数据库,这个就是 Redis 的前⾝。后来,Salvatore Sanfilippo 将 Redis 1.0 的源码发布到 Github 上,可能连他⾃⼰都没想到,Redis 后来如此受欢迎。

        假如现在有⼈问 Redis 的作者都有谁在使⽤ Redis,我想他可以开句玩笑的回答:还有谁不使⽤ Redis,当然这只是开玩笑,但是从 Redis 的官⽅公司统计来看,有很多重量级的公司都在使⽤ Redis,如国外的 Twitter、Instagram、Stack Overflow、Github 等,国内就更多了,如果单单从体量来统计,新浪微博可以说是全球最⼤的 Redis 使⽤者,除了新浪微博,还有像阿⾥巴巴、腾讯、搜狐、优酷⼟⾖、美团、⼩⽶、唯品会等公司都是 Redis 的使⽤者。除此之外,许多开源技术像 ELK 等已经把 Redis 作为它们组件中的重要⼀环,⽽且 Redis 还提供了模块系统让第三⽅⼈员实现功能扩展,让 Redis 发挥出更⼤的威⼒。所以,可以这么说,熟练使⽤和运维 Redis 已经成为开发运维⼈员的⼀个必备技能。

二.Redis 特性

        Redis 之所以受到如此多公司的⻘睐,必然有之过⼈之处,下⾯是关于 Redis 的 8 个重要特性。

1. 速度快

        正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当 然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以⼤概归纳为以下四点:

  • Redis 的所有数据都是存放在内存中的,表 1-1 是⾕歌公司 2009 年给出的各层级硬件执⾏速度,所以把数据放在内存中是 Redis 速度快的最主要原因。
  • Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快。
  • Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。
  • Redis 在 6.0 版本引⼊了多线程机制,但主要也是在处理⽹络和 IO,不涉及到数据命令,即命令的执⾏仍然采⽤了单线程模式。
  • 作者对于 Redis 源代码可以说是精打细磨,曾经有⼈评价 Redis 是少有的集性能和优雅于⼀⾝的开源代码。

表 1-1 ⾕歌公司给出的各层级硬件执⾏速度

层级速度
L1 cache reference(一级缓存引用)0.5 ns
Branch mispredict(分支预测错误)5 ns
L2 cache reference(二级缓存引用)7 ns
Mutex lock/unlock(互斥锁 锁/解锁)25 ns
Main memory reference(主内存引用)100 ns
Compress 1 K bytes with Zippy(使用 Zippy 压缩 1K 字节)3 000 ns
Send 2 K bytes over 1 Gbps network(通过 1Gbps 网络发送 2K 字节数据)20 000 ns
Read 1 MB sequentially from Memory(从内存中顺序读取 1MB)
250 000 ns
Round trip within same datacenter(同一数据中心内的往返行程)
500 000 ns
Disk seek(磁盘寻道)
10 000 000 ns
Read 1 MB sequentially from disk(从磁盘顺序读取1MB数据)
20 000 000 ns
Send packet CA -> Netherlands -> CA(发送数据包 加拿大 -> 荷兰 -> 加拿大)
150 000 000 ns

  

        如果想对上述表中的内容做一个了解,可以直接截图去问ai。

2. 基于键值对的数据结构服务器

        ⼏乎所有的编程语⾔都提供了类似字典的功能,例如 C++ ⾥的 map、Java ⾥的 map、Python ⾥的 dict 等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结构“,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2. 版本种加⼊有关 GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。

3. 丰富的功能

除了 5 种数据结构,Redis 还提供了许多额外的功能:

提供了键过期功能,可以⽤来实现缓存。
  • 提供了发布订阅功能,可以⽤来实现消息系统;
  • ⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令;
  • 提供了简单的事务功能,能在⼀定程度上保证事务特性;
  • 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开销。

4. 简单稳定

        Redis 的简单主要表现在三个⽅⾯。⾸先,Redis 的源码很少,早期版本的代码只有 2 万⾏左右,3.0 版本以后由于添加了集群特性,代码增⾄ 5 万⾏左右,相对于很多 NoSQL 数据库来说代码量相对要少很多,也就意味着普通的开发和运维⼈员完全可以 “吃透” 它。其次,Redis 使⽤单线程模型,这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了事件处理的相关功能。

        但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG ⽽导致宕掉的情况。

5. 客⼾端语⾔多

        Redis 提供了简单的 TCP 通信协议,很多编程语⾔可以很⽅便地接⼊到 Redis,并且由于 Redis 受到社区和各⼤公司的⼴泛认可,所以⽀持 Redis 的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语⾔,例如 C、C++、Java、PHP、Python、NodeJS 等,后续我们会对 Redis 的客⼾端使⽤做详细说明。

6. 持久化(Persistence)

        通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中(如图 1-1 所⽰),这样就保证了数据的可持久性,后续我们将对 Redis 的持久化进⾏详细说明。

图 1-1 Redis 内存到硬盘的持久化

 7. 主从复制(Replication)

        Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica)(如图 1- 2 所⽰),复制功能是分布式 Redis 的基础。后续我们会对 Redis 的复制功能进⾏详细演⽰。

图 1-2 Redis 主从复制架构

8. ⾼可⽤(High Availability)和分布式(Distributed)

        Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故障⾃动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。

三.Redis使用场景

        上节我们已经了解了 Redis 的若⼲个特性,本节来看⼀下 Redis 的典型应⽤场景有哪些?

Redis可以做什么:

        要充分理解 Redis 的作⽤,需要读者对⽹站的架构有⼀定的基础理解,考虑到部分读者缺少这⽅⾯的背景知识,建议先移步为⼤家准备的 《服务端⾼并发分布式结构演进之路》篇对该领域的基础知识做⼀定学习后,再度继续本篇的学习。

1. 缓存(Cache)

        缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能够有效地降低后端数据源的压⼒。Redis 提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。

2. 排⾏榜系统

        排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照各种复杂维度计算出的排⾏榜,Redis 提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很⽅便地构建各种排⾏榜系统。

3. 计数器应⽤

        计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的实时性,每⼀次播放和浏览都要做加 1 的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑 战。Redis 天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。

4. 社交⽹络

        赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对⽐较容易地实现这些功能。

5. 消息队列系统

        消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列⽐还不够⾜够强⼤,但是对于⼀般的消息队列功能基本可以满⾜。

Redis不可以做什么:

        实际上和任何⼀⻔技术⼀样,每个技术都有⾃⼰的应⽤场景和边界,也就是说 Redis 并不是万⾦油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的⻆度来进⾏分析。

        站在数据规模的⻆度看,数据可以分为⼤规模数据和⼩规模数据,我们知道 Redis 的数据是存放在内存中的,虽然现在内存已经⾜够便宜,但是如果数据量⾮常⼤,例如每天有⼏亿的⽤⼾⾏为数 据,使⽤ Redis 来存储的话,基本上是个⽆底洞,经济成本相当⾼。

        站在数据冷热的⻆度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据,例如对于视频⽹站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,⽽⽤⼾的观看记录不⼀定是经常需要访问的数据,这⾥暂且不讨论两者数据规模的差异,单纯站在数据冷热的⻆度上看,视频信息属于热数据,⽤⼾观看记录属于冷数据。如果将这些冷数据放在 Redis 上,基本上是对于内存的⼀种浪费,但是对于⼀些热数据可以放在 Redis 中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。

        所以,Redis 并不是万⾦油,相信随着我们对 Redis 的逐步学习,能够清楚 Redis 真正的使⽤场景。

四.Redis版本号了解

        Redis 借鉴了 Linux 操作系统对于版本号的命名规则:版本号第⼆位如果是奇数,则为⾮稳定版本(例如 2.7、2.9、3.1),如果是偶数,则为稳定版本(例如 2.6、2.8、3.0、3.2)。当前奇数版本就是下⼀个稳定版本的开发版本,例如 2.9 版本是 3.0 版本的开发版本。所以我们⽣产环境通常选取偶数版本的 Redis,如果对于某些新的特性想提前了解和使⽤,可以选择最新的奇数版本。

五.安装并启动Redis

        我们⼤致了解了 Redis 的⼏个重⼤版本,我们在本篇文章中选择 5.0 版本,原因是 5.0 已经⽀持了⼤部分的功能特性,⽽且相⽐较于 7.0 版本,更容易进⾏安装使⽤。

tip:Redis 的官⽅并不⽀持微软的 Windows 操作系统,因为 Redis 的许多特性都是和操作系统相关的,所以⽀持 Windows 会增加维护成本,⽽且更重要的是⼤部分公司都在使⽤ Linux 操作系统,⽽ Redis 在 Linux 操作系统上的表现已经得到实践的证明。当然 Redis 作为⼀款优秀的开源技术,还是吸引到微软公司的注意,微软公司的开源技术组在 Github 上维护了⼀个Redis 分⽀:https://github.com/MSOpenTech/redis。不过我们还是强烈建议⼤家在 Linux上使⽤ Redis。

接下来,我们选择在 Linux 的ubuntu上安装 Redis。

使用apt安装

apt install redis -y

需要支持远程连接则修改配置文件:/etc/redis/redis.conf

  • 修改 bind 127.0.0.1 bind 0.0.0.0
  • 修改 protected-mode yes protected-mode no

控制Redis启动:

启动Redis服务:

service redis-server start

停止Redis服务:

service redis-server stop

重启 Redis 服务:

service redis-server restart

六.Redis重要文件及作用

启动/停⽌命令或脚本

/usr/bin/redis-benchmark
/usr/bin/redis-check-aof -> /usr/bin/redis-server
/usr/bin/redis-check-rdb -> /usr/bin/redis-server
/usr/bin/redis-cli
/usr/bin/redis-sentinel -> /usr/bin/redis-server
/usr/bin/redis-server
/usr/libexec/redis-shutdown

        redis-server 是 Redis 服务器程序,其余的⼏个例如:redis-check-aof、redis-check-rdb、redis-sentinel 也都是 redis-server 的软链接。redis-check-aof 是修复 AOF ⽂件⽤的⼯具,同理 redis-check-rdb 是修复 RDB ⽂件的⼯具,redis-sentinel 是 Redis 哨兵程序。

redis-cli 是在我们学习阶段需要频繁⽤到的⼀个命令⾏客⼾端程序,随后做介绍。

redis-benchmark ⽤于对 Redis 做性能基准测试的⼯具。

redis-shutdown 是⽤于停⽌ Redis 的专⽤脚本。

        相⽐较直接使⽤这些命令,我们更建议使⽤systemd 托管的⽅式来进⾏Redis 的启动 / 停⽌。

配置文件

/etc/redis-sentinel.conf
/etc/redis.conf

        /etc/redis.conf 是 Redis 服务器的配置⽂件。/etc/redis-sentinel.conf 是 Redis Sentinel 的配置文件。

持久化⽂件存储⽬录

/var/lib/redis/

        Redis 持久化⽣产的 RDB 和 AOF ⽂件都默认⽣成于该⽬录下。后边章节我们讲到持久化时会观察这边持久化的⼀些现象。

⽇志⽂件⽬录

/var/log/redis/

        /var/log/redis/ ⽬录下会保存 Redis 运⾏期间⽣产的⽇志⽂件,默认按照天进⾏分割,并且会将⼀定⽇期的⽇⼦⽂件使⽤ gzip 格式压缩保存。可以使⽤任意⽂本编辑器打开,后边章节我们会通过⽇志来观察⼀些现象。

七.Redis 命令⾏客⼾端

        现在我们已经启动了 Redis 服务,下⾯将介绍如何使⽤ redis-cli 连接、操作 Redis 服务。客⼾端和服务端的交互过程如图 1-3 所⽰。

        redis-cli 可以使⽤两种⽅式连接 Redis 服务器。

第⼀种是交互式⽅式:通过 redis-cli -h { host } -p { port } 的⽅式连接到 Redis 服务,后续所有的操作都是通过交互式的⽅式实现,不需要再执⾏ redis-cli 了,例如:

第⼆种是命令⽅式:⽤redis-cli -h { host } -p { port } { command } 就可以直接得到命令的返回结果,例如:

        这⾥有两点要注意:(1)由于我们连接的 Redis 服务位于 127.0.0.1,端⼝也使⽤的是默认的 6379端⼝,所以可以省略 -h { host } -p { port }。(2)Redis-cli 是学习 Redis 的重要⼯具,后续的⼤量章节都是⽤它来做讲解。

        有关 redis-cli 提供的更为强⼤的功能将在后续章节做详细介绍。

图 1-3 Redis 客⼾端与服务端的交互过程

 八.总结

  1. Redis 的 8 个特性:速度快、基于键值对的数据结果服务器、功能丰富、简单稳定、客⼾端语⾔ 多、持久化、主从复制、⽀持⾼可⽤和分布式。
  2. Redis 并不是万⾦油,有些场景不适合使⽤ Redis 进⾏开发。
  3. 开发运维结合以及阅读源码是⽤好 Redis 的重要⽅法。
  4. 安装启动 Redis。
  5. 根据需求选择稳定版本的 Redis。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值