20200610 千锋教育 Redis 1. Redis 基础
Redis 基础
Redis 简介
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能 NoSQL 的 key-value 数据库,Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
Redis是一个简单的,高效的,分布式的,基于内存的存工具。
架设好服务器后,通过网络连接(类似数据库),提供 Key- Value 式缓存服务。
简单,是 Redis 突出的特色。简单可以保证核心功能的稳定和优异。
Redis 的作者,叫 Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于 Pivotal 公司。他使用的网名是 antirez。
Redis 特点:
- 性能极高
- 丰富的数据类型
- 原子性
- 丰富的特性
- 高速读写
Redis 的应用场景
- 缓存
- 排行榜
- 计数器
- 分布式会话
- 分布式锁
- 社交网络
- 最新列表
- 消息系统
Redis 的缺点:
- 持久化
- 定时快照(snapshot):代价非常高
- 语句追加(aof):恢复速度慢
- 耗内存
NoSQL
NoSQL,泛指非关系型数据库,即 Not-Only SQL,它可以作为关系型数据库的良好补充。
传统的关系数据库在应付 web2.0 网站,特别是超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
- High performance - 对数据库高并发读写的需求
- Huge Storage - 对海量数据的高效率存储和访问的需求
- High Scalability && High Availability - 对数据库的高可扩展性和高可用性的需求
NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类帯来的挑战,尤其是大数据应用难题
NoSQL 的类别:
- 键值(Key-Value)存储数据库
- 列存储数据库
- 文档型数据库
- 图形(Graph)数据库
NoSQL 数据库的适用场景:
- 数据模型比较简单
- 需要灵活性更强的 IT 系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定 key,比较容易映射复杂值的环境
Redis 安装
Redis 使用标准版本标记进行版本控制:major.minor.patchlevel。偶数的版本号表示稳定的版本, 例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的版本号用来表示非标准版本,例如2.9.x是非稳定版本,它的稳定版本是3.0。
Docker 版安装
# 搜索 Redis 镜像
docker search redis
# 下载镜像
docker pull redis
# 创建并运行容器
docker run -d --name redis -p 6379:6379 redis --requirepass "123456"
# 进入 Redis 客户端
docker exec -it redis redis-cli
Linux 安装
# 1. 确保Linux已经安装gcc
yum -y install gcc automake autoconf libtool make
# 2. 下载Redis
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
# 3. 解压
tar -zxvf redis-5.0.0.tar.gz
# 4. 进入解压目录后编译
make MALLOC=libc
# 5. 安装
# 指定安装目录为/usr/local/redis
make PREFIX=/usr/local/redis install
# 6. 启动
/usr/local/redis/bin/redis-server
# 7. 客户端连接
/usr/local/redis/bin/redis-cli
Redis 配置详解
# 将redis.conf复制到安装文件的目录下
cp /opt/redis/redis-5.0.0/redis.conf /usr/local/redis/
# 启动自定义配置的Redis
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
# 启动 Redis 客户端
## 默认IP本机,端口6379
/usr/local/redis/bin/redis-cli -h IP地址 -p 端口
redis.conf
# Redis 默认不是以守护进程的方式运行,修改为 yes 以守护进程的方式运行
daemonize no
# 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入文件,通过 pidfile 指定
pidfile /var/run/redis_6379.pid
# Redis 监听端口,默认为6379
port 6379
# 绑定的主机地址,指定的主机地址才可以连接上 Redis 服务器
bind 127.0.0.1
# 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
timeout 0
# 指定日志级别,Reids 支持四个级别:debug、verbose、notice、warning
loglevel notice
# 日志记录方式,默认为标准输出(指定为空字符串即为标准输出),如果配置 Redis 为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给 /dev/null
logfile ""
# 设置数据库的数量,默认数据库为 0,可以使用 SELECT <dbid> 命令指定连接的数据库
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# 格式为: save <seconds> <changes>
# 可以注释掉所有 save 配置,或配置 save "" 禁用此功能
save 900 1
save 300 10
save 60 10000
# 指定存储至本地数据库时是否压缩数据,Redis 采用 LZF 算法压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变大
rdbcompression yes
# 本地数据库的存放目录
dir ./
# 本地数据库的文件名
dbfilename dump.rdb
# 设置当本机为 slave 服务时,设置 master 服务的 IP 地址和端口,在 Redis 启动时,它会自动从 master 进行数据同步
# replicaof <masterip> <masterport>
# 当 master 服务设置了密码保护时,slave 服务连接 master 的密码
# masterauth <master-password>
# 设置密码,默认关闭,如果指定了连接密码,客户端连接时需要使用 AUTH <password>
# requirepass xxx
# 设置同一时间最大客户端连接数,默认无限制,如果设置为 0,表示无限制
# maxclients 10000
# 指定 Redis 最大内存限制
# maxmemory <bytes>
# 指定在每次更新后进行日志记录,Redis 默认异步将数据写入磁盘,有的数据一段时间内只存在于内存中
appendonly no
# 指定更新日志文件名
appendfilename "appendonly.aof"
# 指定更新日志条件,共有3个可选值
## always 表示每次更新操作后手动调用 fsync() 将数据写入磁盘(慢,安全)
## everysec 表示每秒同步一次(折衷,默认值)
## no 表示等操作系统进行数据缓存同步到磁盘(快)
appendfsync everysec
内存维护策略
Redis 作为优秀的中间缓存件,时常会存储大量的数据,即使采取了集群部署来动态扩容,也应该即时的整理内存,维持系统性能
在 Redis 中有两种解决方案
1. 为数据设置超时时间
# 设置过期时间
## 设置一个 key 过期的秒数,以秒为单位
EXPIRE key seconds
## 设置 key-value 并设置过期时间(单位:秒)
### 字符串独有的方式
SETEX key seconds value
# 获取 key 的有效时间(单位:秒)
## 返回 -1 为永久有效,不存在(或已过期)的 key 返回 -2
TTL key
- 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠
expire
方法来设置过期时间 - 如果没有设置时间,那缓存就是永不过期
- 如果设置了过期时间,之后又想让缓存永不过期,使用
persist key
2. 采用 LRU 算法动态将不用的数据删除
LRU 是 Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。
内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做 LRU,操作系统会根据哪些数据属于 LRU 而将其移出内存而腾出空间来加载另外的数据。
volatile-lru
:设定超时时间的数据中,删除最不常使用的数据allkeys-lru
:查询所有的 key 中最近最不常使用的数据进行删除,这是应用最广泛的策略volatile-random
:在已经设定了超时的数据中随机删除allkeys-random
:查询所有的 key,之后随机删除volatile-ttl
:查询全部设定超时时间的数据,之后排序,将马上将要过期的数据进行删除操作noeviction
:如果设置为该属性,则不会进行删除操作,如果内存溢岀则报错返回volatile-lfu
:从所有配置了过期时间的键中删除使用频率最少的键allkeys-lfu
:从所有键中删除使用频率最少的键
自定义配置 Redis
修改 redis.conf
daemonize no # 修改为 yes 以守护进程方式启动
bind 127.0.0.1 # 注释掉,允许出本机外的其他机器访问本机 Redis 服务
requirepass # 设置密码,保证服务安全,有些情况下不设置密码是无法进行远程连接访问的
- Redis 采取的是单进程多线程的模式
- Redis Desktop Manager 需要设置密码才可以连接
Redis 关闭
非正常关闭方式
断电、杀进程等非正常关闭方式。容易数据丢失。
# 获取 PID
## 通过命令查询 Redis 进程
ps -ef | grep -i redis
## 通过 pidfile 获取 PID
cat /var/run/redis_6379.pid
# 杀进程
kill -9 PID
正常关闭方式
正常关闭,可以保存数据
关闭 Redis 服务,通过客户端使用 shutdown
命令
如果 Redis 设置了密码,需要先在客户端通过密码登录,再进行 shutdown 即可关闭服务端