写作目的
- 了解 redis 的功能和特点
- 记录安装方法和步骤,方便复查
- 环境:ubuntu 16.04 LTS redis-4.0.2
- 每个知识点背后都有其原因,深究才会掌握知识的本真
一、简介
Redis 由 Salvatore Sanfilippo 开发于 2009 年,到今年 9 月 21 号已经发布了 197 个 release 版本,目前最新稳定版是 4.0.2。Redis 是一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、灵活的、开源的、key-value 存储系统。它允许用户存储大量的数据,而且没有关系数据库的限制。Redis 和 Memcached 类似,但是解决了断电后数据完全丢失的情况(由于 redis 是异步复制,因此不保证数据完全不丢失,只是解决了不丢失的可能性),而且它支持更多元化的 value 类型,而且性能相对高效。同时它也支持多种编程语言调用:ActionScript, C, C++, C#, Chicken Scheme, Clojure, Common Lisp, D, Dart, Erlang, Go, Haskell, Haxe, Io, Java, JavaScript (Node.js), Julia, Lua, Objective-C, OCaml, Perl, PHP, Pure Data, Python, R[16], Racket, Ruby, Rust, Scala, Smalltalk and Tcl,并且通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分片。 Redis 还支持主从异步复制,非常快的非阻塞初次同步、网络断开时自动重连局部重同步。
其他特性包括:
- 事务
- 订阅/发布
- Lua 脚本
- 带 TTL 的键
- LRU 回收健
- 自动故障转移(failover)
1、数据模型
作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis 的键值还可以是以下形式:Lists, Sets, Sorted Sets, Hashes, HyperLogLogs,Bitmaps,Geospatial data(地理空间数据 since Redis 3.2)。键值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、并集、差集等高级原子操作;同时,如果键值的类型是普通数字,Redis 则提供自增等原子操作。
2、持久化
通常,Redis 将数据全部存储于内存中,或被配置为使用虚拟内存(since Redis 2.3),此功能已经被弃用,来保存到磁盘上。
现在 Redis 可以通过以下两种方式实现数据持久化:
- 使用快照的方式,异步将内存中的数据不断写入磁盘;
- 使用 AOF(append-only file)(since Redis 1.1)的方式,类似 MySQL 的日志方式,以增量的方式记录每次更新的日志。
前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。默认情况下 Redis 每 2 秒会写入数据到文件系统,当然如果需要这个时间是可配置的。如果系统宕机,那么只会有几秒的数据会丢失。如果对此感兴趣,可以阅读作者的博文 Redis persistence demystified 或者此文 Redis 官方文档(13) ——持久化
3、复制
Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。Replication 是 Redis 最重要的功能,但也是坑最多的功能,想掌握好,需要了解这些内容。
- Redis 采用异步复制(since Redis 2.8)。 一个主服务器可以拥有多个从服务器。
- 从服务器可以接受其他从服务器的连接会形成图状结构。
- Redis 的复制在主服务器上是非阻塞的。
- Redis 的复制在从服务器上也是非阻塞的。
- 复制可以用来支持可伸缩性,用多个从服务器处理只读查询(例如,繁重的 SORT 操作可以分配到从服务器上),也可以仅仅作为数据冗余。
4、高可用
Redis Sentinel 是 Redis 的官方高可用解决方案,是设计用来帮助管理 Redis 实例的系统。用于完成下面 4 个任务:
- 监控(Monitoring)。Sentinel 不断检查你的主从实例是否运转正常。
- 通知(Notification)。Sentinel 可以通过 API 来通知系统管理员,或者其他计算机程序,被监控的 Redis 实例出了问题。
- 自动故障转移(Automatic failover)。如果一台主服务器运行不正常,Sentinel 会开始一个故障转移过程,将从服务器提升为主服务器,配置其他的从服务器使用新的主服务器,使用 Redis 服务器的应用程序在连接时会收到新的服务器地址通知。
- 配置提供者(Configuration provider)。Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinel 来询问某个服务的当前 Redis 主服务器的地址。当故障转移发生时,Sentinel 会报告新地址。
5、集群
支持分布式系统,成为 Redis 能持续不断发展的动力,也是能被广泛使用的亮点。我们看看 redis 集群都能做什么
- Redis 集群提供一种运行 Redis 的方式,数据被自动的分片到多个 Redis 节点。
- 集群不支持处理多个键的命令,因为这需要在 Redis 节点间移动数据,使得 Redis 集群不能提供像 Redis 单点那样的性能,在高负载下会表现得不可预知。
- Redis 集群也提供在网络分割(partitions)期间的一定程度的可用性,这就是在现实中当一些节点失败或者不能通信时能继续进行运转的能力。
当然上文只是对 Redis 功能的一个概览,如果想深入学习,每个特性都可以写一系列文章,本文就不再详细展开叙述。
二、安装及运行 redis
1、检测是否有安装 redis
使用 linux 命令 whereis 查找是否安装 redis-cli 和 redis-server
ubuntu@ubuntu-linux:~$ whereis redis-cli
redis-cli:
ubuntu@ubuntu-linux:~$ whereis redis-server
redis-server:
2、安装 Redis
1. 通过 apt-get 命令安装
- 命令:
sudo apt-get update
sudo apt-get install redis-server
2. 通过下载官方安装包进行安装并解压
- 本文不是用 root 用户安装
- 命令:
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
tar -zxvf redis-4.0.2.tar.gz
- 移到解压后的 Redis 到/usr/local/redis-4.0.2
sudo mv redis-4.0.2 /usr/local/
- 编译以及安装
cd /usr/local/redis-4.0.2
make
suod make install
3、启动 Redis
sudo /usr/local/bin/redis-server
注意:非 root 启动,如果用命令直接关闭 redis,redis 无法结束进程
11462:M 21 Nov 17:15:54.777 # User requested shutdown...
11462:M 21 Nov 17:15:54.777 * Saving the final RDB snapshot before exiting.
11462:M 21 Nov 17:15:54.777 # Failed opening the RDB file dump.rdb (in server root dir /usr/local/bin) for saving: Permission denied
11462:M 21 Nov 17:15:54.777 # Error trying to save the DB, can't exit.
- 指定配置文件启动
sudo /usr/local/bin/redis-server /usr/local/redis-4.0.2/redis.conf &
- 检测后台进程是否存在
ps -ef |grep redis
- 检测 6379 端口是否在监听
netstat -lntp | grep 6379
- 使用 redis-cli 进行连接
ubuntu@ubuntu-linux:/usr/local/bin$ redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set redis redis-4.0.2
OK
127.0.0.1:6379> get redis
"redis-4.0.2"
127.0.0.1:6379>
4、停止 Redis
- 使用 redis-cli 停止
redis-cli shutdown
- 或在 redis-cli 命令行中停止
127.0.0.1:6379> shutdown
not connected>
- 直接 kill 掉进程( Redis 可以妥善处理 SIGTERM 信号)
kill -9 PID
三、总结
Redis 是开发人员必备的利器,掌握好 Redis 的功能特性并使用到实际场景才能真正体会到 Redis 的带来的便利。目前 Redis 主要应用场景如下:
- 构建高可用的缓存系统
- 积分排行榜( sorted set )
- 计数器
- 分布式锁
- 消息中间件( message queue / pub/sub)
- web 服务器的 session 管理
参考资料
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于