# Redis简介
Redis全称为Remote Dictionary Server,即远程的字典服务,是一个使用ANSI C语言编写的一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此,Redis可以满足很多的应用场景,而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。
不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
# 适合使用Redis的场景
对于Redis来说,Redis的应用场景广泛,总的来说,大致可以总结为下面5个场景。
- 缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。
- 排行榜系统:排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
- 计数器应用:计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。
- 社交网络:社交网络赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。
- 消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。
# 在Linux上安装Redis数据库
在使用Redis数据库之前,我们需要先安装Redis数据库,在这里,我们是在Centos 7.x环境下安装的。在Linux中,通常有两种安装软件的方式,第一种是通过Linux软件包管理系统来安装,另外一种是通过下载源码,编译安装。一般情况下,我们使用源码编译安装的方式。
首先,我们先从Redis官网下载Redis源码
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
然后,我们解缩redis-5.0.5.tar.gz压缩包
tar -zxvf redis-5.0.5.tar.gz
接着,我们切换目录到已经解压的redis-5.0.5目录中。
cd redis-5.0.5
编译源代码,生成可执行程序
make
安装可执行程序
make install
当上述步骤都执行完毕,我们就完成了Redis的安装。此时,我们可以使用以下命令在任何目录下查看Redis的版本。
redis-cli -v
若安装没有问题,输出redis的版本号redis-cli 5.0.5
。当安装完Redis后,我们可以在目录/usr/local及其子目录中找到Redis的相关文件。
最后,我们将源代码中的redis.conf配置文件复制到安装目录中。
cp ./redis.conf /usr/local/bin
# 在Windows上安装Redis
Redis的官方并不支持微软的Windows操作系统,但是Redis作为一款优秀的开源技术吸引到了微软公司的注意,微软公司的开源技术组在GitHub上维护一个Redis的分支:https://github.com/MSOpenTech/redis
在Windows下安装Redis比较简单,直接下载Redis压缩包,并解压到自定义的目录下就可以使用了。
# Redis的配置、启动、操作、关闭
Redis安装之后,src和/usr/local/bin目录下多了几个以redis开头可执行文件,我们称之为Redis Shell,这些可执行文件可以做很多事情,例如可以启动和停止Redis、可以检测和修复Redis的持久化文件,还可以检测Redis的性 能。
可执行文件 | 作用 |
---|---|
redis-server | 启动Redis |
redis-cli | Redis命令行客户端 |
redis-benchmark | Redis基准测试工具 |
redis-check-aof | Redis AOF持久化文件检测和修复工具 |
redis-check-dump | Redis RDB持久化文件检测和修复工具 |
redis-sentinel | 启动Redis-Sentinel |
# 启动Redis的三种方式
对于Redis来说,有三种方法可以启动Redis,分别是默认配置、运行配置、配置文件启动。我们切换到
默认配置方式启动
这种方式会使用Redis的默认配置启动Redis
./redis-server
下面就是redis-server执行后输出的相关日志
8339:C 08 Aug 2019 17:04:23.972 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 8339:C 08 Aug 2019 17:04:23.972 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=8339, just started 8339:C 08 Aug 2019 17:04:23.972 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf 8339:M 08 Aug 2019 17:04:23.976 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.5 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 8339 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 8339:M 08 Aug 2019 17:04:23.989 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 8339:M 08 Aug 2019 17:04:23.990 # Server initialized 8339:M 08 Aug 2019 17:04:23.991 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 8339:M 08 Aug 2019 17:04:23.993 * Ready to accept connection
可以看到直接使用redis-server启动Redis后,会打印出一些日志,通过日志我们可以看到一些信息。
- 当前Redis的版本是5.0.5
- Redis的默认端口是6379
Redis建议要使用配置文件来启动。因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用 的。
运行启动
redis-server加上要修改配置名和值(可以是多对),没有设置的配置将使用默认配置。
# redis-server --configKey1 configValue1 --configKey2 configValue2
例如,如果要用6380作为端口启动Redis,那么可以执行
redis-server --port 6380
虽然运行配置可以自定义配置,但是如果需要修改的配置较多或者希望将配置保存到文件中,不建议使用这种方式。
配置文件启动
将配置写到指定文件里,例如我们将配置写到了/opt/redis/redis.conf中,那么只需要执行如下命令即可启动Redis
# redis-server /opt/redis/redis.conf
TIP
Redis目录下都会有一个redis.conf配置文件,里面就是Redis的默认配置,通常来讲我们会在一台机器上启动多个Redis,并且将配置集中管理在指定目录下,而且配置不是完全手写的,而是将redis.conf作为模板进行修 改。
总而言之,通过配置文件启动的方式提供了更大的灵活性,所以大部分生产环境会使用这种方式启动Redis。
# Redis命令行客户端
现在我们已经启动了Redis服务,下面将介绍如何使用redis-cli连接、操作Redis服务。redis-cli可以使用两种方式连接Redis服务器。
交互式方式连接服务器:通过
redis-cli -h {host} -p {port}
的方式连接到Redis服务,之后所有的操作都是通过交互的方式实现。不再需要redis-cli前缀了redis-cli -h 127.0.0.1 -p 6379
命令式方式连接服务器:用
redis-cli-h ip {host} -p {port} {command}
就可以直接得到命令的返回结果。redis-cli -h 127.0.0.1 -p 6379 get xxx
需要注意的是,若没有-h
参数,则默认是127.0.0.1,若没有-p
参数,则默认是6379端口。
# 停止Redis服务的两种方式
Redis提供了shutdown命令来停止Redis服务,例如要停掉127.0.0.1上6379端口上的Redis服务,可以执行如下操作。
shutdown
可以看到,但我们执行完这个命令,服务端将输出以下日志
8343:M 08 Aug 2019 17:38:14.716 # User requested shutdown...
8343:M 08 Aug 2019 17:38:14.716 * Saving the final RDB snapshot before exiting.
8343:M 08 Aug 2019 17:38:14.731 * DB saved on disk
8343:M 08 Aug 2019 17:38:14.732 # Redis is now ready to exit, bye bye...
需要注意的是,
Redis关闭的过程:断开与客户端的连接、生成持久化文件,是一种相对优雅的关闭方式。
除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程号的方式关闭掉Redis,但是不要粗暴地使用
kill -9
强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况。shutdown还有一个参数,代表是否在关闭Redis前,生成持久化文件。
shutdown nosave | save
# Redis的版本规则
Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。
当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的奇数版本。