Ø 简介
本文主要记录 Redis 的基础介绍,包含如下内容:
1. Redis 简介
2. Redis 的适用场景
3. Redis 的特点
4. Redis 的安装与部署
5. Redis 的配置
6. Redis 的性能测试
1. Redis 简介
Ø Redis 是由意大利人 Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库;
Ø Redis 全称为:Remote Dictionary Server(远程数据服务),该软件使用 C语言编写;
Ø Redis 是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案,它通常被称为数据结构服务器。
Ø 支持丰富的数据类型,例如:string、list、set、zset(sorted set)、hash。
Ø 提供的 API 语言包括:C、C++、C#、Clojure、Common Lisp、Erlang、Haskell、Java、JavaScript、Lua、Objective-C、Perl、PHP、Python、Puby Scala、GO、Tcl 等。
Ø Redis 官方网站:http://www.redis.io/
Ø 尽量使用 3.2 以上版本,才具有官方提供的 Redis 集群支持(RedisCluster)。
2. Redis 的适用场景
1) 取最新的 N 个数据的操作;
2) 排行榜应用,取 TOP N 的操作;
3) 需要精确设定过期时间的应用;
4) 计数器应用;
5) Uniq 操作,获取某段时间所有数据排重值;
6) 实时系统,反垃圾系统;
7) Pub/Sub(发布/订阅)构建实时消息系统;
8) 构建队列系统;
9) 缓存
目前全球最大的 Redis 用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着 Redis,有 +4G 的数据在 Redis 上来为微博用户提供服务。
在新浪微博 Redis 的部署场景很多,大概分为如下的 2 种:
1) 应用程序直接访问 Redis 数据库:这样的方式存在不安全的问题,如果数据库服务断电或者死机,就会照成数据的丢失。
2) 应用程序直接访问 Redis,只有当 Redis 访问失败时才访问 MySQL。
3. Redis 的特点
Ø 非常快速:Redis 是非常快速的,每秒可以执行大约 110000 个设置操作,81000个/每秒的读取操作。
Ø 支持丰富的数据类型:Redis 支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
Ø 原子性操作:所有的 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
Ø MultiUtility 工具:Redis 是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis 原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
Ø Redis 整体的特点是速度快,支持的数据类型丰富,但是并不只有 Redis 具备有这样的特点,Redis 是属于缓存数据的第二代产品了,而第一代产品就是 memcached 数据库。
Ø Redis 与 Memcached 的区别
1. Redis 支持比 Memcached 更多的数据类型;
2. Redis 支持主从结构(Master-Slave)可以实现数据备份;
3. Redis 支持数据持久化,可以将数据保存到磁盘上,重启时数据依然可用。
4. Redis 的安装与部署
1) 介绍
1. Redis 给出的安装包只是源代码的开发包(C程序的源文件),既然是 C 语言的文件,那么如果要想使用 Redis,就必须进行代码的编译处理。理论上这些编译的环境可以在任意的操作系统之中执行,但是考虑到实际的应用环境,更多的是在 Linux 下完成。
2. 如果非要在 Windows 中执行,可以去下载一个 cygwin 的 UNIX 模拟环境。
2) 安装步骤
1. 第一步:下载安装包,官方下载地址:https://redis.io/download
2. 第二步:将 Redis 安装包上传到 Linux 系统之中,但是需要注意,由于给出的安装包属于源代码,所以还需要进行解压,解压到“/usr/local/src”的目录:
tar -xzvf /jingle/redis-5.0.5.tar.gz -C /usr/local/src/
3. 第三步:编译源程序
1) 进入 Redis 源代码所在的安装目录(就是之前解压的目录):
cd /usr/local/src/redis-5.0.5/
2) 输入编译命令:make
可能出现如下错误:
1. /bin/sh: cc: 未找到命令
安装 gcc 即可:yum install gcc-c++ -y
2. zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
输入命令:make MALLOC=libc
4. 第四步:安装 Redis
cd src #进入 /redis-5.0.5/src/ 目录下
make install #安装 Redis
5. 第五步:移动文件,便于管理
mkdir -p /usr/local/redis/bin #创建 bin 文件夹
mkdir -p /usr/local/redis/etc #创建 etc 文件夹
cd /usr/local/src/redis-5.0.5 #进入 redis 安装目录
mv ./redis.conf /usr/local/redis/etc/ #移动 redis.conf 文件
cd src #进入 src 目录
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin/ #将所有标绿的文件移动到 bin 目录下
文件解释:
redis-server | Redis 服务启动程序 |
redis-cli | Redis 命令行客户端 |
redis-benchmark | 性能测试工具 |
6. 第六步:启动 Redis 服务
1) 修改 redis.conf 配置文件,将 Redis 设置为后台启动
daemonize no #改为yes
注意:设置后台启动后就不会打印 Redis-server 启动日志了,例如:
daemonize no 的启动日志:
daemonize yes 的启动日志:
2) 启动 Redis 服务
[root@localhost bin]# ./redis-server /usr/local/redis/etc/redis.conf
3) 检查 Redis 是否启动成功
ps -ef | grep redis #查看程序是否启动
或者
!net #查看端口是否运行
或者
netstat -tunpl | grep 6379
注:Redis 服务端的默认连接端口是6379
7. 第七步:连接和退出 Redis 客户端
/usr/local/redis/bin/redis-cli #客户端远程连接(方式1)
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 #客户端远程连接(方式2)
/usr/local/redis/bin/redis-cli -a abeam. info replication #登录后发送命令
quit | exit #退出客户端
8. 第八步:关闭 Redis 服务
pkill redis-server
或者
killall redis-server
或者
/usr/local/redis/bin/redis-cli shutdown
5. Redis 的配置
1) 配置 Redis 内存支配
Redis 属于内存缓存数据库,那么如果是一台单独的 Redis 服务器,则应该考虑将所有的可用内存都交给 Redis 来进行支配,所以理论上还需要执行如下的一行代码:
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf |
以上命令用于设置内存的分配策略,vm.overcommit_memory 可以设置值如下:
0:表示在进行处理时首先检查是否有足够的内存供应,如果没有足够的内存供应则无法分配,内存申请失败;如果有可用内存则直接进行申请开辟;
1:表示将所有的内存都交给应用使用,而不关心当前的内存状态如何;
2:表示允许分配超过所有物理内存和交换空间的内存总和;
再执行命令,将以上的配置写入到内核参数之中:/sbin/sysctl -p
2) Redis 数据库配置
Redis 主要使用 redis.conf 配置文件来完成。
1. Redis 作为一个具备持久化功能的缓存数据库,所以一定会有一个用于数据存储的目录,一般有三类文件需要保存:Redis 运行的 pid、Redis 相关的处理日志、Redis 的数据文件。
mkdir -p /usr/local/redis/{run,logs,dbcache}
2. 修改 redis.conf 的配置文件:
vim /usr/local/redis/etc/redis.conf
配置 Redis 运行端口 | port 6379 |
配置 Redis 是否为后台运行 | daemonize yes |
设置进程保存路径 | pidfile /usr/local/redis/run/redis_6379.pid |
设置日志保存路径 (启动 redis-server 的日志将输出在此文件中) | logfile "/usr/local/redis/logs/redis.log" |
该 Redis 支持的数据库数量 | databases 16 |
保存数据库文件的目录 | dir /usr/local/redis/dbcache/ |
3) redis.conf 配置说明
1. daemonize: 是否在后台运行 Redis,取值为no/yes.
2. pidfile: 配置多个pid的地址,默认在/var/run/redis.pid
3. bind: 绑定ip,设置后只接受来自该 ip 的请求
4. port: 监听端口,默认为6379
5. timeout: 设置客户端连接时的超时时间,单位为秒
6. loglevel: 分为4级,debug、verbose、notice、warning
7. logfile: 配置 log 的文件地址
8. databases: 设置数据库的数量,默认使用的数据库为0
9. save: 设置 redis 进行数据库镜像的频率
10. rdbcompression: 在进行镜像备份时,是否进行压缩
11. Dbfilename: 镜像备份文件的文件名
12. Dir: 数据库镜像备份的文件放置路径
13. Slaveof: 设置数据库为其他数据库的从数据库
14. Masterauth: 主数据库连接需要的密码验证
15. Requirepass: 设置登录时需要使用的密码
16. Maxclients: 限制同时连接的客户数量
17. Maxmemory: 设置 redis 能够使用的最大内存
18. Appendonly: 开启 append only 模式
19. Appendfsync: 设置对 appendonly.aof 文件同步的频率
20. vm-enabled: 是否开启虚拟内存支持
21. vm-swap-file: 设置虚拟内存的交换文件路劲
22. vm-max-memory: 设置 redis 使用的最大物理内存大小
23. vm-page-size: 设置虚拟内存的页大小
24. vm-pages 设置交换文件的总的 page 数量
25. vm-max-threads 设置 VMIO 同时使用的线程数量
26. Glueoutputbuf 把小的输出缓存放在一起
27. hash-max-zipmap-entries 设置 hash 的临界值
28. Activerehashing 重新hash
6. Redis 的性能测试
在 Redis 中有一个"redis-benchmark"的性能测试工具,可以直接使用该工具来观察 Redis 的运行情况,该命令所需的参数如下:
-h <hostname> Server hostname (default 127.0.0.1) -p <port> Server port (default 6379) -s <socket> Server socket (overrides host and port) -a <password> Password for Redis Auth -c <clients> Number of parallel connections (default 50) -n <requests> Total number of requests (default 100000) -d <size> Data size of SET/GET value in bytes (default 3) --dbnum <db> SELECT the specified db number (default 0) -k <boolean> 1=keep alive 0=reconnect (default 1) -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD Using this option the benchmark will expand the string __rand_int__ inside an argument with a 12 digits number in the specified range from 0 to keyspacelen-1. The substitution changes every time a command is executed. Default tests use this to hit random keys in the specified range. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). -e If server replies with errors, show them on stdout. (no more than 1 error per second is displayed) -q Quiet. Just show query/sec values --csv Output in CSV format -l Loop. Run the tests forever -t <tests> Only run the comma separated list of tests. The test names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait. |
范例:下面模拟1000个客户端进行数据的处理
# /usr/local/redis/bin/redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -d 10 -n 10000
此命令的参数含义如下:
-h: 要连接的 Redis 服务器的地址
-p: 要连接 Redis 的运行端口
-c: 模拟客户端的数量
-d: 每次操作的数据长度
-n: 每个客户端发出的请求数量
测试结果如下(以 set 命令举例):
====== SET ======
65359.48 requests per second #表示 set 请求,可以每秒65359.48次请求