共计 5631 个字符,预计需要花费 15 分钟才能阅读完成。
1 Redis学习
主要了解redis安装、使用以及维护,以及与MySQL的区别
1.1 Redis概述
Redis,Remote Dictionary Server(远程字典服务器),是完全开源免费的,用C语言编写的一个高性能(key-value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库(关于NoSQL见 NoSQL.md)。
1.2 Redis的特点
- Redis支持数据持久化,支持将内存中的数据持久化到磁盘,重启的时候可以重新加载使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供了list、set、zset、hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份。
1.3 Redis的安装
1.3.1 Redis在Windows上的安装
- 在 Git地址 上选择合适的版本,下载安装包
- 在该网站中可以下载msi和zip两种格式,msi是微软格式的安装包,zip是压缩包。我们选择msi,这样可以在安装过程中,可以直接通过选择将程序路径加系统环境变量中。
- 安装完毕后,需要先做一些设定工作,以便服务启动后能正常运行。打开Redis服务配置文件。注意:不要找错了,通常为redis.windows-service.conf,而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置文件。
- 在该配置文件中,找到含有requirepass字样的地方,追加一行,输入requirepass “”,引号中为访问Redis时的密码。
- 点击”开始”>右击”计算机管理”>”服务和应用程序”>”服务”。再在右侧找到Redis名称的服务,查看启动情况。如未启动,则手动启动之。正常情况下,服务应该正常启动并运行了。
- 最后通过测试客户端来测试一下Redis是否正常提供服务,打开cmd,输入命令 redis-cli,如果显示端口号证明服务已启动。再输入命令:auth “”,引号中为4中设置的密码,即可开始使用Redis服务。
1.3.2 Redis在CentOS上的安装(推荐,公司常用)
一般下载地址:http://redis.io/download ,下载最新稳定版本。发现官方网站下载地址很慢,于是找到了华为的Redis下载镜像:https://mirrors.huaweicloud.com/redis/。
- cd /usr/local //一般使用此目录下载文件
- wget https://mirrors.huaweicloud.com/redis/redis-6.2.5.tar.gz //下载redis压缩包
- tar xzf redis-6.2.5.tar.gz //解压缩文件
- cd redis-6.2.5
- make //编译并链接程序
- 执行完 make 命令后,redis-6.2.5 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli。
- cd src
- ./redis-server & //后台启动Redis服务
- ./redis-cli //测试redis服务是否启动
1.2.3 在redis安装过程所遇到的问题
- 在CentOS上安装Redis时,发现官网的访问速度很慢,于是找到华为云下载镜像解决。
- 在2.1.2的第8步中,后台启动Redis服务,还可以通过 ctrl + z 将该服务暂停到后台,通过命令 jobs -l 查看后台运行的任务的job号jobnumber,再通过命令 bg jobnumber 将一个在后台暂停的任务,变成在后台继续执行,或通过 fg jobnumber,将后台中的任务调至前台继续运行。
1.3 Redis的基本使用
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1.3.1 Redis命令
- redis-cli -h host -p port -a password //连接到远程redis服务上,host是主机IP地址,port代表端口,password是连接密码
- set key value //设置指定key的value值,重复设定会覆盖
- get key //得到指定key的值
- flushdb/flushall //清空当前库/清空默认的16个库
- select 数据库编号 //切换数据库 默认有0-15 总共16个库。
- config get requirepass //查看密码
1.3.2 Redis key常用命令
- keys * //查看当前数据库的所有key
- exist key //查看key是否存在,1代表存在,0代表不存在
- expire key 秒钟 //设置key 的过期时间
- ttl key //查看key还有几秒过期,-1表示永不过期,-2代表已过期
- type key //查看key的类型
- move key 数据库编号 //移动key到相应的数据库
- del key //删除key
redis 所支持的数据结构都有着自己的遍历、增、删命令。
1.3.3 redis数据结构
- string //最基本的数据结构,value最大512M
- list //底层是双向链表,有lpush和rpush
- hash //依旧是kv模式,但v相当于java中map
- set //set是 k1 v1 v2 v3
- zset //有序集合,zset在set基础上加上了一个score分数值,zset是 k1 score1 v1 score2 v2
1.4 redis配置文件(Linux)
修改配置文件前,先将原版配置文件备份 使用cp命令即可 配置文件为 redis.conf
- GENERAL。通用配置
- daemonize no //当该项yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。默认是no,启动redis后将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
- port //端口号,默认6379
- bind //绑定的ip地址,默认本机
- timeout //连接超时时间,当对方空闲时,切断连接,0代表不断开连接
- loglevel //日志级别,默认是notice,级别由低到高为
- logfile //日志记录方式,默认为标准输出
- databases //数据库数量 默认是16个,从0-15
- Security。安全配置
- 命令行设置:config set requirepass “yourpassword” //设置密码,重启会失效
- 配置文件设置:在配置文件中添加 requirepass “yourpassword”,登录redis时需要使用auth “yourpassword”
- Limit。限制配置,配置最大客户端、最大内存、缓存过期策略(默认永不过期)等。
- maxclients:最大客户端,默认10000
- maxmemory :最大内存(bytes)
- maxmemory-policy:默认永不过期,真实生产环境需要修改策略。
- SNAPSHOT:快照
- rdbchecksum:对快照进行校验,会损耗性能,如果想提升性能可以关闭。
- save:快照触发条件
- dbfilename:快照文件,默认dump.rdb
- dir:指定数据目录,可用config get dir 命令查看目录
- APPEND ONLY MODE:
- appendonly:默认no,yes开启aof持久化
- appendfilename:默认aof文件
- appendfsync:有三种:always(每次数据变更会记录到磁盘)、everyesc(默认,每秒记录,如果一秒内宕机,有数据丢失)、no。
- auto-aof-rewrite-min-size:设置重写的基准值
- auto-aof-rewrite-percentage:设置重写的基准值
1.5 Redis持久化
有两种持久化方式RDB和AOF。
1.5.1 RDB(Redis DataBase)
在指定的时间间隔内,将内存中的数据集快照写到磁盘,就是snapshot快照,恢复时从磁盘读入内存,Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失,并且fork会复制主进程内容,会造成内存压力。
- 默认保存文件为:dump.rdb
- 默认触发条件:1分钟内改了1万次,5分钟内改了10次,15分钟内改了1次。如果想要禁用RDB策略,不要在配置文件中使用任何sava指令。
1.5.2 AOF(Append Only File)
以日志的形式记录每个写操作,redis启动时会按照该文件重新构建数据,配置文件中默认关闭,配置字段appendonly。
- Rewrite机制:因为aof文件只能追加,所以会越来越大,当文件超过设定的阈值时,Redis就会启动aof的文件内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。触发条件是:默认是AOF文件大小是上次rewrite后大小的一倍且文件大于64M时,配置文件可修改。
- 默认保存文件:appendonly.aof
- 优点:可以灵活配置持久化时间,aof文件分析容易
- 缺点:相同数据集的数据aof文件要远大于rdb文件,恢复速度慢于rdb,aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
1.5.3 总结
当RDB和AOF共存时,AOF优先加载,假设AOF文件出现问题(断电,丢包等导致),启动不了Redis,但是可以使用redis-check-aof –fix appendonly.aof修复该文件。可以同时开启两种备份和恢复方式。
1.6 Redis事务
一组指令顺序、无间断地执行。
- 使用:使用mutil开启一个事务,使用exec执行所有命令,discard取消事务。unwatch 取消watch命令对所有key的监视,watch key[key…] 监视一个或多个key,在事务执行之前这些key被改动,那么事务会被打断。
- 指令加入队列时出错,整个事务都失败,而事务执行,某条语句出错,只有该条语句会错,其他语句不受影响。
- watch监控:
- 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
- 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
- 一旦执行exec命令,之前加的监控锁都会自动被取消。
- watch类似乐观锁,如果key已经被其他客户端改变,则整个事务都不会执行。
- 特性:
- 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不会被其他客户端发送来的命令请求所打断。
- 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
- 不保证原子性: redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
1.7 redis的主从复制
主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。
- 主从复制功能:
- 读写分离,主库以写为主,从库以读为主
- 容灾恢复
- 基本使用:
- 配从库不配主库
- 从库配置:slaveof 主库IP 主库端口 //每次与master断开,都需重新连接,但可配入redis.conf。如果主机挂了,从机原地待命,主机回来一切照旧,如果从机挂了,重新回来变成主机,需要重新连接
- 配置文件操作:拷贝多个redis.conf,开启daemonize yes,修改pidfile、端口号、Log文件名称,dbfilename名字。
- info replication // 查看主从复制信息
- slaveof no one //从机变主机
- 原理:从机连上主机后,先全量复制,再增量复制
- 哨兵模式:主机挂了以后,剩余从机里投票出新的主机master。
- 新建sentinel.conf文件
- 该文件中添加:sentinel monitor 被监控主机名字(自己起名字) 主机ip 6379 1 //后面的数字1代表主机挂了以后,slave投票得票数多少后成为主机
- 启动哨兵:redis-sentinel sentinel.conf文件路径
1.8 Redis和MySQL区别
- 从类型上来说,MySQL是关系型数据库,Redis是缓存数据库。
- 从作用上来说,MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢。Redis用于存储使用较为频繁的数据到缓存中,读取速度快。
- 从需求上来说,MySQL和Redis因为需求的不同,一般都是配合使用。目前基本都是MySQL(主) + Redis(辅)
- 从性能上来说,Redis数据存放在内存,MySQL放在磁盘因此性能要优于MySQL。
- 从安全性上而言MySQL要优于Redis。
1.9 总结
因为磁盘造价便宜,因此MySQL用来存放冷数据,而MySQL每次读取数据都需要进行IO操作,磁盘IO比较耗时,因此采用缓存数据库Redis存放热数据来减少数据IO,从而提升系统性能。