Redis 特性
Redis 之所以受到如此多公司的⻘睐,必然有之过⼈之处,下⾯是关于 Redis 的 8 个重要特性。
速度快
正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以⼤概归纳为以下四点:
- Redis 的所有数据都是存放在内存中的,表 1-1 是⾕歌公司 2009 年给出的各层级硬件执⾏速度,所以把数据放在内存中是 Redis 速度快的最主要原因。
学过的 MySQL 是通过“表”来存储数据的,这种是“关系型数据库”。
- Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快。
- Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。
Redis 在 6.0 版本引⼊了多线程机制,但主要也是在处理⽹络和 IO(IO 多路复用-epoll。使用一个线程管理多个 Socket),不涉及到数据命令,即命令的执⾏仍然采⽤了单线程模式。
多线程不是能提高效率吗?
这个的前提是 CPU 密集型的任务。使用多个线程可以充分利用 CPU 多核资源。而 Redis 的核心任务主要就是操作内存的数据结构,本身不会消耗太多的 CPU,也就用不上多线程。
- 作者对于 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 | 3 000 ns |
Send 2 K bytes over 1 Gbps network | 20 000 ns |
Read 1 MB sequentially from Memory | 250 000 ns |
Round trip within same datacenter | 500 000 ns |
Disk seek | 10 000 000 ns |
Read 1 MB sequentially from disk | 20 000 000 ns |
Send packet CA -> Netherlands -> CA | 150 000 000 ns |
基于键值对的数据结构服务器
⼏乎所有的编程语⾔都提供了类似字典的功能,例如 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(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。
Redis 主要是通过“键值对”来存储组织数据库的,这种是“非关系型数据库”。
丰富的功能
除了 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,即可以⽤两种策略将内存的数据保存到硬盘中(如图 1-1 所⽰),重启时加载硬盘中的备份数据,使内存恢复到重启前的状态,这样就保证了数据的可持久性,后续我们将对 Redis 的持久化进⾏详细说明。
图 1-1 Redis 内存到硬盘的持久化
主从复制(Replication)
Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica)(如图 1- 2 所⽰),复制功能是分布式 Redis 的基础。后续我们会对 Redis 的复制功能进⾏详细演⽰。
图 1-2 Redis 主从复制架构
⾼可⽤(High Availability)和分布式(Distributed)
Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故障⾃动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了⾼可⽤(因为支持主从结构,从节点就相当于主节点的备份了)、读写和容量的扩展性。
Redis 使⽤场景
Redis 可以做什么
数据库
把 Redis 当作数据库使用,可以为需要低延迟和高吞吐量的实时应用程序构建数据存储,把所有需要检索的数据都存储在内存中。
缓存(Cache)
缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能够有效地降低后端数据源的压⼒。Redis 提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。
以上两种的区别:前者是全部存储,后者是部分存储
排⾏榜系统
排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照各种复杂维度计算出的排⾏榜,Redis 提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很⽅便地构建各种排⾏榜系统。
计数器应⽤
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的实时性,每⼀次播放和浏览都要做加 1 的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑战。Redis 天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。
社交⽹络
赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对⽐较容易地实现这些功能。
cookie 实现用户身份信息的保存,需要 session 配合。cookie 只是找浏览器这边存储了一个用户的身份标识(sessionId),服务器这里真正存储了用户的数据 session。
这些存储有一个问题,客户端通过负载均衡器把信息存储做服务器 A,但下次可能就访问道服务器 B 了,如何解决这个问题?
- 想办法让负载均衡器把用一个用户的请求分配到同一个机器上(不能轮询了,通过 userId)
- 或者这些会话数据单独使用 Redis 存储
消息队列系统
消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等特性。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,如果对于某些新的特性想提前了解和使⽤,可以选择最新的奇数版本。⽬前最新的版本是 7.0 版本。本⼩节将对 Redis 发展过程中的⼀些重要版本及特性进⾏说明。
Redis 2.6
Redis 2.6 在 2012 年正式发布,相⽐于 Redis 2.4,主要特性如下:
- 服务端⽀持 Lua 脚本
- 去掉虚拟内存相关功能。
- 放开对客⼾端连接数的硬编码限制。
- 键的过期时间⽀持毫秒。
- 从结点提供只读功能。
- 两个新的位图命令:bitcount 和 bitop。
- 增强了 redis-benchmark 的功能:⽀持定制化的压测、CSV 格式输出等功能。
- 基于浮点数⾃增命令:incrbyfloat 和 hincrbyfloat。
- redis-cli 可以使⽤ --eval 参数实现 Lua 脚本执⾏。
- shutdown 命令增强。
- Info 可以按照 setction 输出,并且添加了⼀些统计项。
- 重构了⼤量的核⼼代码,所i有集群相关的代码都去掉了,会在 3.0 ⽀持 cluster 功能。
- sort 命令优化。
Redis 2.8
Redis 2.8 在 2013 年正式发布,相⽐于 Redis 2.6,主要特性如下:
- 添加部分主从复制的功能,在⼀定程度上降低了由于⽹络问题,造成频繁全量复制⽣成 RDB 对系统造成的压⼒。
- 尝试性地⽀持 IPv6。
- 可以通过 config set 命令设置 maxclients。
- 可以⽤ bind 命令绑定多个 IP 地址。
- Redis 设置了明显的进程名,⽅便使⽤ ps 命令查看系统进程。
- config rewrite 命令可以将 config set 持久化到 Redis 配置⽂件中。
- 发布订阅添加了 pubsub 命令。
- Redis Sentinel 第⼆版,相⽐于 Redis 2.6 的 Redis Sentinel,此版本已经变成⽣产可⽤。
Redis 3.0
Redis 3.0 在 2015 年正式发布,相⽐于 Redis 2.8,主要特性如下:
- Redis Cluster:Redis 提供的官⽅分布式实现。
- 全新的 embedded string 对象编码结果,优化了⼩对象内存访问,在特定的⼯作负载时,下载速度⼤幅提⾼。
- 优化了 LRU 算法,⼤幅提供性能。
- migrate 链接缓存,⼤幅提供键迁移的速度。
- migrate 命令新增两个参数:copy 和 replace。
- client pause 命令,在指定时间内中⽌处理客⼾端请求。
- bitcount 命令性能提⾼。
- config set 设置 maxmemory 时候能够设置不⼀样的单位(以前只能是字节)。
- Redis⽇志⼩作调整:⽇志中会反应当前实例的⻆⾊(master 或者 slave)。
- incr命令性能提⾼。
Redis 3.2
Redis 3.2 在 2016 年正式发布,相⽐于 Redis 3.0,主要特性如下:
- 添加 GEO 相关功能。
- SDS 在速度和节省空间上都作了优化。
- ⽀持⽤ upstart 或者 systemd 管理 Redis 进程。
- 新的 List 编码类型:quicklist。
- 从节点读取过时数据保证⼀致性。
- 添加了 hstrlen 命令。
- 加强了 debug 命令,⽀持了更多的参数。
- Lua 脚本功能加强。
- 添加了 Lua Debugger。
- config set ⽀持更多的配置参数。
- 优化了 Redis 崩溃后的相关报告。
- 新的 RDB 格式,可是仍然兼容旧的 RDB。
- 加速 RDB 的加载速度。
- spop 命令⽀持个数参数。
- cluster nodes 命令获得加速。
- Jemalloc 更新到 4.0.3 版本。
Redis 4.0
Redis 4.0 在 2017 年正式发布,相⽐于 Redis 3.2,主要特性如下:
- 提供了模块系统(module),⽅便第三⽅开发者拓展 Redis 的功能。
- PSYNC 2.0:优化了以前版本中,主从节点切换必然引发全量复制的问题。
- 提供了新的缓存剔除算法:LFU(Last Frequently Used),注意 LFU 和 LRU 算法的不同之处,LRU 的淘汰规则是基于访问时间,⽽ LFU 是基于访问次数的,并对已有算法进⾏了优化。
- 提供了⾮阻塞 del 和 flushall / flushdb 功能,新添加了 unlink 命令, 这个命令是 del 命令的异步版本, 它可以将删除指定键的操作放在后台线程⾥⾯执⾏。
- 提供了 memory 命令,实现对内存更为全⾯的监控统计。
- 提供了交互数据库功能,实现 Redis 内部数据库的数据置换。
- 提供了 RDB-AOF 混合持久化格式,充分利⽤了 AOF 和 RDB 各⾃优点。
- Redis Cluster 兼容 NAT 和 docker 。
Redis 5.0
Redis 5.0 在 2018 年正式发布,相⽐于 Redis 4.0,主要特性如下:
- 新的流数据类型(stream)。
- 新的 Redis 模块 API:定时器、集群和字典 API。
- RDB 现在可存储 LFU 和 LRU 信息。
- redis-cli 中的集群管理器从 Ruby(redis-trib.rb)移植到了 C 语⾔代码。执⾏
redis-cli --cluster help
命令以了解更多信息。 - 新的有序集合(sorted set)命令:zpopmin / zpopmax 和阻塞变体(blocking variants)。
- 升级 Active defragmentation ⾄ v2 版本。
- 增强 HyperLogLog 的实现。
- 更好的内存统计报告。
- 许多包含⼦命令的命令现在都有⼀个 help ⼦命令。
- 客⼾端频繁连接和断开连接时,性能表现更好。
- 许多错误修复和其他⽅⾯的改进。
- 升级 Jemalloc ⾄ 5.1 版本。
- 引⼊ client unblock 和 client id。
- 新增 lolwut 命令。
- 在不存在需要保持向后兼容性的地⽅,弃⽤ “slave” 术语。
- ⽹络层中的差异优化。
- 增强对 Lua 的⽀持:将 Lua 脚本更好地传播到 replicas / AOF、Lua 脚本现在可以超时并在副本中进⼊ -BUSY 状态。
- 引⼊动态的 HZ(Dynamic HZ)以平衡空闲 CPU 使⽤率和响应性。
- 对 Redis 核⼼代码进⾏了重构并在许多⽅⾯进⾏了改进。
Redis 6.0
Redis 6.0 在 2020 年正式发布,相⽐于 Redis 5.0,主要特性如下:
- Redis 6.0 引⼊多线程 IO,但多线程部分只是⽤来处理⽹络数据的读写和协议解析,执⾏命令仍然是单线程。
- 实现了client-side-caching(客⼾端缓存)功能。放弃了caching slot,⽽只使⽤ key names。
- Redis 6.0 开始在兼容 RESP 2 的基础上,开始⽀持 RESP 3(RESP,Redis Serialization Protocol 是 Redis 服务端与客⼾端之间通信的协议)。
- 连接⽀持 SSL,更加安全。
- 增强 ACL 权限控制:⽀持对客⼾端的权限控制,实现对不同的 key 授予不同的操作权限、新增⼀个新的ACL ⽇志命令,允许查看所有违反 ACL 的客⼾机、访问不应该访问的命令、访问不应该访问的密钥,或者验证尝试失败。这对于调试 ACL 问题⾮常有⽤。
- 提升了RDB⽇志加载速度。
- 发布官⽅的 Redis 集群代理模块 Redis Cluster Proxy。
- 提供了众多的新模块(modules)API。
Redis 7.0
Redis 7.0 在 2022 年正式发布,相⽐于 Redis 6.0,主要特性如下:
- 将 AOF ⽂件的存储⽅式改为在⼀个⽂件夹下存储多个⽂件。
- 将持久化⽂件 RDB 的版本升级为 10,与之前的 RDB ⽂件版本不再兼容。
- 在读取⽼的 RDB ⽂件格式的时候将 ziplist 转换为 listpack,这种转换发⽣于两种情况之下:从磁盘读取⽂件或者从⼀个主节点进⾏复制⽂件的时候。
- 在 redis.conf 配置⽂件中,protected-mode 默认更改为 yes,只有当你希望你的客⼾端在没有授权的情况下可以连接到 Redis server 的时候可以将 protected-mode 设置为 no。
- 在 ACL 中,pub / sub channel 默认是被阻塞的。
- 在从节点中,TTL 的时间标识的是绝对时间,不再是相对时间,从⽽保证了过期数据被及时删除。
- 不再⽀持 gopher 协议。
- 当在配置⽂件中设置 replica-serve-stale-data=no, 当主节点不再提供服务时,ping 命令得不到返回值。
安装并启动 Redis
我们选择 5.0 版本,原因是 5.0 已经⽀持了⼤部分的功能特性,⽽且相⽐较于 7.0 版本,更容易进⾏安装使⽤。
Redis 的官⽅并不⽀持微软的 Windows 操作系统,因为 Redis 的许多特性都是和操作系统相关的,所以⽀持 Windows 会增加维护成本,⽽且更重要的是⼤部分公司都在使⽤ Linux 操作系统,⽽ Redis 在 Linux 操作系统上的表现已经得到实践的证明。当然 Redis 作为⼀款优秀的开源技术,还是吸引到微软公司的注意,微软公司的开源技术组在 Github 上维护了⼀个Redis 分⽀:https://github.com/MSOpenTech/redis。不过还是强烈建议⼤家在 Linux上使⽤ Redis。
接下来,我们选择在 Linux 上安装 Redis.
CentOs 7
使⽤ yum 安装
⾸先安装 scl 源
yum install centos-release-scl-rh
再安装 redis
yum install rh-redis5-redis
创建符号链接
默认安装的⽬录为 /opt/rh/rh-redis5/root/usr/bin/ , 藏的太深了, 不⽅便使⽤. 我们通过符号链接, 把需要⽤到的关键内容设置到⽅便使⽤的⽬录中.
- 针对可执⾏程序设置符号链接
先去到 /usr/bin 目录
cd /usr/bin
逐个安装服务器、哨兵、客户端
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-sentinel ./redis-sentinel
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-cli ./redis-cli
检查
[root@VM-8-16-centos bin]# ll redis-*
lrwxrwxrwx 1 root root 40 Apr 5 00:37 redis-cli -> /opt/rh/rh-redis5/root/usr/bin/redis-cli
lrwxrwxrwx 1 root root 45 Apr 5 00:25 redis-sentinel -> /opt/rh/rh-redis5/root/usr/bin/redis-sentinel
lrwxrwxrwx 1 root root 43 Apr 5 00:25 redis-server -> /opt/rh/rh-redis5/root/usr/bin/redis-server
- 针对配置⽂件设置符号链接
cd /etc/
ln -s /etc/opt/rh/rh-redis5/ ./redis
修改配置⽂件
先去到配置文件所在目录,我们上面命名为 redis 了
cd redis
然后进入配置文件
vim redis.conf
- 设置 ip 地址
这个在 69 行,把原来的 127.0.0.1 改为下面的 0.0.0.0
bind 0.0.0.0
- 关闭保护模式
这个在 88 行,把原来的 yes 改为下面的 no
protected-mode no
- 启动守护进程
这个在 136 行,把原来的 no 改为下面的 yes
daemonize yes
- 设置⼯作⽬录
先 :wq
保存退出配置文件,先创建⼯作⽬录
mkdir -p /var/lib/redis
再回到配置⽂件中, 设置⼯作⽬录
这个在 263 行,改成下面这样
dir /var/lib/redis
- 设置⽇志⽬录
先 :wq
保存退出配置文件,先创建⽇志⽬录
mkdir -p /var/log/redis/
再回到配置⽂件中, 设置⽇志⽬录
这个在 171 行,改成下面这样
logfile /var/log/redis/redis-server.log
启动 redis
redis-server /etc/redis/redis.conf
检查
[root@VM-8-16-centos redis]# redis-server /etc/redis/redis.conf
[root@VM-8-16-centos redis]# netstat -anp | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 12851/redis-server
连接服务器
[root@VM-8-16-centos redis]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
停⽌ redis
ps aux | grep redis
先查看到 redis-server 的 pid
kill 进程id
要先按 ctrl+c 退出 Redis客户端,然后通过 kill 命令直接杀死 redis 进程
后续如果修改了配置文件,都需要通过重启才能生效的
参考资料
https://centos.pkgs.org/7/centos-sclo-rh-x86_64/rh-redis5-redis-5.0.5-1.el7.x86_64.rpm.html
通过 systemd 管理 Redis
⼀旦安装完成,我们可以将 redis 设置为开机⾃动启动:
[root@host ~]# systemctl enable redis
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service →
⽀持远程连接
默认情况下,Redis 只绑定在 127.0.0.1 接⼝上,即只允许从 127.0.0.1(localhost)上进⾏连接 Redis 服务,但在随后的代码篇,我们需要在 Windows 上连接云服务器的 Redis 进⾏⼀系列的操作,所以需要配置允许 Redis 接受远程访问,修改 Redis 的配置⽂件:/etc/redis.conf,
- 定位到 bind 127.0.0.1 开头的⼀⾏,修改为 bind 0.0.0.0 以添加全接⼝⽀持:
- 关闭保护模式, protected-mode no
# By default, if no "bind" configuration directive is specified, Redis listen
# 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去掉左边的数字,将这些整齐格式化
通过 systemd 控制 Redis
启动 Redis 服务
[root@host ~]# systemctl start redis
验证 Redis 是否正确地监听 6379 端⼝:
[root@host ~]# netstat -nlpt | grep 6379
停⽌ Redis 服务
[root@host ~]# systemctl stop redis
重启 Redis 服务
[root@host ~]# systemctl restart redis
使用 redis-server 启动 redis 可以直接用 kill 进程id 的方式停止
用 service redis-server start 就必须用 service redis-server stop 停止,因为用这种方式启动,通过 kill 的方式关掉的话会自启动。
这是因为服务器就是要稳定性和高可用,但服务器上的某些程序就是很难避免挂掉的情况,如果服务器进程挂了,能自动重启进程,就不会有太大影响。这是因为往往有另外一个进程来专门监控指定的服务器进程的运行状态。
小结
- Redis 的 8 个特性:速度快、基于键值对的数据结果服务器、功能丰富、简单稳定、客⼾端语⾔多、持久化、主从复制、⽀持⾼可⽤和分布式。
- Redis 并不是万⾦油,有些场景不适合使⽤ Redis 进⾏开发。
- 开发运维结合以及阅读源码是⽤好 Redis 的重要⽅法。
- 安装启动 Redis。
- 根据需求选择稳定版本的 Redis。