初始Redis:概念、特性、使用场景、安装教程
文章目录
- 一、什么是redis?
- 二、 Redis特性的简单认识
- 1. 速度快
- 2. 基于键值对
- 3. 丰富的功能
- 4. 简单稳定
- 5. 客户端支持多种编程语言:
- 6. 持久化
- 7. 主从复制(Replication)
- 8. 高可用(High Availability)和分布式(Distributed)
- 三、Redis使用场景
- 1. Redis可以做什么?
- 数据库
- 缓存
- 消息队列
- 2. Redis不宜做什么?
- 四、Redis重大版本
- 五、Ubuntu 安装 Redis 6
- 1. 更新apt软件源
- 2. 安装 Redis
- 3. 修改配置文件支持远程连接
- 4. 重启redis服务
- 5. 检验redis状态
一、什么是redis?
Redis 是一款基于键值对(key-value)的 NoSQL 数据库。与多数键值对数据库不同,其值可由字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)、位图(Bitmaps)、HyperLogLog、地理信息定位(GEO)等多种数据结构和算法构成,这使得 Redis 能满足多样的应用场景。
Redis 的显著优势在于将所有数据存储于内存中,因此读写性能极为出色。同时,它支持通过快照(RDB)和日志(AOF)两种方式将内存数据持久化到硬盘,确保断电或机器故障时数据不会丢失。此外,Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能,方便应对这类场景。
如今,众多重量级企业都在使用 Redis。国外如 Twitter、Instagram、Stack Overflow、Github 等;国内则有新浪微博(堪称全球最大的 Redis 使用者)、阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等。此外,ELK 等诸多开源技术也将 Redis 作为重要组件,且 Redis 提供的模块系统支持第三方进行功能扩展,进一步释放其潜力。由此可见,熟练使用和运维 Redis 已成为开发与运维人员的必备技能。
二、 Redis特性的简单认识
Redis得到了众多公司的青睐,必有其过人之处,下面是关于Redis的8个重要特性。
1. 速度快
相较于MySQL这类关系型数据库,Redis的访问速度要快很多,其原因大致可以分为以下四点:
- 内存读写天然快:Redis的数据存放在内存中,内存访问速度要远远快于硬盘,这也是Redis速度快的主要原因。(下图是Google列出的各种硬件执行速度,供参考)
- 单线程优势:Redis使用单线程模型,避免了线程切换和多线程加锁竞争导致的性能损失
Redis 6.0 引入了多线程机制,但主要用于网络IO场景,Redis的核心执行的执行依旧保持单线程模型
- 高效的数据结构:Redis采用了各种高效率的数据结构,如字符串(String)、哈希表(Hash)、有序集合(ZSet)、这些数据结构的操作复杂度多为O(1)或者O(logN)O(1) 或者 O(logN)O(1)或者O(logN) ,确保指令执行高效。
- I/O多路复用技术:采用I/O多路复用技术,确保单线程也能高效应对大量客户端请求
各层级硬件执行速度:
2. 基于键值对
Redis是基于键值对的非关系型数据库(NoSQL),所谓键值对就像C++的map,Python的dict等,这种结构的优势就是插入数据和查询数据更加高效。值得一提的是,Redis的值支持丰富的数据结构:字符串、哈希表、列表、集合、有序集合、位图、HyperLogLog甚至在Redis3.2加入了地理位置相关功能。这些丰富的数据库能帮助开发者开发应对各类场景的应用。
3. 丰富的功能
- 键过期功能:到达一定时间自动删除键值对,用于实现缓存
- 发布订阅功能:可用于实现消息系统
- Lua脚本:可用Lua脚本执行Redis命令
- 简单事务功能:
- 流水线(Pipeine): 使得客户端能将一批命令一次传到Redis,减少了网络的开销
4. 简单稳定
- Redis源码量少:早期甚至只有两万行,Redis3.0引入集群特性后增至5万行左右,相对于其他数据库来说代码量少很多。
- Redis采用单线程模型
- Redis不依赖操作系统的各种类库,自己实现事件处理相关功能。
5. 客户端支持多种编程语言:
Redis提供了简单的TCP通信协议:很多编程语言都可以方便的接入Redis,且由于Redis收到广泛认可,主流语言都已经有开发者实现了良好的Redis支持,如C、C++、Java、PHP、Python、JS
6. 持久化
前面提到,Redis数据存放在内存中,这保证了访问速度很快,但是不够安全。一旦发生断电或者机器故障,重要的数据就可能会丢失。因此,Redis提供两种持久化策略:RDB和AOF,可将内存中的数据保存到硬盘中。后续我将对Redis持久化策略详细说明。
7. 主从复制(Replication)
主从复制功能是分布式架构的基础。这一功能也将在后续博文中进行演示。
8. 高可用(High Availability)和分布式(Distributed)
Redis 提供了高可用实现的 Redis 哨兵,能够保证Redis节点故障检测和故障自动转移。也提供了 Reids 集群,这是真正的分布式实现。
三、Redis使用场景
1. Redis可以做什么?
Redis官网给出了三个方向:数据库、缓存和消息队列
数据库
大多数情况下,数据库考虑的是容量大,但也有一些高性能的场景考虑的是“速度快“,这是就可以直接采用Redis做数据库
缓存
这是Redis最广泛使用的场景。对于各类大型网站或者应用程序,往往是少量的数据能满足大量的用户使用场景。因此,这类网站采用的方式都是用 MySQL 等数据库存储全量完整数据,用Redis从数据库中加载少量核心数据作为缓存,这样的设计提升了用户访问数据的速度,也有效降低了后端的压力。
消息队列
Redis的开发者最早开发它就是为了将其作为消息队列进行使用的。但如今,在消息队列方面,我们有很多更优的选择,因此,Redis做消息队列的场景很少出现了。
2. Redis不宜做什么?
和所有技术一样,Redis也有其适用场景与边界,并非万能解决方案。它既能高效解决特定问题,也存在不适合的应用场景,这一点可从数据规模与数据冷热两个维度来分析。
从数据规模来看,数据可分为大规模数据与小规模数据。由于Redis的数据存储依赖内存,尽管如今内存成本已大幅下降,但面对超大规模数据——例如每天数亿条的用户行为数据——若用Redis存储,成本会高得难以承受,堪称一个“无底洞”。
从数据冷热属性来看,数据有热数据与冷数据之分。热数据指需要频繁操作的数据,冷数据则反之。以视频网站为例,视频基本信息在各业务线中常被调用,属于热数据;而用户的观看记录未必会被频繁访问,可归为冷数据。暂且不考虑两者在数据规模上的差异,仅从数据冷热角度而言,将冷数据存于Redis无疑是对内存的浪费,而把热数据放入Redis,既能加速读写操作,又能减轻后端存储的负载,可谓事半功倍。
因此,Redis并非“万金油”。相信随着对Redis的深入学习,我们会更清晰地把握它真正的适用场景。
四、Redis重大版本
Redis版本发布
- Redis 2.6 :2012年发布,支持服务端Lua脚本,键过期时间精确到毫秒,从节点新增只读功能。
- Redis 2.8 :2013年发布,优化主从复制的PSYNC机制,支持通过config set配置maxclients,新增config rewrite命令。
- Redis 3.0 :2015年发布,推出官方分布式方案Redis Cluster,优化小对象内存访问,新增client pause命令。
- Redis 3.2 :2016年发布,添加GEO地理信息处理功能,引入List新编码类型quicklist,新增hstrlen命令。
- Redis 4.0 :2017年发布,引入模块系统,优化主从复制为PSYNC2.0,新增LFU缓存淘汰算法,支持非阻塞del/flush命令。
- Redis 5.0 :2018年发布,新增流数据类型(Stream),升级Redis模块API,RDB文件包含LFU/LRU信息。
- Redis 6.0 :2020年发布,支持多线程IO,优化模块API,改进过期键处理机制,新增SSL支持。
- Redis 7.0 :2022年发布,新增Function自定义函数库,支持Client-Eviction机制、Sharded-Pub/Sub,提供命令执行耗时直方图。
五、Ubuntu 安装 Redis 6
相较于Redis 7, Redis 6 已经具备了大部分功能,且更容易安装。
Redis官方不支持Windows系统,因为Redis的特性与Linux息息相关。又由于Redis的优秀特性,微软的开源技术组也维护了一个 Redis 的windows版本分支,不过仍然建议在Linux上学习使用Redis。
1. 更新apt软件源
sudo apt update
2. 安装 Redis
sudo apt install redis
3. 修改配置文件支持远程连接
修改 /etc/redis/redis.conf (注意需要sudo权限)
- 修改 bind 127.0.0.1 为 bind 0.0.0.0
- 修改protected-mode yes 为 protected-mode no
4. 重启redis服务
sudo service redis-server restart
5. 检验redis状态
- 通过netstat命令
netstat -anp | grep redis
2. 启动redis客户端
redis-cli
启动完成后输入ping,若返回pong,则redis连接正常
使用ctrl + d 退出客户端。