目录
一、初识Redis
1.1 Redis特性
1.2 Redis 使⽤场景
1.2.1 Redis可以做什么
1.2.2 Redis 不可以做什么
1.3 安装并启动Redis
1.3.1 在Ubuntu上面安装Redis
1.3.2 控制 Redis 启动
1.3.3 Redis重要文件及其作用
1.4 Redis 命令行客户端
一、初识Redis
本篇文章带你们走进redis的世界,了解它的前世今生,众多特性,应用场景、安装配置、如何用。
1.1 Redis特性
速度快。
正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当
然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以⼤概归纳为以下四点:
- Redis 的所有数据都是存放在内存中的,所以把数据放在内存中是 Redis 速度快的最主要原因。
- Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快。
- Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。
基于键值对的数据结构服务器
⼏乎所有的编程语⾔都提供了类似字典的功能,例如 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(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。
丰富的功能
除了 5 种数据结构,Redis 还提供了许多额外的功能:
- 提供了键过期功能,可以⽤来实现缓存。
- 提供了发布订阅功能,可以⽤来实现消息系统。
- ⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令。
- 提供了简单的事务功能,能在⼀定程度上保证事务特性。
- 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开销。
简单稳定
Redis 的简单主要表现在三个⽅⾯。⾸先,Redis 的源码很少,早期版本的代码只有 2 万⾏左右,
3.0 版本以后由于添加了集群特性,代码增⾄ 5 万⾏左右,相对于很多 NoSQL 数据库来说代码量相对要少很多,也就意味着普通的开发和运维⼈员完全可以 “吃透” 它。其次,Redis 使⽤单线程模型,这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了事件处理的相关功能。
但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG
⽽导致宕掉的情况。
客⼾端语⾔多
Redis 提供了简单的 TCP 通信协议,很多编程语⾔可以很⽅便地接⼊到 Redis,并且由于 Redis 受到社区和各⼤公司的⼴泛认可,所以⽀持 Redis 的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程 语⾔,例如 C、C++、Java、PHP、Python、NodeJS 等,后续我们会对 Redis 的客⼾端使⽤做详细说明。
持久化(Persistence)
通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性,后续我们将对 Redis 的持久化进⾏详细说明。
Redis 内存到硬盘的持久化
![]()
主从复制(Replication)
Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica),复制功能是分布式 Redis 的基础。
![]()
⾼可⽤(High Availability)和分布式(Distributed)
Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故
障⾃动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。
1.2Redis 使⽤场景
1.2.1 Redis可以做什么
缓存(Cache)
缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能
够有效地降低后端数据源的压⼒。Redis 提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。
排⾏榜系统
排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照
各种复杂维度计算出的排⾏榜,Redis 提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很⽅便地构建各种排⾏榜系统。
计数器应⽤
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的
实时性,每⼀次播放和浏览都要做加 1 的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑战。Redis 天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。
社交⽹络
赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量
通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对⽐较容易地实现这些功能。
消息队列系统
消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等
特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列⽐还不够⾜够强⼤,但是对于⼀般的消息队列功能基本可以满⾜。
1.2.2Redis 不可以做什么
实际上和任何⼀⻔技术⼀样,每个技术都有⾃⼰的应⽤场景和边界,也就是说 Redis 并不是万⾦油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的⻆度来进⾏分析。
站在数据规模的⻆度看,数据可以分为⼤规模数据和⼩规模数据,我们知道 Redis 的数据是存放在内存中的,虽然现在内存已经⾜够便宜,但是如果数据量⾮常⼤,例如每天有⼏亿的⽤⼾⾏为数据,使⽤ Redis 来存储的话,基本上是个⽆底洞,经济成本相当⾼。
站在数据冷热的⻆度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据,例如对于视频⽹站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,⽽⽤⼾的观看记录不⼀定是经常需要访问的数据,这⾥暂且不讨论两者数据规模的差异,单纯站在数据冷热的⻆度上看,视频信息属于热数据,⽤⼾观看记录属于冷数据。如果将这些冷数据放在 Redis 上,基本上是对于内存的⼀种浪费,但是对于⼀些热数据可以放在 Redis 中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。
所以,Redis 并不是万⾦油,相信随着我们对 Redis 的逐步学习,能够清楚 Redis 真正的使⽤场景。
1.3 安装并启动Redis
我们这里使用5.0版本。因为这个版本已经支持乐大部分功能特性,并且安装简单。
接下来,我们选择在 Linux 上安装 Redis.
1.3.1 在Ubuntu上面安装Redis
apt install redis -y
⽀持远程连接
修改/etc/redis/redis.conf
- 修改bind 127.0.0.1为bind 0.0.0.0
- 修改protected-mode yes为protected-mode no
# By default, if no "bind" configuration directive is specified, Redis listens # for connections from all the network interfaces available on the server. # It is possible to listen to just one or multiple selected interfaces using # the "bind" configuration directive, followed by one or more IP addresses. # # Examples: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 # # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # internet, binding to all the interfaces is dangerous and will expose the # instance to everybody on the internet. So by default we uncomment the # following bind directive, that will force Redis to listen only into # the IPv4 loopback interface address (this means Redis will be able to # accept connections only from clients running into the same computer it # is running). # # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # bind 127.0.0.1 # 注释掉这⾏ bind 0.0.0.0 # 添加这⾏ protected-mode no # 把 yes 改成 no
1.3.2控制 Redis 启动
启动 Redis 服务
service redis-server start
停⽌ Redis 服务
service redis-server stop
重启 Redis 服务
service redis-server restart
修改配置文件之后需要重启redis。
1.3.3 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 的专⽤脚本。
配置⽂件
/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 格式压缩保存。可以使⽤任意⽂本编辑器打开,后边章节我们会通过⽇志来观察⼀些现象。
1.4 Redis 命令行客户端
现在我们已经启动了 Redis 服务,下⾯将介绍如何使⽤ redis-cli 连接、操作 Redis 服务。
redis-cli 可以使⽤两种⽅式连接 Redis 服务器。
第⼀种是交互式⽅式:通过 redis-cli -h { host } -p { port } 的⽅式连接到 Redis 服务,后续所有
的操作都是通过交互式的⽅式实现,不需要再执⾏ redis-cli 了,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"
第⼆种是命令⽅式:⽤redis-cli -h { host } -p { port } { command } 就可以直接得到命令的返回
结果,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 ping
PONG
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 set key hello
OK
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 get key
"hello"
由于我们连接的 Redis 服务位于 127.0.0.1,端⼝也使⽤的是默认的 6379端⼝,所以可以省略 -h { host } -p { port }。
![]()