初识 Redis
- Redis 全称 REmote Dictionary Server.
- Redis 是一种基于键值对的 NoSQL 数据库. 它支持的类型有 string, hash, list, set, zset (有序集合), bitmaps (位图), hyperLogLog, GEO (地理信息定位).
- Redis 将所有数据都放在内存中, 所以它的读写性能非常惊人.
- Redis 可以将内存的数据利用快照和日志的形式保存在硬盘上, 在发生类似断电或机器故障时, 数据不会丢失.
- 此外, Redis 还提供了 键过期, 发布订阅, 事务, 流水线, Lua 脚本 等附加功能.
特性
- 速度快
- 存放于内存 (为主要原因)
- C 语言实现: C 语言是"距离"操作系统更近的一种语言, 所以执行速度更快.
- 单线程架构: 预防了多线程可能产生的 竞争 问题.
- 丰富的功能
- 键过期: 用于实现缓存
- 发布订阅: 用于实现消息系统
- 支持 Lua 脚本: 可利用脚本创建出新的命令
- 事务功能: 保证事务特性
- 流水线 (Pipeline) 功能: 一次性执行一批命令, 减少网络开销
- 简单稳定
- 简单
- 源码量少, 最初仅 2 万行左右, 3.0 版本后 5 万行左右.
- 单线程模型, 处理简单, 开发简单
- 不信赖操作系统类库
- 稳定: 从来没出现过因自身 bug 而宕掉
- 简单
- 持久化
- RDB
- AOF
- 主从复制
- 高可用和分布式
- 节点故障发现与故障自动转移 (>= 2.8)
- 提供了高可用, 读写和容量的扩展性 (>= 3.0)
单线程架构
Redis 使用了 单线程架构 和 I/O 多路复用模型 来实现高性能的内存数据库服务的.
- 单线程: 一条命令从客户端到达服务端不会立刻执行, 而是先进入一个队列, 然后逐个被执行.
Redis 为什么这么快 ?
- 纯内存访问
- 非阻塞 I/O, Redis 使用 epoll 的 I/O 多路复用技术, 并用 自身事件处理模型将 epoll 的连接, 读写, 关闭都转化为事件, 避免了在 I/O 上浪费时间
- 单线程避免了线程间的切换和竞态产生的消耗
使用场景
- 缓存: 速度快, 可设置过期时间
- 排行榜系统: 列表和有序集合
- 计数器应用: 保证实时性. 如: 视频播放次数, 电商网站浏览数
- 社交网络
- 消息队列系统: 发布订阅功能 和 阻塞队列的功能.
不推荐的场景
- 不适合存放 "冷数据", 占用内存而又不频繁使用
启动与关闭
Redis 安装后, src 和 /usr/local/bin 目录下多了几个 redis 开头的可执行文件, 我们称之为 Redis Shell.
Redis 借鉴了 Linux 操作系统对于版本号的命名规则: 版本号第二位为奇数则为非稳定版本 (如 2.7, 2.9), 偶数为稳定版本 (如 2.6, 2.8)
- redis-server: 启动 redis 服务
- redis-cli: redis 命令行客户端
- redis-benchmark: 基准测试工具
- redis-check-aof: AOF 持久化文件检测和修复工具
- redis-check-dump: RDB 持久化文件检测和修复工具
- redis-sentinel: 启动 Redis Sentinel
启动
- 运行启动
- 配置文件启动
运行启动可以用命令 (无参数时使用默认配置, 默认端口 6379)
redis-server --configKey configValue --configKey2 configValue2
如 redis-server --port 6380
配置文件启动, 可以将配置信息写到文件中然后启动时传入此文件, 如
redis-server /path/to/redis.conf
一般, redis 目录下都会有一个 redis.conf 文件, 里面就是 redis 的默认配置文件, 一般可以将此文件作为模板进行修改
交互 (redis-cli)
- 交互式:
redis-cli -h 127.0.0.1 -p 6379
- 命令式:
redis-cli -h 127.0.0.1 -p 6379 get hello
redis-cli 是 redis 的命令行客户端, 可以通过 redis-cli [-h host] [-p port]
方式连接到 redis 服务进行交互 (默认 host 127.0.0.1, 默认 port 6379).
也可以使用 redis-cli 只执行一个命令即退出: redis-cli [-h host] [-p port] command args
停止
- shutdown 命令: 如
redis-cli [-h host] [-p port] shutdown [nosave/save]
- 其他方式如
kill -9
强制杀死进程
用 shutdown 命令是一种优雅的方式结束服务, 它可以在关闭服务前生成持久化文件.
网友评论