侧边栏壁纸
博主头像
landery博主等级

行李箱里装不下我想去的远方

  • 累计撰写 45 篇文章
  • 累计创建 26 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

Redis学习_01_相关概念知识

landery
2022-04-29 / 0 评论 / 0 点赞 / 81 阅读 / 5,743 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1 Redis学习

主要了解redis安装、使用以及维护,以及与MySQL的区别

1.1 Redis概述

Redis,Remote Dictionary Server(远程字典服务器),是完全开源免费的,用C语言编写的一个高性能(key-value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库(关于NoSQL见 NoSQL.md)。


1.2 Redis的特点

  1. Redis支持数据持久化,支持将内存中的数据持久化到磁盘,重启的时候可以重新加载使用
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供了list、set、zset、hash等数据结构的存储
  3. Redis支持数据的备份,即master-slave模式的数据备份。

1.3 Redis的安装

1.3.1 Redis在Windows上的安装

  1. Git地址 上选择合适的版本,下载安装包
  2. 在该网站中可以下载msi和zip两种格式,msi是微软格式的安装包,zip是压缩包。我们选择msi,这样可以在安装过程中,可以直接通过选择将程序路径加系统环境变量中。
  3. 安装完毕后,需要先做一些设定工作,以便服务启动后能正常运行。打开Redis服务配置文件。注意:不要找错了,通常为redis.windows-service.conf,而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置文件。
  4. 在该配置文件中,找到含有requirepass字样的地方,追加一行,输入requirepass "",引号中为访问Redis时的密码。
  5. 点击"开始">右击"计算机管理">"服务和应用程序">"服务"。再在右侧找到Redis名称的服务,查看启动情况。如未启动,则手动启动之。正常情况下,服务应该正常启动并运行了。
  6. 最后通过测试客户端来测试一下Redis是否正常提供服务,打开cmd,输入命令 redis-cli,如果显示端口号证明服务已启动。再输入命令:auth "",引号中为4中设置的密码,即可开始使用Redis服务。

1.3.2 Redis在CentOS上的安装(推荐,公司常用)

一般下载地址:http://redis.io/download ,下载最新稳定版本。发现官方网站下载地址很慢,于是找到了华为的Redis下载镜像:https://mirrors.huaweicloud.com/redis/。

  1. cd /usr/local //一般使用此目录下载文件
  2. wget https://mirrors.huaweicloud.com/redis/redis-6.2.5.tar.gz //下载redis压缩包
  3. tar xzf redis-6.2.5.tar.gz //解压缩文件
  4. cd redis-6.2.5
  5. make //编译并链接程序
  6. 执行完 make 命令后,redis-6.2.5 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli。
  7. cd src
  8. ./redis-server & //后台启动Redis服务
  9. ./redis-cli //测试redis服务是否启动

1.2.3 在redis安装过程所遇到的问题

  1. 在CentOS上安装Redis时,发现官网的访问速度很慢,于是找到华为云下载镜像解决。
  2. 在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命令

  1. redis-cli -h host -p port -a password //连接到远程redis服务上,host是主机IP地址,port代表端口,password是连接密码
  2. set key value //设置指定key的value值,重复设定会覆盖
  3. get key //得到指定key的值
  4. flushdb/flushall //清空当前库/清空默认的16个库
  5. select 数据库编号 //切换数据库 默认有0-15 总共16个库。
  6. config get requirepass //查看密码

1.3.2 Redis key常用命令

  1. keys * //查看当前数据库的所有key
  2. exist key //查看key是否存在,1代表存在,0代表不存在
  3. expire key 秒钟 //设置key 的过期时间
  4. ttl key //查看key还有几秒过期,-1表示永不过期,-2代表已过期
  5. type key //查看key的类型
  6. move key 数据库编号 //移动key到相应的数据库
  7. del key //删除key

redis 所支持的数据结构都有着自己的遍历、增、删命令。

1.3.3 redis数据结构

  1. string //最基本的数据结构,value最大512M
  2. list //底层是双向链表,有lpush和rpush
  3. hash //依旧是kv模式,但v相当于java中map
  4. set //set是 k1 v1 v2 v3
  5. zset //有序集合,zset在set基础上加上了一个score分数值,zset是 k1 score1 v1 score2 v2

1.4 redis配置文件(Linux)

修改配置文件前,先将原版配置文件备份 使用cp命令即可
配置文件为 redis.conf

  1. 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
  2. Security。安全配置
    • 命令行设置:config set requirepass "yourpassword" //设置密码,重启会失效
    • 配置文件设置:在配置文件中添加 requirepass "yourpassword",登录redis时需要使用auth "yourpassword"
  3. Limit。限制配置,配置最大客户端、最大内存、缓存过期策略(默认永不过期)等。
    • maxclients:最大客户端,默认10000
    • maxmemory :最大内存(bytes)
    • maxmemory-policy:默认永不过期,真实生产环境需要修改策略。
  4. SNAPSHOT:快照
    • rdbchecksum:对快照进行校验,会损耗性能,如果想提升性能可以关闭。
    • save:快照触发条件
    • dbfilename:快照文件,默认dump.rdb
    • dir:指定数据目录,可用config get dir 命令查看目录
  5. 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监控:
    1. 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
    2. 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 一旦执行exec命令,之前加的监控锁都会自动被取消。
  • watch类似乐观锁,如果key已经被其他客户端改变,则整个事务都不会执行。
  • 特性:
    1. 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不会被其他客户端发送来的命令请求所打断。
    2. 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到"这个让人万分头痛的问题。
    3. 不保证原子性: redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

1.7 redis的主从复制

主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

  • 主从复制功能:
    1. 读写分离,主库以写为主,从库以读为主
    2. 容灾恢复
  • 基本使用:
    1. 配从库不配主库
    2. 从库配置:slaveof 主库IP 主库端口 //每次与master断开,都需重新连接,但可配入redis.conf。如果主机挂了,从机原地待命,主机回来一切照旧,如果从机挂了,重新回来变成主机,需要重新连接
    3. 配置文件操作:拷贝多个redis.conf,开启daemonize yes,修改pidfile、端口号、Log文件名称,dbfilename名字。
    4. info replication // 查看主从复制信息
    5. slaveof no one //从机变主机
  • 原理:从机连上主机后,先全量复制,再增量复制
  • 哨兵模式:主机挂了以后,剩余从机里投票出新的主机master。
    1. 新建sentinel.conf文件
    2. 该文件中添加:sentinel monitor 被监控主机名字(自己起名字) 主机ip 6379 1 //后面的数字1代表主机挂了以后,slave投票得票数多少后成为主机
    3. 启动哨兵:redis-sentinel sentinel.conf文件路径

1.8 Redis和MySQL区别

  1. 从类型上来说,MySQL是关系型数据库,Redis是缓存数据库。
  2. 从作用上来说,MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢。Redis用于存储使用较为频繁的数据到缓存中,读取速度快。
  3. 从需求上来说,MySQL和Redis因为需求的不同,一般都是配合使用。目前基本都是MySQL(主) + Redis(辅)
  4. 从性能上来说,Redis数据存放在内存,MySQL放在磁盘因此性能要优于MySQL。
  5. 从安全性上而言MySQL要优于Redis。

1.9 总结

因为磁盘造价便宜,因此MySQL用来存放冷数据,而MySQL每次读取数据都需要进行IO操作,磁盘IO比较耗时,因此采用缓存数据库Redis存放热数据来减少数据IO,从而提升系统性能。

0

评论区