详解redis及Ubuntu的安装和运行

写作目的

  1. 了解redis的功能和特点
  2. 记录安装方法和步骤,方便复查
  3. 环境:ubuntu 16.04 LTS redis-4.0.2
  4. 每个知识点背后都有其原因,深究才会掌握知识的本真

简介

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可以通过以下两种方式实现数据持久化:

  1. 使用快照的方式,异步将内存中的数据不断写入磁盘;
  2. 使用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

1
2
3
4
5
ubuntu@ubuntu-linux:~$ whereis redis-cli
redis-cli:

ubuntu@ubuntu-linux:~$ whereis redis-server
redis-server:

2、安装 Redis

通过 apt-get 命令安装

  • 命令:
1
2
sudo apt-get update
sudo apt-get install redis-server

通过下载官方安装包进行安装并解压

  • 本文不是用 root 用户安装
  • 命令:
1
2
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
1
sudo mv redis-4.0.2 /usr/local/
  • 编译以及安装
1
2
3
cd /usr/local/redis-4.0.2
make
suod make install

3、启动 Redis

1
sudo /usr/local/bin/redis-server

==注意:非 root 启动,如果用命令直接关闭redis,redis无法结束进程==

1
2
3
4
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.
  • 指定配置文件启动
1
2

sudo /usr/local/bin/redis-server /usr/local/redis-4.0.2/redis.conf &
  • 检测后台进程是否存在
1
ps -ef |grep redis
  • 检测 6379 端口是否在监听
1
netstat -lntp | grep 6379
  • 使用 redis-cli 进行连接
1
2
3
4
5
6
7
8
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 停止
1
redis-cli shutdown
  • 或在 redis-cli 命令行中停止
1
2
127.0.0.1:6379> shutdown
not connected>
  • 直接 kill 掉进程( Redis 可以妥善处理 SIGTERM 信号)
1
kill -9 PID

总结

Redis 是开发人员必备的利器,掌握好 Redis 的功能特性并使用到实际场景才能真正体会到 Redis 的带来的便利。目前 Redis 主要应用场景如下:

  • 构建高可用的缓存系统
  • 积分排行榜( sorted set )
  • 计数器
  • 分布式锁
  • 消息中间件( message queue / pub/sub)
  • web服务器的session管理

参考资料

  1. Redis
  2. Redis wikipedia
  3. the-little-redis-book
  4. Redis3.0官方文档翻译和源码解析
分享到 评论