Redis 之初识

1. 盛赞 Redis

  1. Redis 是一种基于键值对(key-value)的NoSQL数据库,与很多键值对 数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis可以满足很多的应用场景;
  2. 因为 Redis 会将所有数据都存放在内存 中,所以它的读写性能非常惊人;
  3. 不仅如此,Redis 还可以将内存的数据利 用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时 候,内存中的数据不会“丢失”。
  4. 除了上述功能以外,Redis 还提供了键过 期、发布订阅、事务、流水线、Lua 脚本等附加功能。

  

2. Redis 特性

  Redis 之所以受到如此多公司的青睐,必然有之过人之处,下面是关于 Redis 的 8 个重要特性:

  1. 速度快
      正常情况下,Redis 执行命令的速度非常快,官方给出的数字是读写性 能可以达到10万/秒,当然这也取决于机器的性能,分析一下是什么造就了 Redis 除此之快的速度,可以大致归 纳为以下四点:
    • Redis 的所有数据都是存放在内存中的,所以把数据放在内存中是 Redis 速度快的最主要原因;
    • Redis 是用 C语言实现的,一般来说 C语言实现的程序“距离”操作系统更 近,执行速度相对会更快;
    • Redis 使用了单线程架构,预防了多线程可能产生的竞争问题;
    • 作者对于 Redis 源代码可以说是精打细磨,曾经有人评价Redis是少有的
      集性能和优雅于一身的开源代码。
        
  2. 基于键值对的数据结构服务器
    • Redis 中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率;
    • Redis 的全称是 REmote Dictionary Server,它主要提供了5种数据结 构:字符串、哈希、列表、集合、有序集合;
    • 同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的“数据结构”,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中 加入有关GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意思”的应用。
        
  3. 丰富的功能
    • 除了 5 种数据结构,Redis 还提供了许多额外的功能:
    • 提供了键过期功能,可以用来实现缓存;
    • 提供了发布订阅功能,可以用来实现消息系统;
    • 支持 Lua 脚本功能,可以利用 Lua 创造出新的Redis命令;
    • 提供了简单的事务功能,能在一定程度上保证事务特性;
    • 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到 Redis,减少了网络的开销。
        
  4. 简单稳定
    • Redis 的简单主要表现在三个方面:
    • 首先,Redis 的源码很少,也就意味着普通 的开发和运维人员完全可以“吃透”它;
    • 其次,Redis 使用单线程模型,这样 不仅使得 Redis 服务端处理模型变得简单,而且也使得客户端开发变得简单;
    • 最后,Redis 不需要依赖于操作系统中的类库,Redis 自己实现了事件处理的相关功能。
        
  5. 客户端语言多
    • Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客 户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、 Python、C、C++、Nodejs等。
        
  6. 持久化
    • 通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障, 重要的数据可能就会丢失,因此 Redis 提供了两种持久化方式:RDB 和 AOF,即可以用两种策略将内存的数据保存到硬盘中。

在这里插入图片描述

  1. 主从复制
    - Redis 提供了复制功能,实现了多个相同数据的 Redis 副本,复制功能是分布式 Redis 的基础。

在这里插入图片描述

  1. 高可用和分布式
    • Redis 从2.8版本正式提供了高可用实现 Redis Sentinel,它能够保证 Redis 节点的故障发现和故障自动转移。Redis 从3.0版本正式提供了分布式实现 Redis Cluster,它是 Redis 真正的分布式实现,提供了高可用、读写和容量的 扩展性。

  

3. Redis 使用场景

  上面我们已经了解了 Redis 的若干个特性,这里来看一下 Redis 的典型应用场景有哪些?

  

3.1 Redis可以做什么

  1. 缓存
      缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis 提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。

  

  1. 排行榜系统
      排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis 提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行 榜系统。

  

  1. 计数器应用
      计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有 浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如 果并发量很大对于传统关系型数据的性能是一种挑战。Redis 天然支持计数 功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

  

  1. 社交网络
      赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis 提供的数据结构可以相对比较容易地实现这些功能。

  

  1. 消息队列系统
      消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。

  

3.2 Redis 不可以做什么

  实际上和任何一门技术一样,每个技术都有自己的应用场景和边界,也就是说 Redis 并不是万金油,有很多适合它解决的问题,但是也有很多不合 适它解决的问题。我们可以站在数据规模数据冷热的角度来进行分析。

  站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道 Redis 的数据是存放在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数据,使用 Redis 来存储的话,基本上是个无底洞,经济成本相当的高。

  站在数据冷热的角度看,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据,

  • 例如对于视频网站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,而用户的观看记录不一定是经常需要访问的数据,这里暂且不讨论两者数据规模的差异,单纯站在数据冷 热的角度上看,视频信息属于热数据,用户观看记录属于冷数据。
  • 如果将这些冷数据放在 Redis 中,基本上是对于内存的一种浪费,但是对于一些热数据可以放在 Redis 中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。

  

4. 用好 Redis 的建议

  1. 开发与运维同样重要
      很多使用 Redis 的开发者认为只要会用 API 开发相应的功能就可以,更有甚者认为Redis就是 get、set、del,不需要知道 Redis 的原理。但是在我们实际运维和使用 Redis 的过程中发现,很多线上的故障和问题都是由于完全把 Redis 当做黑盒造成的:

    • 如果不了解 Redis 的单线程模型,有些开发者会在有 上千万个键的 Redis 上执行 keys* 操作;
    • 如果不了解持久化的相关原理,会在 一个写操作量很大的 Redis 上配置自动保存 RDB;
    • 在很多公司内只有专职的关系型数据库 DBA,并没有 NoSQL 的相关运维人员,Redis 的开发人员不仅要支持开发, 还要承担运维的责任,而且由于运维经验不足可能会造成线上故障。

  

  1. 阅读源码
      Redis 是开源项目,由于作者对 Redis 代码的极致追 求,Redis 的代码量相对于许多 NoSQL 数据库来说是非常小的,也就意味着作为普通的开发和运维人员也是可以“吃透” Redis 的。
    • 通过阅读优秀的源码,不仅能够加深我们对于 Redis 的理解,而且还能提高自身的编码水平, 甚至可以对 Redis 做定制化,也就是说可以修改 Redis 的源码来满足自身的需求。

  

5. 正确安装并启动 Redis

5.1 安装 Redis

  在 Linux 安装软件通常有两种方法:第一种是通过各个操作系统的软件管理软件进行安装,但是由于 Redis 的更新速度相对较快,而这些管理工具不一定能更新到最新的版本,同时前面提到 Redis 的安装本身不是很复杂, 所以一般推荐使用第二种方式:源码的方式进行安装,整个安装只需以下六步即可完成,以 3.0.7版本为例:

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar xzf redis-3.0.7.tar.gz
$ ln -s redis-3.0.7 redis
$ cd redis
$ make
$ make install
  1. 1)下载Redis指定版本的源码压缩包到当前目录。
  2. 2)解压缩Redis源码压缩包。
  3. 3)建立一个redis目录的软连接,指向redis-3.0.7。
  4. 4)进入redis目录。
  5. 5)编译(编译之前确保操作系统已经安装gcc)。
  6. 6)安装。

这里有两点要注意:

  • 第一,第3步中建立了一个redis目录的软链接,这 样做是为了不把redis目录固定在指定版本上,有利于Redis未来版本升级, 算是安装软件的一种好习惯;
  • 第二,第6步中的安装是将Redis的相关运行文 件放到/usr/local/bin/下,这样就可以在任意目录下执行Redis的命令。

  安 装后,可以在任何目录执行 redis-cli–v 查看Redis的版本。

$ redis-cli -v 
redis-cli 3.0.7

  

5.2 配置、启动、操作、关闭Redis

  Redis 安装之后,src 和 /usr/local/bin 目录下多了几个以 redis 开头可执行文 件,我们称之为 Redis Shell,这些可执行文件可以做很多事情,例如可以启动和停止 Redis、可以检测和修复 Redis 的持化文件,还可以检测 Redis 的 能。表中分别列出这些可执行文件的说明。

在这里插入图片描述

  

5.2.1 启动 Redis

  有三种方法启动Redis:默认配置、运行配置、配置文件启动。

  1. 默认配置
      这种方法会使用 Redis 的默认配置来启动,下面就是 redis-server 执行后输出的相关日志:
$ redis-server
12040:C 11 Jun 17:28:39.464 # Warning: no config file specified, using the
default config. In order to specify a config file use ./redis-server /path/ to/redis.conf
   47
_._
_.-``__ ''-._ _.-`` `. `_. ''-._
.-`` .-```. ```\/ _.,_ ''-._ (',.-`|`,) |`-._`-...-` __...-.``-._|'` _.-'| | `-._ `._ / _.-' |
`-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-'
Redis 3.0.7 (00000000/0) 64 bit
Running in standalone mode Port: 6379
PID:12040
http:// redis.io
`-._
_.-'
`-.__.-'
12040:M 11 Jun 17:28:39.470 # Server started, Redis version 3.0.7
12040:M 11 Jun 17:28:39.470 * The server is now ready to accept connections on
port 6379

  可以看到直接使用 redis-server 启动 Redis 后,会打印出一些日志,通过 日志可以看到一些信息,上例中可以看到:

  • 当前的Redis版本的是3.0.7。
  • ·Redis的默认端口是6379。

Redis 建议要使用配置文件来启动。因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用的。

  

  1. 运行启动
      redis-server 加上要修改配置名和值(可以是多对),没有设置的配置将
    使用默认配置:
# redis-server --configKey1 configValue1 --configKey2 configValue2

  例如,如果要用6380作为端口启动Redis,那么可以执行:

# redis-server --port 6380

  虽然运行配置可以自定义配置,但是如果需要修改的配置较多或者希望 将配置保存到文件中,不建议使用这种方式。

  

  1. 配置文件启动
      将配置写到指定文件里,例如我们将配置写到了 /opt/redis/redis.conf
    中,那么只需要执行如下命令即可启动 Redis:
# redis-server /opt/redis/redis.conf

  Redis有60多个配置,这里只给出一些重要的配置(参见表),其他配置会随着不断深入学习进行介绍

在这里插入图片描述

运维提示

  • Redis目录下都会有一个redis.conf配置文件,里面就是Redis的默认配 置,通常来讲我们会在一台机器上启动多个Redis,并且将配置集中管理在 指定目录下,而且配置不是完全手写的,而是将redis.conf作为模板进行修 改。
  • 显然通过配置文件启动的方式提供了更大的灵活性,所以大部分生产环境会使用这种方式启动Redis。

  

5.2.2 Redis 命令行客户端

  现在我们已经启动了 Redis 服务,下面将介绍如何使用 redis-cli 连接、操作 Redis 服务。redis-cli 可以使用两种方式连接 Redis 服务器。

  1. 第一种是交互式方式
      通过 redis-cli-h{host}-p{port} 的方式连接到 Redis 服务,之后所有的操作都是通过交互的方式实现,不需要再执行 redis-cli 了,例如:
redis-cli -h 127.0.0.1 -p 6379 
127.0.0.1:6379> set hello world OK
127.0.0.1:6379> get hello "world"

  

  1. 第二种是命令方式
      用 redis-cli-h ip{host}-p{port}{command} 就可以直接得到命令的返回结果,一般用于一次性操作,例如:
redis-cli -h 127.0.0.1 -p 6379 get hello 
"world"

注意:
  如果没有 -h 参数,那么默认连接 127.0.0.1; 如 果没有 -p,那么默认 6379 端口,也就是说如果 -h 和 -p 都没写就是连接 127.0.0.1:6379 这个 Redis 实例。

  

5.2.3 停止 Redis 服务

  Redis 提供了shutdown 命令来停止 Redis 服务,例如要停掉 127.0.0.1 上 6379 端口上的 Redis 服务,可以执行如下操作。

$ redis-cli shutdown

  
可以看到Redis的日志输出如下:

# User requested shutdown... #客户端发出的shutdown命令
* Saving the final RDB snapshot before exiting. #保存RDB持久化文件
* DB saved on disk #将RDB文件保存在磁盘上
# Redis is now ready to exit, bye bye... #关闭

  
当使用 redis-cli 再次连接该 Redis 服务时,看到 Redis 已经“失联”。

$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused

  
这里有三点需要注意一下:

  1. Redis 关闭的过程:断开与客户端的连接、持久化文件生成,是一种相对优雅的关闭方式;
  2. 除了可以通过 shutdown 命令关闭 Redis 服务以外,还可以通过 kill 进程号的方式关闭掉 Redis,但是不要粗暴地使用 kill-9 强制杀死 Redis 服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成 AOF 和复制丢失数据的情况;
  3. shutdown 还有一个参数,代表是否在关闭 Redis 前,生成持久化文件:
redis-cli shutdown nosave|save
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值