初识 Redis
《 Redis 开发与运维》的学习笔记,希望大家多多指导。
什么是 Redis
- Redis 的全称是 Remote Dictionary Server, 远程字典服务器。
- Redis是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,是一种 NoSQL 数据库。
- 相关网站
Redis 的特点
-
- 速度快
- 为什么快 ?
- Redis 的所有数据都是存放在内存中的(最主要的原因)
- Redis 是用 C 语言实现的, 一般来说 C 语言实现的程序“距离”操作系统更近,执行速度相对会更快
- Redis 使用了单线程架构,预防了多线程可能产生的竞争问题
- Redis 源代码优良,集性能和优雅于一身
- 基于键值对的数据结构服务器
-
- 丰富的功能
- 5 种数据结构
- 字符串
- Bitmaps
- HyperLogLog
- GEO , 地理信息定位 ( 3.2 版本 )
- 哈希
- 列表
- 集合
- 有序集合
- 提供了键过期功能,可以用来实现缓存。
- 提供了发布订阅功能,可以用来实现消息系统。
- 支持 Lua 脚本功能,可以利用 Lua 创造出新的 Redis 命令。
- 提供了简单的事务功能,能在一定程度上保证事务特性。
- 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到 Redis,减少了网络的开销。
-
- 简单稳定
- 简单
- Redis 的源码很少
- Redis 使用单线程模型
- Redis 不需要依赖于操作系统中的类库
-
- 客户端语言多
- Redis 提供了简单的 TCP 通信协议
-
- 持久化
- RDB
- AOF
-
- 主从复制
- Redis 提供了复制功能,实现了多个相同数据的 Redis 副本,复制功能是分布式 Redis 的基础
-
- 高可用和分布式
- 2.8 版本,高可用实现 Redis Sentinel,它能够保证 Redis 节点的故障发现和故障自动转移
- 3.0 版本, 分布式实现 Redis Cluster, 它是 Redis 真正的分布式实现,提供了高可用、读写和容量的扩展性。
Redis 使用场景
Redis 可以做什么
- 缓存
-
- 排行榜系统
- 列表和有序集合数据结构
- 3.计数器应用
- 视频播放数
- 4.社交网络
- 赞/踩,粉丝,共同好友/喜好, 推送,下拉刷新
-
- 消息队列系统
- Redis 提供了发布订阅通能和阻塞队列的功能,基本可以满足简单的消息队列功能
Redis 不可以做什么
- 数据规模
- 基于内存,不适合大规模数据,经济成本非常高;适用于小规模数据
- 数据冷热
- 热数据
- 指需要频繁操作的数据
- 冷数据
- 热数据适合放到 Redis 中加速读写,冷数据不适合
- 热数据
用好 Redis 的建议
- 切勿当作黑盒使用,开发与运维同样重要
- 阅读源码
Redis 的基础操作
安装
- Linux 系统
# 下载 Redis 制定版本的源码压缩包到当前目录
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
# 解压缩
tar xzf redis-3.0.7.tar.gz
# 建立 redis 目录的软连接,为了不把 redis 目录固定到指定版本上,利于未来升级
ln -s redis-3.0.7 redis
cd redis
# 将相关运行文件放到 /usr/local/bin/ 下,编译之前确保操作系统已经安装gcc
make
# 安装
make install
# 安装结束后,验证
redis-cli -v
- Windows 下
配置、启动、操作、关闭 Redis
-
src 和 /usr/local/bin 目录下可执行文件说明
可执行文件 作用 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-server
-
运行启动
redis server --configName1 configValue --configName2 configValue2 # 例如, 以 6666 作为端口启动 Redis redis-server --port 6666
-
配置文件启动
-
默认配置文件位置: redis 文件夹下 redis.conf
配置名 配置说明 port 端口 logfile 日志文件 dir Redis 工作目录(粗放持久化文件和日志文件) daemonize 是否以守护进程的方式启动 Redis (后台启动) redis-server /opt/redis/redis.conf
-
-
Redis 命令行客户端
# 两种连接方式
## 第一种 redis-cli -h {host} -p {port}
redis-cli -h 127.0.0.1 -p 6379
# 取值
get hello
## 第二种 redis-cli -h ip{host} -p {port} {command}
redis-cli -h 127.0.0.1 -p 6379 get hello
- 停止 Redis 服务
# 关闭过程: 断开与客户端的连接、持久化文件生成
`redis-cli shutdown
# 带参数关闭
## 关闭前不生成持久化文件
redis-cli shutdown nosave
## 关闭前生成持久化文件
redis-cli shutdown save
# 使用杀死进程的方法关闭
kill redis进程号
# 注意:不能粗暴的使用 kill -9 强制杀死进程,这样不会持久化操作,同时有可能不能正常关闭和丢失数据
- 卸载 Redis
- 关闭 Redis 服务
- 删除相关文件或文件夹
- 安装目录文件夹
- /usr/local/bin 下的启动文件
设置 Redis 开机自启动 ( Linux )
-
init.d 方式 ( CentOS 6 之前版本,包括 CentOS6 )
- 基本原理
- 系统开机启动时会去加载 /etc/init.d/ 下面的脚本,通常而言每个脚本文件会自定义实现程序的启动;若想将新的程序开机自启动,只需在该目录下添加一个自定义启动程序的脚本,然后设置相应规则即可。
- 步骤
-
编写自启动脚本 redis
# chkconfig: 2345 10 90 # description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 #实际环境而定 EXEC=/usr/local/bin/redis-server #实际环境而定 REDIS_CLI=/usr/local/bin/redis-cli #实际环境而定 PIDFILE=/var/run/redis.pid CONF="/opt/redis/redis.conf" #实际环境而定 case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed." else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE exists, process is not running." else PID=$(cat $PIDFILE) echo "Stopping..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x $PIDFILE ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac
-
设置权限并测试
# 设置可执行权限 chmod 755 redis # 启动测试 /etc/init.d/redis start
-
设置开机自启动并测试
# 设置开机自启动 chkconfig redis on # 关机重启并验证 reboot redis-cli
-
- 注意
- redis 服务名称可以自定义
- redis_6666, redis_666.service
- redis 服务名称可以自定义
- 基本原理
-
systemctl 方式 ( CentOS7 )
- 基本原理
- 使用 systemctl 进行服务管理
- 步骤
- 创建systemctl 服务
# 在/lib/systemd/system 目录下创建一个脚本文件redis.service # 脚本内容 # 基本信息 [Unit] ## 描述信息 Description=Redis ## 在哪个服务之后启动 After=network.target # 服务信息 [Service] Type=forking ## 启动服务的命令 ExecStart=/usr/local/bin/redis-server /opt/redis/redis.conf ## 重启服务的命令 ExecReload=/usr/local/bin/redis-server -s reload ## 停止服务的命令 ExecStop=/usr/local/bin/redis-server -s stop PrivateTmp=true # 安装相关信息 [Install] ## 以何种方式启动,当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行 WantedBy=multi-user.target
- 刷新配置并设置为开机启用
# 刷新配置 systemctl daemon-reload # 启动服务 systemctl start redis.service # 重新启动 systemctl restart redis.service # 停止服务 systemctl stop redis.service # 开机启用 systemctl enable redis.service # 禁止开机启动 systemctl disable redis.service # 当前状态 systemctl status redis.service
- 创建systemctl 服务
- 基本原理