netcore网站开发实战,wordpress推广网站插件,中国空间站简笔画,怎么拥有个人网站1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。
2、安装Redis#xff08;Linux#xff09;
2.1、去官网#xff08;http://www.redis.cn/#xff09;下…1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库它同时也提供了多种数据结构来满足不同场景下的数据存储需求。
2、安装RedisLinux
2.1、去官网http://www.redis.cn/下载redis安装包 2.2、将下载的解压包放入目录【/opt】下面并解压解压命令: tar -zxvf 包名 解压后的文件夹
2.3、安装Redis
2.3.1、安装redis之前先要安装【gcc】gcc是linux下的一个编译程序是C程序的编译工具。
注意前提是必须联网。
2.3.2、查看是否安装gcc成功出现版本信息表示成功。 2.3.3、安装Redis 2.3.4、出现提示要你执行如图的命令表示安装成功这里不用执行这个命令 2.3.5、如果出现【jemalloc/jemalloc.h没有那个文件或目录】这样的提示有可能是在没有b编译【gcc】之前执行了redis的【make】这个命令编译失败之后留下了一些残留所有执行命令【 make distclean 】清理残留之后再执行命令【make】就可以编译成功。 2.3.6、编译之后安装redis;安装命令【make install】 2.3.7、查看redis默认安装位置 3、运行与停止Redis
3.1、启动redis服务
3.1.1、为了不修改redis的默认配置先将文件【redis.conf】拷贝一份到新建文件夹【RunRedis】中 3.1.2、修改拷贝的配置文件【redis.conf】将daemonize 的值修改为【yes】原因是将redis修改为后台启动如果是前台启动的话终端就无法执行其他操作了 3.1.3、进入路径【/usr/local/bin】 3.1.4、启动Redis服务 命令【/usr/local/bin/redis-server /RunRedis/redis.conf】
启动时指定读取修改好的配置文件
3.1.5、使用命令【ps -ef | grep redis】查看redis服务是否启动可以看出redis的默认端口是6379 3.1.5、也可以测试一下这个端口【6379】是否有效
使用命令【redis-cli -p 端口号】–进入指定redis终端控制台 使用命令【ping】;查看端口是否有效返回字样“PONG“表示成功。 退出【ctrlc】或者使用命令【exit】–可以退出redis控制台 3.1、停止redis
命令【/usr/local/bin/redis-cli shutdown】 附加指定端口关闭为【/usr/local/bin/redis-cli -p 6379 shutdown】
4、Redis基础知识 redis默认16个数据库类似数组下标从零开始初始默认使用0号库16个库都是同样密码要么都OK要么一个也连接不上Redis索引都是从零开始Redis的默认端口是6379
4.1、在文件 【redis.conf】中查看当前redis有多少个库。 4.2、使用命令【select 库号】可以切换数据库。 4.3、如何在redis中存入值
命令 写入值【set key value】 获取值【get key】 注意同一个key重复设置值会覆盖原来的值。
4.4、查看当前数据库的key数量
命令【dbsize】 示例中查出2个。
4.5、查看当前数据库的key数量
命令【keys *】
4.6、显示当前库key名是“a”开头的
命令【keys a*】
4.7、显示当前库key名是“e”结尾的
命令【keys *e】
4.8、清空当前库的所有key正式工作中慎用
命令【FLUSHDB】
4.9、清空所有库的key正式工作中慎用
命令【FLUSHALL】
5、redis的数据类型
5.1、String字符串 String是redis最基本的类型一个key对应一个value。String类型是二进制安全的。意思是redis的String可以包含任何数据。比如jpg图片或者序列化的对象 。String类型是Redis最基本的数据类型一个redis中字符串的value值最大可以是512M。
常用命令
set 【key】【value】 --设置指定 key 的值.get 【key】 --获取指定key值。del 【key】 --删除指定key和它的值。append 【key】【value】 --如果 key 已经存在并且是一个字符串append命令将指定的 value 追加到该 key原来值value的末尾。strlen 【key】 --返回指定 key 所储存的字符串值的长度。incr 【key】 --将 key 中储存的数字值增一。decr 【key】 --将 key 中储存的数字值减一。incrby 【key】【数字】 --将 key 所储存的数字值加上给定的数字。decrby 【key】【数字】 --将 key 所储存的数字值剪去给定的数字。getrange 【key】【索引a】【索引b】 --获取key从【索引a】到【索引b】之间的值从0到-1表示全部.setrange 【key】【索引】【值】 --将key的值从【索引】处开始覆盖成指定的【值】。setex 【key】【s】【value】 --设置【key】的值为【value】过期时间为【s】,时间单位是秒。setnx 【key】【value】 --将key设置指定的value;前提是这个key未创建的情况下。mset 【key1】【value1】【key2】【value2】…. --同时设置多个键值对。不能设置已有的key。mget 【key1】【key2】–同时获取多个key的值
5.2、Hash哈希 Hash 是一种键值对集合它可以将多个字段field和对应的值value关联到同一个键key下形成类似于关系型数据库中的“行”的结构。在 Redis 中一个 Hash 可以存储多个字符串类型的 field-value 对应关系这使得它非常适合用于存储对象或映射表。类似Java里面的MapString,Object
常用命令
hset 【key】【k v】 --将指定的key中设置一个键值对。hget【key】【k】 --获取key中某一个【k】的元素值。hmset 【key】【k1 v1 k2 v2 …】–将指定的key中设置多个键值对.hmget 【key】【k1 k2 k3 …】–获取key中指定的多个【k】的元素值HGETALL 【key】 --获取key中所有的键值对。hdel 【key】【k】 --删除key中的某一个【k】的元素。hlen 【key】 --获取key中键值对的个数。hexists 【key】【k】 --判断key里面【k】键是否存在1表示有0表示无hkeys 【key】 --将指定的【key】中所有的键值对的键取出来hvals 【key】 --将指定的【key】中所有的键值对的值取出来。HINCRBY 【key】【k】【n】-- 将key中的指定k的整数值加上增量 nHINCRBYFLOAT 【key】【k】【n】-- 将key中的指定k的浮点数加上增量 nhsetnx 【key】【k v】 --将指定的key中设置一个键值对。如果该键值对已存在则不设置。
5.3、List列表 List数据类型是一种有序的、可以重复的数据序列它允许用户在头部左端或尾部右端插入和移除元素。每个 List 可以存储多个字符串值并且这些值在列表中的位置是有顺序的。
5.3.1、常用命令
lpush 【key】【value1 value2 …】 --将指定的key设置多个值。最后存入的值下标是‘0’最新的值会把已有的值下标往后推。lrange 【key】【下标x】【下标n】–获取指定key中下标【下标x】到【下标n】之间的value值。从0到-1表示全部.rpush 【key】【value1 value2 …】 --在列表中添加/追加一个或多个值。LPOP 【key】 --移出并获取列表的第一个元素(命令必须大写)。RPOP 【key】 --移除列表的最后一个元素返回值为移除的元素(命令必须大写)。LINDEX 【key】【下标】 --通过索引获取列表中的元素。llen 【key】 --获取列表的长度。lrem 【key】【n】【value】 --在指定的key中删除【n】个相同的【value】。ltrim 【key】【下标1】【下标2】 --让列表只保留指定区间内的元素不在指定区间之内的元素都将被删除。RPOPLPUSH 【key1】【key2】 --移除key1列表的最后一个元素并将该元素添加到key2列表的最前面并返回该元素。LSET 【key】 【index】【value】 --通过索引设置列表元素的值。linsert 【key】before【元素】【新元素】 --在“元素“前面插入“新元素“linsert 【key】after【元素】【新元素】 --在“元素“后面插入”新元素“
5.3.2、示例
5.3.2.1、使用命令lpush给key【list1】插入多个value 5.3.2.2、获取key【list1】的所有值。 5.3.2.3、使用命令rpush给key【list2】添加值。 5.3.2.4、使用命令【LPOP】移除并获取key【list2】的第一个值。 5.3.2.5、使用命令【RPOP】移除并获取key【list2】的最后一个值。 5.3.2.6、使用命令【LINDEX】获取key【list2】小标为【1】的值。 5.3.2.7、使用命令【llen】获取key【list2】的列表长度。 5.3.2.8、使用命令【lrem】移除key【list3】列表中【2】个相同的【i2】值 5.3.2.9、使用命令【ltrim】移除key【list3】下标【3】到【5】以外的值。 5.3.2.10、使用命令【rpoplpush】将key【list1】的最后一个元素【3】剪切到key【list2】元素列表的最前面。 5.3.2.11、使用命令【lset】将下标为0的元素【3】修改为【h】。 5.3.2.12、使用命令【linsert】在key【list1】的元素【2】前面添加一个新元素【b】 5.3.2.13、使用命令【linsert】在key【list1】的元素【2】后面添加一个新元素【g】 5.4、Set集合 Redis 的 Set集合数据类型是一种无序的、不重复元素的集合。Set 中的每个成员必须是唯一的这意味着你不能在同一个 Set 中添加两个相同的值。
常用命令
sadd 【key】【value1 value2 value3 ……】 --向key中添加一个或多个元素。smembers 【key】 --获取【key】中的所有元素。sismember 【key】【元素】 --判断元素是否是集合 key 的成员1表示是0 表示 不是。scard 【key】 --获取集合中的元素个数。srem 【key】 【value】 --删除集合中元素。srandmember 【key】 【n】 --随机返回集合中【n】个随机数。spop 【key】 --随机移除key中的一个元素。smove 【key1】【key2】【元素】 --将集合key1中的【元素】移动到集合key2中。数字集合类命令差集sdiff 【key1】【key2】 --把key1于key2作比较把key1有的元素而key2没有的元素获取出来。交集sinter 【key1】【key2】 --把key1于key2作比较把key1和key2中相同的元素取出来。并集sunion 【key1】【key2】–将key1和key2中元素都取出来其中相同的元素只取一次。
5.5、zset有序集合 zset是一种特殊的数据结构它在普通集合的基础上增加了排序功能。每个元素成员 member在有序集合中都是唯一的并且与一个 double 类型的分数score相关联。有序集合中的元素会根据其关联的分数进行自动排序分数可以是任何浮点数包括负数。
常用命令
zadd 【key】【score1 value1 score2 value2】 --向有序集合添加一个或多个成员或者更新已存在成员的分数.zrange 【key】【下标x】【下标n】 --返回有序集合【key】中下标是【下标x】到下标【下标n】之间的键值对的值。zrange 【key】【下标x】【下标n】withscores --返回有序集合【key】中下标是【下标x】到下标【下标n】之间的键值对zrangebyscore 【key】 【score1】 【score2】–获取分数【score1】到分数【score2】之间的元素值。zrangebyscore 【key】 【(score1】 【score2】–获取分数【score1】到分数【score2】之间的元素值但不包含score1的元素值。zrangebyscore 【key】 【(score1】 【(score2】 --获取分数【score1】到分数score2】之间的元素值但不包含 - score1和score2的元素值。zrangebyscore 【key】 【score1】 【score2】limit 【n】【x】–获取分数【score1】到分数【score2】之间的元素值limit是实现分页显示查询结果如显示第【】页数据一页显示【】条数据。zrem 【key】【 value值】 --将指定【key】中的某一个score键值对删除这里为什么选value值做删除索引是因为value值是唯一的而score键可用重复。zcard 【key】 --获取指定【key】中的键值对个数。zcount【key】【score1】【score2】–获取指定【key】中【score1】到【score2】之间的键值对个数。zrank 【key】【value】 --获取【key】中指定【value】的索引zscore 【key】【value】 --根据【key】中【value值】获得分数。zrevrank【key】【values值】 --获取【key】中指定逆序获得下标值zrevrange 【key】【下标1】【下标2】–从指定的【key】逆序获取【下标1】到【小标2】中得值。zrevrangebyscore 【key】【结束score】 【开始score】 --返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。
6、Redis常用命令key
6.1、set 【key】【value】 --在数据中设置值
示例设置key【age】的值为【22】
6.2、get 【key】 --获取一个key 的值
示例获取key[【age】的值。
6.3、del 【key1 key2】 --删除一个key或多个key
示例删除key【k2】 示例2 :删除key【k1】和key【k2】
6.4、 keys * --查看当前库的所有key
示例查看当前库的所有key
6.5、move 【key名】 【库号】 --将key移动至指定的数据库。
示例将key【age】移动到数据库2
6.6、expire 【key】 【秒钟】 --为给定的key设置过期自动删除时间。
ttl 【key】 --查看还有多少秒过期-1表示永不过期-2表示已过期 示例设置key【k1】十秒后过期。查看k1的过期时间
6.7、type 【key】 --查看key的数据类型。
示例查看key【k2】的数据类型。
6.8、exists 【key】 --查询某个key是否存在0表示不存在1表示存在。
示例查看key【s】和key【age】是否存在。
6.8、rename 【key1】【key2】 --将指定的【key1】名称重命名为【key2】
示例将key【age】重命名为【ageplus】
7、redis配置文件—redis.conf
7.1、redis.conf的位置【/opt/redis-5.0.7】 7.2、redis详细配置解析
第三方详细解析。 https://blog.csdn.net/suprezheng/article/details/90679790 https://www.cnblogs.com/ysocean/p/9074787.html
7.3、redis常用配置解析
常见配置redis.conf介绍重点https://blog.csdn.net/suprezheng/article/details/90679790
7.3.1、 GENERAL通用重点
在 Redis 配置文件redis.conf中“GENERAL” 类型的配置通常指的是那些适用于 Redis 服务整体运行的基础配置选项这些通用设置包括但不限于以下内容
daemonize是否以守护进程模式运行。daemonize yes/no默认为 no。当设为 yes 时Redis 将作为后台守护进程启动。pidfile守护进程的 PID 文件路径。如 pidfile /var/run/redis_6379.pid用于记录 Redis 进程的 ID方便系统管理。logfile日志文件路径指定 Redis 的日志输出位置默认情况下Redis 会将日志信息输出到标准输出终端通过此配置可以更改日志写入到特定文件。loglevel日志级别例如 loglevel notice。Redis 支持多个日志级别如 debug记录大量日志信息适用于开发、测试阶段、verbose较多日志信息、notice默认、warning 较多日志信息和 error 等用以控制日志信息的详细程度。portRedis 服务器监听的 TCP 端口号默认为 6379。bind绑定的网络接口地址。如果不配置Redis 将监听所有可用网络接口如果指定一个或多个 IP 地址则仅监听来自这些地址的连接请求。timeout客户端空闲超时时间在该时间内未执行任何命令的客户端连接将被关闭。protected-mode是否开启保护模式默认为 yes这会影响 Redis 在没有明确配置 bind 或 requirepass 情况下的访问策略。databases数据库数量即 Redis 默认支持的最大数据库数默认为 16。
7.3.2、 SNAPSHOTTING快照
SNAPSHOTTING快照是一种持久化机制用于将内存中的数据保存到磁盘中。Redis 的默认快照方式称为 RDB (Redis Database) 持久化。
7.3.2.1、save 参数
这是一个多条配置项用于指定触发快照保存的条件。示例配置格式save 其中 表示时间秒数表示在给定时间内发生更改的键的数量。示例配置值
save 900 1 # 如果900秒内至少有1个键被修改则创建快照
save 300 10 # 如果300秒内至少有10个键被修改则创建快照
save 60 10000 # 如果60秒内至少有10000个键被修改则创建快照若要禁用自动快照可以注释掉所有 save 行或者添加一行 save “”。
7.3.2.2、stop-writes-on-bgsave-error
默认情况下为 yes当后台保存时如果出现错误例如磁盘满或写入权限问题Redis 将停止接受写请求以避免数据丢失。可以将其设置为 no 来允许即使在快照失败的情况下也继续接受写操作。
7.3.2.3、rdbcompression
默认为 yes表示在存储 RDB 文件时启用 LZF 压缩以减少文件大小。设置为 no 则不进行压缩可能有助于更快地保存和载入数据但会增加磁盘空间占用。
7.3.2.3、rdbchecksum
默认为 yes会在 RDB 文件中存储一个校验和以便在加载时检查数据完整性。如果设置为 no则不会计算和验证校验和可能会导致加载损坏的 RDB 文件而不被发现。
7.3.2.3、dbfilename
指定 RDB 文件的名称默认为 “dump.rdb”。
7.3.2.3、dir
指定 RDB 文件存放的目录默认通常为 Redis 数据目录。
7.3.2.3、rdb-del-sync-files
Redis 6.2 版本引入的新配置选项用于控制是否同步删除旧的 RDB 文件。
7.3.3、REPLICATION复制
REPLICATION复制是用于创建和维护多个 Redis 实例之间数据同步的机制。通过配置主从复制可以实现高可用性和可扩展性同时支持读写分离等应用场景。
7.3.3.1、slave-serve-stale-data
默认值为yes。当一个 slave 与 master 失去联系或者复制正在进行的时候slave 可能会有两种表现 1) 如果为 yes slave 仍然会应答客户端请求但返回的数据可能是过时或者数据可能是空的在第一次同步的时候 2) 如果为 no 在你执行除了 info he salveof 之外的其他命令时slave 都将返回一个 “SYNC with master in progress” 的错误
7.3.3.1、slave-read-only
配置Redis的Slave实例是否接受写操作即Slave是否为只读Redis。默认值为yes。
7.3.3.1、repl-diskless-sync
主从数据复制是否使用无硬盘复制功能。默认值为no。
7.3.3.1、repl-diskless-sync-delay
当启用无硬盘备份服务器等待一段时间后才会通过套接字向从站传送RDB文件这个等待时间是可配置的。 这一点很重要因为一旦传送开始就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位默认为5秒。要关掉这一功能只需将它设置为0秒传送会立即启动。默认值为5。
7.3.3.1、repl-disable-tcp-nodelay
同步之后是否禁用从站上的TCP_NODELAY 如果你选择yesredis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no从站的数据延时不会那么多但备份需要的带宽相对较多。默认情况下我们将潜在因素优化但在高负载情况下或者在主从站都跳的情况下把它切换为yes是个好主意。默认值为no。
8、redis持久化 什么是持久化由于redis的高性能主要来源于它将所有的数据都存在内存中而将内存中数据同步到硬盘中的这个过程叫做持久化。Redis 提供了两种主要的持久化方法
8.1、RDB (Redis Database)默认
RDB 是 Redis 默认采用的一种持久化方式通过定期或在满足特定条件时如自上次快照以来有指定数量的键被修改创建数据库的二进制快照Snapshot。这个过程是通过 fork 子进程来完成的子进程将当前的数据写入到一个名为 dump.rdb 的文件中。优点恢复速度快文件占用空间小适合大规模的数据恢复场景。缺点在 Redis 宕机后最后一次快照后的数据可能会丢失如果数据更新频繁可能会导致较多的数据损失。
8.1.1、定时持久化数据的时间的设置位置 save 900 1表示900 秒内如果至少有 1 个 key 的值变化则保存
save 300 10表示300 秒内如果至少有 10 个 key 的值变化则保存
save 60 10000表示60 秒内如果至少有 10000 个 key 的值变化则保存8.2、AOF (Append Only File) AOF 持久化是另一种可选的持久化方式它将所有对 Redis 服务器进行的写操作命令以追加的方式记录在一个日志文件中。用户可以配置不同的策略来决定何时将命令从缓存同步到磁盘上包括每秒同步、每次写操作后同步和不主动同步等。 优点数据安全性更高几乎可以实现完全持久化即使在服务器意外停机的情况下也能保证较少的数据丢失。 缺点随着写操作增加AOF 文件会越来越大需要定期执行重写rewrite来压缩体积并且在启动时加载 AOF 文件比 RDB 要慢一些。 AOF的开启步骤 1、在rendis的配置文件【redis.conf】中的“APPEND ONLY MODE”一栏将【appendoly】的值设置为 “yes”。 2、AOF数据持久化到硬盘的默认存储文件是【appendonly.aof】。 AOF恢复数据重启redis服务即可。默认就会读取【appendonly.aof】的数据。
8.1、说明 为了达到最佳的持久化效果有些用户会选择同时开启 RDB 和 AOF 两种持久化方式这样既能利用 RDB 快速恢复的优点又能确保 AOF 提供更高的数据安全性。当 Redis 重启时如果同时开启了这两种持久化方式则优先使用 AOF 文件恢复数据因为 AOF 文件包含了自最后一次 RDB 快照之后的所有写入操作能够提供更完整的数据状态
9、redis事务 可以一次执行多个命令本质是一组命令的集合。一个事务中的所有命令都会序列化按顺序地串行化执行而不会被其它命令插入不许加塞。
9.1、常用命令
MULTI --标记事务的开始。Exec --执行所有事务块内的命令。DISCARD --取消事务放弃执行事务块内的所有命令。注意redis开启一个事务时如果列队中有命令语法错误那么这个事务里面的命令都不会执行如果是命令语法没错在执行命令中出错则列队中的其他命令不受其中执行错误影响。能执行的还是会执行。
9.2、使用示例
9.2.1、使用命令【MULTI】开启一个事务,返回“OK”表示开启成功。 9.2.1、创建一个事务创建一组命令并执行这个事务中的命令。
“QUEUED“表示这个命令已在事务列队中。
9.3、watch命令监控事务 watch命令类似于乐观锁watch 命令可以决定事务是执行还是回滚。一般而言可以在 MULTI命令之前使用 watch 命令监控某些键值对然后使用 MULTI命令开启事务执行各类对数据结构进行操作的命令这个时候这些命令就会进入队列。 当 Redis 使用 exec 命令执行事务的时候它首先会去比对被 watch 命令所监控的键值对如果没有发生变化那么它会执行事务队列中的命令提交事务如果发生变化那么它不会执行任何事务中的命令而去事务回滚。无论事务是否回滚执行了【exec】命令Redis 都会去取消执行事务前的 watch 命令监控锁同时返回Nullmulti-bulk应答以通知调用者事务执行失败信息。
10、redis的主从复制
10.1、说明 主机数据更新后根据配置和策略自动同步到备机的机制Master以写为主Slave以读为主。
10.2、作用 实现读写分离容灾恢复。
10.3、使用案例
10.3.1、创建三个redis服务器79、80、81 10.3.2、并复制三个redis.conf配置文件根据服务器分别开启【指定端口】【daemonize yes】【修改pid文件名字】【log文件名字】【dump.rdb名字】 10.3.3、启动三台服务器 10.3.4、使用命令【info replication】可以查看三台服务的主从复制信息。reolemaster表示主机/slave表示从机。也就是说不设置的话默认就是主机。 10.3.5、如何设置从机如将80和81设置为79的从机使用命令【SLAVEOF ip 端口】来实现 10.3.6、当80和81设置为79的从机之后从机会备份主机库中所有的数据。80和81成为从机前和成为从机后的数据都会备份。(k4是有从机后的数据。k1和k2是无从机之前的数据可以看出都可以从从机读取出来。) 10.3.7、写入数据只有主机可以从机是不可以写入数据的写入时会报错 10.3.8、当主机关机停止工作时从机会原地待命既不会停止工作也不会代替主机工作直到主机恢复继续备份主机。一切照旧。 10.3.9、当从机80停止工作时之后又恢复的从机不会再是从机的身份会恢复为主机身份要想再次作为从机为主机工作必须再次执行命令【SLAVEOF ip 端口】设为从机。要想设置该机永久为从机必须写进配置文件redis.conf。 10.3.10、当前从机也可以有从机如81是80 的从机80是79的从机。 10.3.11、如果主机停止工作时可以使用命令【SLAVEOF no one】 将从机转为主机成为新的主机注意的是其他的从机要重新设置备份的主机。 10.3.12、复制原理
slave从机启动成功连接到master主机后会发送一个sync同步命令Master主机接到命令启动后台的存盘进程同时收集所有接收到的用于修改数据集命令在后台进程执行完毕之后master主机将传送整个数据文件到slave从机,以完成一次完全同步 全量复制而slave从机服务在接收到数据库文件数据后将其存盘并加载到内存中。 增量复制Master主机继续将新的所有收集到的修改命令依次传给slave从机,完成同步但是只要是重新连接master主机,一次完全同步全量复制)将被自动执行。
10.3.13、哨兵模式
10.3.13.1、什么是哨兵模式
能够从后台监控主机是否故障如果故障了根据投票数自动将从机转换为主机。也就是说如果主机挂了哨兵模式会通过投票在从机中选出新的主机来使用。没有被选中的从机会自动设置为新主机的从机如果以前的老主机又重新恢复会被自动设置为新主机的从机不再是主机这就是哨兵模式的优点。
10.3.13.2、使用方式 使用环境一主二从79是主机80、81是从机 在自定义的/RedisRun目录下新建sentinel.conf文件名字绝不能错。 配置哨兵在文件【sentinel.conf】中填写内容为【sentinel monitor 被监控的主机名字(自己随便起名字) 127.0.0.1 6379 1】 注意上面最后一个数字1表示主机挂掉后salve投票看让谁接替成为主机得票数多少后成为主机 使用命令【redis-sentinel】运行该文件; 命令为【/usr/local/bin/redis-sentinel /RunRedis/sentinel.conf】 出现如下效果表示哨兵模式开启成功 使用命令【shutdown】关闭服务模拟主机出现故障。 稍等30秒左右查看哨兵模示的运行窗口是否有新主机的投票结果。根据日志信息我们可以看出新选出来的主机是6381. 验证试一下新主机是否是6381 从图可以看出新选出开的主机是6381并且6380也自动转换成了6381的从机。 8.如果这时已停机的6379又恢复使用会自动成为新主机6381的从机查看查看效果 启动主机6379 查看哨兵日志信息自动将7379设置为6381的从机
10.3.14、复制的缺点
复制延迟 由于所有的写操作都是先在Master(主机)上操作然后同步更新到Slave从机上所以从Master主机同步到Slave从机机器有一定的延迟当系统很繁忙的时候延迟问题会更加严重Slave从机机器数量的增加也会使这个问题更加严重。
11、面试题
1、Redis是什么都有哪些使用场景
Redis是一个开源的使用C语言编写的是一个高性能的K,V键值对分布式内存数据库。数据高并发的读写海量数据的读写对扩展性要求高的数据
2、redis 为什么是单线程的? 内存操作高效性 Redis 数据主要存储在内存中内存访问速度非常快相比磁盘 I/OCPU 不是性能瓶颈。由于所有操作都在内存中完成多线程带来的并发处理优势在这种场景下并不显著。 避免锁竞争 单线程模型可以避免多线程环境中的锁竞争问题使得代码逻辑更简单、执行效率更高。Redis 中的数据结构如链表、哈希表等都被设计为无锁或极少使用锁这在单线程环境下可以保证操作的原子性和一致性。 简化编程模型 单线程架构简化了编程模型无需考虑复杂的并发控制和同步机制使 Redis 代码更加简洁更易于理解和维护。 网络 I/O 多路复用技术 Redis 使用 I/O 多路复用技术如 epoll、kqueue 或者 select来监听多个客户端连接请求虽然只有一个线程服务这些请求但该线程可以在等待一个命令执行完毕的同时处理其他客户端的读写事件从而实现在单线程上高效的并发处理能力。 高吞吐量与低延迟 单线程模式能够提供很高的吞吐量并且由于没有上下文切换的开销因此延迟相对较低。对于 Redis 这种主要用于缓存和快速数据访问的应用场景来说牺牲多核并行计算的能力换取更高的单个请求响应速度是有意义的。
3、什么是缓存穿透、缓存击穿、缓存雪崩
3.1、 缓存穿透 用户请求的数据在缓存和数据库中都没有。比如恶意用户不断查询不存在的用户信息每次查询都会去查数据库导致数据库压力大。解决办法是在缓存层对查询结果为空的情况也设置一个特殊的值如空对象或者使用布隆过滤器提前拦截一定不存在的数据请求。
解决方式
布隆过滤器在请求到达缓存之前先经过一个布隆过滤器。布隆过滤器可以用来判断一个数据是否存在数据库中对于确定不存在的数据直接返回“未找到”避免对数据库进行查询。空值缓存即使查询结果为空也将空值缓存起来设置一个合理的过期时间这样下次同样的查询会直接从缓存获取。
3.2、 缓存击穿 热点数据经常访问的数据过期后大量并发请求同时过来所有请求都直接去找数据库让数据库不堪重负。就像一堵墙被连续猛烈撞击而破洞一样。解决方法是在缓存失效时加锁只允许一个请求穿透到数据库获取数据并在拿到数据后立即回填到缓存其他请求等待解锁后再从缓存读取。
解决方式
互斥锁Mutex Lock当某个热点数据即将过期或已过期时为这个 key 设置一个互斥锁仅允许一个线程去数据库查询并回填缓存其他线程等待解锁后读取缓存。永不过期策略对于非常重要的热点数据可以考虑将它们设置为永不过期通过后台服务定期更新其缓存。
3.3、 缓存雪崩 大量的缓存在同一时间失效所有的请求像雪崩一样全部涌向数据库导致数据库瞬间崩溃。这可能是因为缓存服务器整体故障或大规模缓存统一过期等。处理方式包括构建缓存集群提高可用性、分散缓存过期时间、设置熔断机制在流量过大时暂时保护数据库不被打垮。
解决方式
分散过期时间设置缓存过期时间时引入随机性防止大量缓存在同一时刻失效。分层缓存使用二级缓存或者本地缓存即使一级缓存如 Redis挂掉也能暂时依靠其他缓存层级抵挡住部分请求压力。缓存预热在系统上线或缓存重建前提前将可能访问到的数据加载到缓存中避免瞬间大量请求打到数据库。熔断与限流降级当检测到数据库压力过大时利用熔断机制暂停非核心业务的写操作并且采用限流措施减少并发读请求的数量优先保障核心服务稳定运行。
4、redis 支持的数据类型有哪些
string、list、hash、set、zset。
5、怎么保证缓存和数据库数据的一致性
先删缓存后写数据库DCTWD 这个策略相对简单且实用适用于大部分读多写少、对数据一致性要求不是非常严格的场景。
延时双删策略 在更新数据库后立即删除缓存并设置一个短时间的延迟任务再次删除缓存。这种策略可以有效减少因网络延迟等因素导致的数据不一致问题尤其适用于并发写操作较多且对数据一致性有一定要求的场景。
使用消息队列异步处理 对于高并发或者强一致性的场景通过引入消息队列进行解耦确保数据库更新和缓存更新的最终一致性。这种方式虽然复杂度较高但能较好地应对分布式系统中的各种异常情况。
7、redis 持久化有几种方式
RDBRedis Database指定的时间间隔能对数据进行快照存储。 AOFAppend Only File每一个收到的写命令都通过write函数追加到文件中。
附加 当redis开启了AOF时redis启动服务时默认就是读取AOF,所以当redis开启AOF时,恢复时就会以AOF为默认。可以和RDB共存但恢复数据时不会执行rdb文件。
8、redis 淘汰策略有哪些
volatile-lru从已设置过期时间的数据集server. db[i]. expires中挑选最近最少使用的数据淘汰。volatile-ttl从已设置过期时间的数据集server. db[i]. expires中挑选将要过期的数据淘汰。volatile-random从已设置过期时间的数据集server. db[i]. expires中任意选择数据淘汰。allkeys-lru从数据集server. db[i]. dict中挑选最近最少使用的数据淘汰。allkeys-random从数据集server. db[i]. dict中任意选择数据淘汰。no-enviction驱逐禁止驱逐数据。
9、redis 有哪些功能
数据缓存功能、分布式锁的功能、 数据持久化、支持事务、消息队列