文章目录
一 Redis简介
Redis是一个开源的key-value存储系统,在查询场景中只能使用K去查询,HBase如果想使用除rowkey之外的结构进行查询,需要设计二级索引(索引的索引),Redis经常会担当某些数据库的二级索引,如学号是K,人名是V,现有需求想要使用人名进行查询,这时就需要建立一张表,存储人名与K之间的关系,然后再用K去查询V。
与memcached一样,为了保证效率,数据都是在内存中。
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
并且在此基础上实现了高可用和集群模式。
1 应用场景
(1)业务系统:配合关系型数据库做高速缓存
高频次,热门访问的数据,降低数据库IO。
经典的缓存Cache Aside Pattern (旁路缓存模式),正常情况下,访问应用服务器,应用服务器直接交给MySQL,但是访问量特别大的时候,既负责读又负责写,会造成数据比较慢。
在业务场景中,接受大部分请求的数据往往是少部分数据,为缓解MySQL的压力,可以将这部分数据存放到缓存中,这样用户访问数据时,应用服务器先不去访问MySQL,先访问缓存,命中返回结果,否则查询MySQL,将数据放入到缓存中,返回结果。随着时间的推移,缓存中的数据越来越多,不过Redis提供了“失效”功能,如某份数据经过固定时间即失效。
(2)大数据场景:缓存数据
一般在实时计算场景中,访问强度十分高,如kafka提交过来一个订单,服务器在接收订单的同时,还需要对订单进行一些计算,如按照年龄段计算订单的金额。
(3)大数据场景:临时数据
如黑名单或者今日累计值或者验证码。
(4)大数据场景:计算结果
(5)利用redis的特殊数据结构解决一些特点问题
二 Redis安装
1 安装版本
- 6.0.8 for Linux(redis-6.0.8.tar.gz)
- 不用考虑在windows环境下对Redis的支持
2 安装步骤
(1)安装C 语言的编译环境
# 安装
sudo yum install centos-release-scl scl-utils-build
sudo yum install -y devtoolset-8-toolchain
# 启用编译器
sudo scl enable devtoolset-8 bash
# 执行完成后会切换到root用户
# 测试 gcc版本
sudo gcc --version
# 显示信息
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
(2)安装
# 解压
tar -zxvf redis-6.0.8.tar.gz -C /opt/module/
# 编译并安装
[root@hadoop101 redis-6.0.8]# make && make install
# redis安装地址
cd /usr/local/bin/
# 会有六个文件
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口
# 卸载编译好的环境,将这六个文件删除即可
(3)启动
# 切换用户或者重新连接服务器
redis-server
# 出现以下信息redis启动成功,但前台启动,命令行窗口不能关闭,否则服务器停止,故后台启动
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 5788
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
# Redis的所有配置信息都内嵌到了程序中,想要修改,需要用外部的配置项覆盖掉程序的配置
# 在启动时引用外部的配置
cd /opt/module/redis-6.0.8/
# 将模板拷贝出来
cp redis.conf ~/redis2022.conf
[hzy@hadoop101 ~]$ vim redis2022.conf
# 将下列配置修改
################################# GENERAL #####################################
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
# 后台启动
[hzy@hadoop101 ~]$ redis-server redis2022.conf
ps -ef|grep redis
# 显示信息
hzy 5807 1 0 15:30 ? 00:00:00 redis-server 127.0.0.1:6379
# 进入Redis客户端
redis-cli
# 退出服务器
shutdown
# 利用客户端关闭服务器
redis-cli shutdown
3 Redis介绍
默认16个数据库,类似数组下标从0开始,初始默认使用0号库。
使用命令 select 来切换数据库。如: select 8 。
统一密码管理,所有库同样密码。
库在Redis中是十分鸡肋的存在,Redis一个服务中备份的数据在磁盘中是一个文件,无法做到单个库的迁移。
4 Redis的单线程 + 多路IO复用技术
多路IO复用技术是liinux的技术,linux有多路IO复用技术的模型。
Nginx同样使用多路IO实现的单线程。
多路IO复用 ,指的是同一个进程用一个线程处理多个IO数据流。用一个线程实现的时间管理大师,一个人为多个人提供服务,多线程为多个人为多个人提供服务,大部分应用使用的都是多线程,但是多线程会让程序变得更加复杂,不同线程需要对公共资源进行抢占,有抢占就会出现锁、并发等。单线程就不会出现这种问题,谁需要我,call me。
线程在多个IO流之间切换,节约资源 ,程序复杂度大大降低。
那么为什么一般的数据 mysql 等都没有选择这种模型,而redis 选择这种模型?
- 首先需要明白,单线程最怕的就是被一个对象拖着,也即阻塞,假如现有一条扫描500W行的sql,那么它不执行完成,后续简单sql也无法执行。
而redis 选择这种模型,是因为:
- redis都是执行小而简单的key操作,且都在内存中运行,非常不容易出现阻塞的情况,所以比较适用于单线程,基本不用担心阻塞其他任务。
- Nginx接收到一个请求,自己不去处理,转发给别人进行处理,Nginx主要负责负载均衡。
- 所以在都是执行小而简单且在内存中运行的程序,都可以考虑使用这种模型。
所以比较适用于单线程,基本不用担心阻塞其他任务。
**原理:**多路Io复用是利用select、poll、epoll(不同的监控策略)可以同时监察多个流的IO事件的能力,在空闲的时候会把当前线程阻塞,当有一个或多个流由IO事件发生时,就从阻塞态中唤醒,处理就绪的流。
监控器负责监控IO流,使得知道哪个人需要这个单线程,没有事件的IO流会被挂起,不同的监控策略如下:
- select:谁找我,我将请求群发,查看还有谁需要我。
- epoll:谁找我,我响应谁,redis使用此种策略。
优势:当处理的消耗对比IO几乎可以忽略不计时,可以处理大量的并发IO,而不用消耗太多CPU内存。
串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)
Redis与Memcache三点不同:支持多数据类型,支持持久化,单线程+多路IO复用
新版 Redis 6.x
虽然io多路复用已经不错了,但是面临很多大键值的访问时,其中IO操作还是容易出现高延迟的问题,为了进一步优化,Redis 6.x把IO的部分做成允许多线程的模式。
注意这个IO部分只是处理网络数据的读写和协议解析(默认存在4个助理),在执行API命令时仍然使用单线程。所以这个多线程并不会让redis存在并发的情况。
另外,多线程IO默认也是不开启的,需要再配置文件中配置
io-threads-do-reads yes
io-threads 4
只有当并发程度特别大的时候,开启才会产生效果。