DBA Redis 基础学习
基础知识
Redis简介
Redis是一个开源项目,是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string、hash、list、set、zset等多种数据类型。
而同为键值对形式存储的Memcached来说则仅支持字符串类型。
Redis会将所有的数据都存放在内存中,所以他的读写性能非常惊人(会是MySQL的千万倍)。
不仅如此,Reids还可以将内存中的数据利用快照和日志的形式保存到硬盘上实现持久化存储,这也是Memcached所不支持的。
Reids还提供了TTL(键过期)、发布订阅、事务、流水线等功能。
Redis特性
1)速度快:
- Redis所有的数据都存放在内存中
- Redis使用C语言实现
- Redis使用单线程架构
2)丰富的数据结构:
- string 字符串
- string 列表
- string 集合
- zset 有序集合
- hash 哈希类型
3)丰富的功能:
- 提供了键过期功能,可以实现缓存
- 提供了发布订阅功能,可以实现消息系统
- 提供了 pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销
4)简单稳定:
- Redis在3.0版本之后,仅有5万行代码
- 使用单线程模型法,使得Redis服务端处理模型变得简单
- 不依赖操作系统的中的类库
5)客户语言多,拥有各大主流语言的官方驱动:
- Java
- PHP
- Python
- C、C++
- Node.Js
- Go
6)支持数据持久化:
- 快照方案:RDB
- 日志方案:AOF
7)支持主从复制、自带高可用架构:
- 哨兵
- 集群
值得一提的是,在旧版的Redis中是不支持多线程技术的,但是在新版本后能够支持多线程。
单线程的Redis读取数据为什么快?主要有以下几点原因:
- 数据存储在内存中
- 利用io多路复用技术
- 没有上下文切换,资源消耗小
Redis功能
基于键过期(TTL)的特性,可以提供缓存服务:
- 缓存session会话
- 缓存用户信息、找不到再去MySQL中查、将查询结果获取然后写到Redis中
基于列表与有序集合,可以做排行榜:
- 热度排名排行榜
- 发布时间排行榜
基于字符串的incr与decr,可以做计数器:
- 帖子浏览数
- 视频播放数
- 商品浏览数
基于集合,可以做社交网络相关的功能:
- 共同好友、共同喜好
- 基于共同喜好进行内容推送
Redis版本
Redis使用标准版本标记进行版本控制,偶数的版本号表示稳定的版本,奇数的版本号用来表示非标准版本。
目前已更新至6.2版本,所以我们使用最新版即可。
安装部署
编译安装
首先下载Redis:
$ cd ~
$ wget https://download.redis.io/releases/redis-6.2.1.tar.gz
整个Redis只有2.4M,非常的小。
接下来配置目录,由于考虑到后面的集群搭建,所以我们这样规划目录:
$ mkdir -p /usr/local/redis_cluster/redis_6379/{conf,pid,logs}
# 目录说明:
/usr/local/redis_cluster/ # redis服务相关文件目录
└── redis_6379 # 6379端口数据文件相关目录
├── conf # 6379端口配置文件存放目录
├── logs # 6379端口日志文件存放目录
└── pid # 6379端口pid文件存放目录
进行解压:
$ tar -zxvf redis-6.2.1.tar.gz -C /usr/local/redis_cluster/
编译安装:
$ cd /usr/local/redis_cluster/redis-6.2.1/
$ make # 在src目录下生成各种服务命令
$ make install # 添加服务命令软链接至环境变量
检查make生成的服务命令:
$ ls /usr/local/redis_cluster/redis-6.2.1/src
检查make install 生成的软链接:
$ ls /usr/local/bin | grep redis
常见问题
如出现提示,代表gcc环境未被安装:
CC adlist.o
解决方案,安装gcc:
$ yum install -y gcc
清空上次编译失败残留文件:
$ make distclean
再次进行编译安装:
$ make
$ make install
配置文件
书写配置文件:
$ vim /usr/local/redis_cluster/redis_6379/conf/redis.cnf
填写以下信息,注意配置文件中注释一定要在配置项上方,而不能在后方:
# 以守护进程模式启动
daemonize yes
# 绑定的主机地址,一般设为本地即可,如设置为0.0.0.0则允许所有地址登录
bind 192.168.0.120
# 监听端口
port 6379
# pid文件和log文件的保存地址
pidfile /usr/local/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /usr/local/redis_cluster/redis_6379/logs/redis_6379.log
# 设置数据库的数量,默认数据库为0
databases 16
# 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
# 本地数据库的目录
dir /usr/local/redis_cluster/redis_6379
启停服务
指定配置文件进行启动:
$ redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf
登录Redis提供的shell,redis默认有16个库,如下操作会自动进入db0中:
$ redis-cli -h 192.168.0.120 -p 6379
192.168.0.120:6379> EXIT
关闭服务,在redis-cli命令后跟上shutdown:
$ redis-cli -h 192.168.0.120 -p 6379 shutdown
$ ps -ef | grep redis
或者你也可以在shell中使用shutdown命令:
192.168.0.120:6379> SHUTDOWN
配置大全
自带配置
有的时候我们可能想要查询一些Redis配置,我们可以翻阅Redis自带的配置文件。
但是这个配置文件需要我们自动生成:
1)生成配置文件
$ cd /usr/local/redis_cluster/redis-6.2.1/utils/
$ ./install_server.sh
2)如果你是centos7系统,它会告诉你你似乎使用systemd在进行管理,你需要修改一些配置:
$ vim ./install_server.sh
注释掉下面的内容:
#bail if this system is managed by systemd
_pid_1_exe="$(readlink -f /proc/1/exe)"
if [ "${_pid_1_exe##*/}" = systemd ]
then
echo "This systems seems to use systemd."
echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
exit 1
fi
3)再次运行:
$ ./install_server.sh
欢迎使用redis服务安装程序
该脚本将帮助您轻松设置正在运行的Redis服务器
请为此实例选择redis端口:[6379]
选择默认值:6379
请选择redis配置文件名[/etc/redis/6379.conf]
选定的默认值-/etc/redis/6379.conf
请选择redis日志文件名[/var/log/redis_6379.log]
选定的默认值-/var/log/redis_6379.log
请选择此实例的数据目录[/var/lib/redis/6379]
选定的默认值-/var/lib/redis/ 6379
请选择redis可执行文件路径[/usr/local/bin/redis-server]
选定的配置:
端口:6379
配置文件:/etc/redis/6379.conf
日志文件:/var/log/redis_6379.log
数据目录:/var/lib/redis/6379
可执行文件:/usr/local/bin/redis-server
可执行文件Cli:/usr/local/bin/redis-cli
这个可以吗?然后按ENTER继续,或按Ctrl-C放弃。
复制/tmp/6379.conf => /etc/init.d/redis_6379
正在安装服务...
已成功添加到chkconfig中!
已成功添加到运行级别345!
正在启动Redis服务器...
安装成功!
4)它会默认给你启动一个Redis服务,把他关闭掉:
$ ps -ef | grep redis
root 30356 1 0 06:29 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:6379
root 30879 15369 0 06:32 pts/0 00:00:00 grep --color=auto redis
$ redis-cli -h 127.0.0.1 -p 6379 shutdown
5)查看配置文件:
$ vim /etc/redis/6379.conf
安全设置
默认情况下,我们可以在任意位置链接Redis服务。
与MongoDB与MySQL的安全策略不同,Redis的安全策略没有角色和权限之分。
你只需要在配置文件中,为Redis设置一个登录密码,这样在进行服务链接请求时,将会被要求输入此密码。
使用以下命令,查看当前是否Redis服务是否已经设置了密码验证:
$ redis-cli -h 192.168.0.120 -p 6379
192.168.0.120:6379> config get requirepass
1) "requirepass"
2) ""
2为空,代表为设置。
进入Redis配置文件中对其进行设置:
# 安全密码认证
requirepass 123456
重启Redis服务,现在登录后执行任何操作都会要求你输入认证密码:
# 停止服务
$ redis-cli -h 192.168.0.120 -p 6379 shutdown
# 启动服务
$ redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf
$ redis-cli -h 192.168.0.120 -p 6379
# 执行查询操作
192.168.0.120:6379> config get requirepass
(error) NOAUTH Authentication required.
# 输入验证密码
192.168.0.120:6379> AUTH 123456
OK
# 再次执行查询操作
192.168.0.120:6379> config get requirepass
1) "requirepass"
2) "123456"
你也可以在链接服务时指定参数-a并输入密码,如下所示:
$ redis-cli -h 192.168.0.120 -p 6379 -a 123456