目录
一.关系型数据库与非关系型数据库
1.关系型数据库
2.非关系型数据库
3.二者区别
4.非关系型数据库产生背景
5.NoSQL与SQL数据记录对比
关系型数据库
非关系型数据库
二.Redis相关概述
1.简介
2.五大数据类型
3.优缺点
3.1.优点
3.2.缺点
4.使用场景
5.采用单线程的原因
6.哪些数据适合放入缓存中
7.运行速度快的原因
8.与memcached比较
三.Redis的安装配置
1.源码编译安装
2.redis服务管理
五.Redis的命令工具
1.redis-cli 命令行工具
2.redis-benchmark 测试工具
2.1.并发连接
2.2.数据包的存取的性能测试
2.3.键值对的创建速度测试
六.Redis 数据库常用命令
1.redis键值对的存取
2.redis键值列表的获取
2.1.获取全部列表
2.2.获取以某字符为开头任意长度的键
2.3.获取以某字符为开头,后面为指定长度的键
3.判断键是否存在
4.删除键
5.查看键存储的数据类型
6.rename 重命名
7.renamenx 重命名
8.dbsize查看键数目
9.设置和清空密码
设置和查看密码
清空密码
七.Redis 多数据库操作
1.多数据库间切换select
2.多数据库间移动数据
3.清除数据库内数据(慎用)
八.Redis 常见错误与解决方案
1.常见运维故障
2.故障排查
一.关系型数据库与非关系型数据库
1.关系型数据库
2.非关系型数据库
3.二者区别
SQL | NoSQL | |
存储结构 | 二维表格结构 | 不是二维表格结构,不同的NoSQL采用不同的存储方式(比如键对值、文档、索引、图形结构、时间序列等) |
扩展方式 | 纵向扩展(提升单机的硬件性能) | 横向扩展(增加服务器节点数量) |
事务典型 | 基于ACID原则,对事务控制更稳定,细粒度更高 | 基于BASE原则,对事务控制的稳定性和细粒度不如SQL |
典型代表 |
4.非关系型数据库产生背景
可用于应对Web2.0纯动态网站类型的三高问题
- High performance —— 对数据库高并发读写需求
- Hugestorage——对海量数据高效存储与访问需求
- HighScalability&&HighAvailability——对数据库高可扩展性与高可用性需求
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数
据库发展带来新的思路。让关系型数据库关注在关系上和对数据的一致性保障,非关系型数据库关
注在存储和高效率上。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在
非关系型数据库中,提升访问速度
5.NoSQL与SQL数据记录对比
关系型数据库
- 实例-->数据库-->表(table)-->记录行(row)、数据字段(column)
非关系型数据库
- 实例-->数据库-->集合(collection)-->键值对(key-value)
- 非关系型数据库不需要手动建数据库和集合(表)
二.Redis相关概述
1.简介
2.五大数据类型
基础数据类型包括:string(字符串)、list(列表,双向链表)、hash(散列,键值对集合)、set(集合,不重复)和sorted set也可以称为Zset(有序集合)
结构类型 | 结构存储的值 | 结构的读写能力 |
String | 可以是字符串、整数、浮点数 | 对整个字符串或者字符串的其中一部分进行操作,对整数和浮点数执行自增或者自减操作 |
list | 一个链表,链表上每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素:根据偏移量对链表进行修剪:读取单个或多个元素,根据值查找或者移除元素 |
set | 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二各不相同的 | 添加、获取、移除单个元素,检查一个元素是否存在与集合中,计算交集、并集、差集,从集合里面随机获取元素 |
hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对,获取所有键值对 |
zset | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素,根据分值范围或者成员来获取元素 |
3.优缺点
3.1.优点
3.2.缺点
- 缓存和数据库双写一致性问题
- 缓存雪崩问题
- 缓存击穿问题
- 缓存的并发竞争问题
4.使用场景
- Redis作为基于内存运行的数据库,是一个高性能的缓存,一般应用在Session缓存、队列、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等
- Redis 适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景
- 通常会将部分数据放入缓存中,来提高访问速度,然后数据库承担存储的工作
5.采用单线程的原因
首先要明确的是Redis单线程指的是网络IO和键值对读写是由一个线程来完成的,但Redis持久
化、集群数据等是由额外的线程执行的。了解Redis使用单线程之前可以先了解一下多线程的开
销
通常情况下,使用多线程可以增加系统吞吐率或者可以增加系统扩展性,但多线程通常会存在同时
访问某些共享资源,为了保证访问共享资源的正确性,就需要有额外的机制进行保证,这个机制首
先会带来一定的开销。其实对于多线程并发访问的控制一直是一个难点问题,如果没有精细的设
计,比如说,只是简单地采用一个粗粒度互斥锁,就会出现不理想的结果。即使增加了线程,大部
分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增
加
此外
值得注意的是在Redis6.0中引入了多线程。在Redis6.0之前,从网络IO处理到实际的读写命令处理
都是由单个线程完成的,但随着网络硬件的性能提升,Redis的性能瓶颈有可能会出现在网络IO的
处理上,也就是说单个主线程处理网络请求的速度跟不上底层网络硬件的速度。针对此问题,
Redis采用多个IO线程来处理网络请求,提高网络请求处理的并行度,但多IO线程只用于处理网络
请求,对于读写命令,Redis仍然使用单线程处理!
6.哪些数据适合放入缓存中
- 即时性 例如查询最新的物流状态信息。
- 数据一致性要求不高 例如门店信息,修改后,数据库中已经改了,五分钟后缓存中才是最新的,但不影响功能使用。
- 访问量大且更新频率不高 例如网站首页的广告信息,访问量大,但是不会经常变化。
7.运行速度快的原因
- Redis是基于内存运行,数据的读写都是在内存中完成的
- 数据结构简单,可以直接使用 键值对 的方式存储数据
- 数据读写采用单线程模型,避免了多线程切换带来的CPU性能损耗,同时也不用考虑各种锁的影响
- 采用IO多路复用模型,非阻塞IO可以使网络线程处理更多的网络连接请求,提高了网络并发能力
8.与memcached比较
三.Redis的安装配置
1.源码编译安装
---------------------- Redis 安装部署 ----------------------------------------
//环境准备
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#修改内核参数
vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048
sysctl -p
//安装redis
yum install -y gcc gcc-c++ make
cd /opt/
tar xf redis-7.0.13.tar.gz
cd /redis-7.0.13
make
make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
#创建redis工作目录
mkdir /usr/local/redis/{conf,log,data}
cp /opt/redis-7.0.13/redis.conf /usr/local/redis/conf/
useradd -M -s /sbin/nologin redis
chown -R redis.redis /usr/local/redis/
#环境变量
vim /etc/profile
PATH=$PATH:/usr/local/redis/bin #增加一行
source /etc/profile
//修改配置文件
vim /usr/local/redis/conf/redis.conf
bind 127.0.0.1 192.168.80.108 #87行,添加 监听的主机地址
protected-mode no #111行,将本机访问保护模式设置no。如果开启了,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
port 6379 #138行,Redis默认的监听6379端口
daemonize yes #309行,设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6379.pid #341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6379.log" #354行,指定日志文件
dir /usr/local/redis/data #504行,指定持久化文件所在目录
requirepass abc123 #1037行,增加一行,设置redis密码
2.redis服务管理
//定义systemd服务管理脚本
vim /usr/lib/systemd/system/redis-server.service
[Unit]
Description=Redis Server
After=network.target
[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/log/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#启动服务
systemctl start redis-server
systemctl enable redis-server
netstat -lntp | grep 6379
五.Redis的命令工具
redis-server | 用于启动redis的工具 |
redis-benchmark | 用于检测redis在本机的运行效率 |
redis-check-aof | 修复AOF持久化文件 |
redis-check-rdb | 修复RDB持久化文件 |
redis-cli | redis命令行工具 |
redis-sentinel | Redis 哨兵集群使用 |
1.redis-cli 命令行工具
语法:redis-cli -h host -p port [-a password]
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
redis-cli -h 192.168.80.108 -p 6379 -a 'abc123'
2.redis-benchmark 测试工具
redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能
基本的测试语法:redis-benchmark [选项] [选项值]
-h :指定服务器主机名
-p :指定服务器端口
-s :指定服务器 socket
-c :指定并发连接数
-n :指定请求数
-d :以字节的形式指定 SET/GET 值的数据大小
-k :1=keep alive 0=reconnect
-r :SET/GET/INCR 使用随机 key, SADD 使用随机值
-P :通过管道传输<numreq>请求
-q :强制退出 redis。仅显示 query/sec 值
--csv :以 CSV 格式输出
-l :生成循环,永久执行测试
-t :仅运行以逗号分隔的测试命令列表
-I :Idle 模式。仅打开 N 个 idle 连接并等待
2.1.并发连接
redis-benchmark -h 192.168.80.108 -p 6379 -a 'abc123' -c 100 -n 100000
2.2.数据包的存取的性能测试
redis-benchmark -h 192.168.80.108 -p 6379 -a 'abc123' -q -d 100
2.3.键值对的创建速度测试
redis-benchmark -t set,lpush -a 'abc123' -n 100000 -q
六.Redis 数据库常用命令
set | 存放数据 |
get | 获取数据 |
keys * | 查看所有的key |
keys k? | 查看k开头后面任意一位的数据 |
exists | 判断键是否存在(存在1,不存在0) |
del | 删除键 |
type | 查看键对应的value值类型 |
rename key1 key2 | 改名,不管key2是否存在都会改名成功。如果存在,key1的值会覆盖key2得值 |
renamenx key1 key2 | 改名,若key2不存在,可以改名成功。若key2存在则不进行改名 |
dbsize | 查看当前数据库中key的数目 |
1.redis键值对的存取
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
2.redis键值列表的获取
设置键值
2.1.获取全部列表
2.2.获取以某字符为开头任意长度的键
keys h*
2.3.获取以某字符为开头,后面为指定长度的键
添加测试数据
keys v??
keys v???
keys v????
3.判断键是否存在
exists 键
#返回结果 为0 则为不存在,返回为1即为存在
4.删除键
del 键
5.查看键存储的数据类型
type 键
6.rename 重命名
- 使用rename命令进行重命名时,无论目标key是否存在都会进行重命名,且源key的值会覆盖目标key的值
- 在实际使用过程中,建议先用exists命令查看目标key 是否存在,然后再决定是否执行rename 命令,以避免覆盖重要数据
命令格式: rename 源key 目标key
7.renamenx 重命名
- 是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名。(不覆盖)
命令格式:renamenx 源key 目标key
8.dbsize查看键数目
dbsize
9.设置和清空密码
设置和查看密码
#设置redis的登录密码
config set requirepass 123123
#查看redis的密码
config get requirepass
清空密码
#清空密码
config set requirepass ''
七.Redis 多数据库操作
- Redis 支持多数据库,Redis默认情况下包含16个数据库,数据库名称是用数字0-15来依次命名的
- 使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库
- 多数据库相互独立,互不干扰
1.多数据库间切换select
命令格式:select 序号
#使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库。
127.0.0.1:6379>select 10 #切换至序号为10的数据库
127.0.0.1:6379[10]>select 15 #切换至序号为15的数据库
127.0.0.1:6379[15]>select 0 #切换至序号为0的数据库
127.0.0.1:6379[0]>
2.多数据库间移动数据
move 键值 序号(库的序号)
3.清除数据库内数据(慎用)
FLUSHDB:清空当前数据库数据
FLUSHALL:清空所有数据库的数据,
八.Redis 常见错误与解决方案
1.常见运维故障
- 使用 keys* 把库堵死。——建议使用别名把这个命令改名
- 超过内存使用后,部分数据被删除。——这个有删除策略的,选择适合自己的即可
- 没开持久化,却重启了实例,数据全掉。——记得非缓存的信息需要打开持久化
- RDB的持久化需要 Vm.overcommit_memory=1 ,否则会持久化失败
- 没有持久化情况下,主从,主重启太快,从还没认为主挂的情况下,从会清空自己的数据,人为重启主节点前,先关闭从节点的同步
2.故障排查
- 结合Redis 监控查看QPS、缓存命中率、内存使用率等信息
- 确认机器层面的资源是否有异常
- 故障时及时上机,使用 redis-cli monitor 打印出操作日志,然后分析(事后分析此条失效)
- 和研发沟通,确认是否有大Key在堵塞(大Key也可以在日常的巡检中获得) 和组内同事沟通,确实是否有误操作
- 和运维同事、研发一起排查流量是否正常,是否存在被刷的情况