笔记redis

news2025/7/20 13:06:08

redis特点:

1.这些数据类型都支持 push/pop. add/remove 及取交集并集和差集及更丰富的操作

2.Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中进行持久化

3.单线路+IO多路复用

4.redis操作是原子性操作

redis   单线程模型:

Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。

文件事件处理器的结构包含4个部分:①多个socket;②IO多路复用程序;③文件事件分派器;④事件处理器(命令请求处理器,命令回复处理器,连接应答处理器等等)。

当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

文件事件处理器是单线程模式运行的,但是通过IO多路复用机制监听多个socket,并根据socket目前执行的任务来为套接字关联不同的事件处理器。可以实现高性能的网络通信模型。又可以跟内部其他单线程的模块进行对接,保证了Redis内部的线程模型的简单性。

redis默认端口:6379

默认16个数据库。默认使用0号库

redis在linux下安装步骤

  1. 检测是否安装C语言环境  如果没有安  gcc -version
  2. 如果没有安装  通过  yum install gcc
  3. 解压redis安装包  同时在redis文件目录 执行make命令
  4. 执行make命令后  执行make install

redis.conf配置:

  1. protected-mode yes 只支持本机访问 no 支持远程访问
  2. tcp-backlog 511 设置tcp的backlog , backlog 其实是一个连接队列 , backlog队列总和=未完成三E次握手队列+已经完成三次握手队列。。在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。。
  3. timeout 0 0代表永不超时 超时时间单位秒
  4. tep-keepalive 300 每隔300s判断是否连接 不连接释放连接
  5. daemonize 设置后台启动
  6. logleval debug verbose notice【生产环境】
  7. logfiile 日志输出路径
  8. database 16 默认16个数据库
  9. requirepass : 设置redis登陆密码
  10. maxclients 10000 客户端最大连接数 大于此连接数拒绝访问
  11. maxmemory 内存最大值

redis:修改配置文件内容两种方式

  1. 第一种直接修改redis安装目录下的  redsi.conf   目录下的内容
  2. 进入  redis  通过   config  get   配置文件参数名     获取
  3. 进入redis    通过  config   set    配置文件参数名     value   来设置值

redis启动方式:

  1. 前台启动   执行redis-server   但是有缺点  会让redis再关闭窗口后直接停止
  2. 后台启动  修改redis.conf  文件  找到 daemonize 将no修改成yes  实现后台启动 改成后台启动'  进入  usr/local/  执行  redis-server /conf所在目录+redis.conf
  3. redis  进入edis命令  redis-cli   
  4. redis-cli -p 端口 多个通过加端口的方式进入  或者添加ip  redis-cli -h  ip  -p  端口方式进入
  5. kill -9  进程号  关闭redis 或者在redis中直接shutdown

redis主从配置:[一主多从:单台虚拟机,从机下也可以继续添加他的从机]

第一种方式:【单台机器实现一主多从配置】

  1. 复制redis的默认配置文件到自己新创建目录
  2. 创建多个配置文件 命名方式随意  内部定制如下

include /myredis/redis.conf

pidfile /var/run/redis 6379.pid

port 6379

dbfilename dump6379.rdb

  1. 将redis默认的.conf文件与自己新加的conf文件放到一起 
  2. 添加主从配置:在想要做从机上执行   slaveof   ip   端口   当前服务器默认变成从机
  3. 通过  info  replication  可以查看  主机  从机状态

第二种方式:[一主多从:多台虚拟机]

  1. 复制redsi配置文件 自己定义 一个新文件或者用原有文件不复制
  2. 在主机配置bind配置中默认填写自己的主机ip地址 默认不添加 从机无法被访问
  3. 从机中执行slaveof 命令   slaveof  ip  port   如果添加账号密码  需要进行验证 如果不添加账号密码  可以直接实现主从  默认需要关闭防火墙策略 或者打开端口 
  4. 依次启动redis-server   自己命名的conf文件
  5. 如果需要将从机变成主机 那么可以再从机上执行slaveof  no  one  这种情况下主机默认变成从机  从机默认变成主机  属于手动修改。也可以通过哨兵模式

主从复制原理:

  1. 当从机连接上主服务器之后,从服务器向主服务发送进行数据同步消息
  2. 主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化存入到rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
  3. 每次主服务器进行写操作之后,和从服务器进行数据同步

注意:redis可以自己搭建多个主从   也可以创建 多台虚拟机  创建多个redis实现主从

  • Slave 启动成功连接到master后会发送一个sync命令。
  • Master 接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后, master将传送整个数据文件到slave,以完成一次全量全同步。
  • 全量复制 :而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。。
  • 增量复制: Master继续将新的所有收集 到的修改命令依次传给slave,完成同步。
  • 但是只要是重新连接 master,就会重新完成一次全量同步(全量复制将被自动执行)

注意:

1.当从服务器重启或者挂掉时  从服务器默认变成master主服务器  我们需要手动执行 slaveof  让他变成主服务器。同时丢失的数据默认从服务器会重新获取到主服务器的全量数据

2.当主服务器挂掉或者停止时  从服务器默认还是从服务器。并且重启主服务器时  主服务器依然能找到两个从服务器

redis:哨兵模式

解释:当主机挂掉时:可以实现将从机转换成主机,当主机启动后 主机变成从机

配置哨兵的步骤:

1:在所创建的主从配置文件目录下  新建sentinel.conf

2:  在配置文件中添加 sentinel monitor mymaster 127.0.0.1 6379 1    1代表多少个哨兵   因为有可能同时配置多个哨兵来进行监控

3:在执行   redis-sentinel  /配置文件目录/配置文件名称      实现启动哨兵模式  可以同时启动多个哨兵模式

哨兵模式选举主机条件【故障恢复】:

1:通过优先级选取    根据 replica-priority 100   如果值越小  优先级越高   

2:根据偏移量最大的   偏移量越大和其他从服务器同步的主服务器数据越多

3:选择runid最小的   redis启动后随机生成的一个40位的runid

哨兵模式的工作原理:

  1. 每个Sentiel以每秒钟一-次的频率向它所知的Master, Slavel以及其他Sentine|实例发送一 个 PING命令。
  2. 如果一个实例(instance) 距离最后- -次有效回复PING命令的时间超过down-atter-milliseconds选项所指定的值,则这 个实例会被Sentinel标记为主观下线。
  3. 如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒- -次的频率确认Master的确进入了 主观下线状态
  4. 当有足够数量的Sentinel (大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
  5. 在-般情况下,每个Sentinel会以每10秒- -次的频率向它已知的所有Master, Slave发送INFO命令。当Master被Sentinel标记为客观下线时,Sentinel 向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次
  6. 若没有足够数量的Sentine|同意Master已经下线,Master的客观 下线状态就会被移除;若Master 重新向Sentinel的PING命令返回有效回复,Master 的主观下线状态就会被移除。

缓存穿透出现的两个原因:

1:应用服务器压力变大

2:大量请求时,缓存命中率降低。出现大量直接查询数据库,但是redis还是在平稳的运行

解决缓存穿透的几种方式:

  1. 对空值缓存:如果-个查询返回的数据为空(不管是数据是否不存在) ,我们仍然把这个空结果( null )进行缓存,设置空结果的过期时间会很短,最长不超过五分钟

   优点

  •    实现简单维护方便 
  •    因为redis是直接读取内存的  所以会造成redis一些无用的消耗
  1. 设置可访问的名单(白名单) :使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
  2. 采用布隆过滤器: (布隆过滤器( Bloom Filter )是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。
  • 内存占用少
  • 实现复杂,并且存在误判

缓存击穿:当出现一个key过期的一瞬间有大量的请求涌入进来。造成直接访问数据库造成瞬时压力

解决办法:

  1. 预先设置热门数据:在redis 高峰访问之前,把一些热门key数据提前存入到redis里面,加大这些热点key数据key的时长。
  2. 实时调整:现场监控哪些数据热门,实时调整key的过期时长。
  3. 使用分布式锁

缓存雪崩:在某一个时间段内,查询数据量比较大。同时我又出现了大量的key过期。造成数据库访问眼里巨大甚至过期。这种叫做缓存雪崩。

解决办法:

  1. 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量) , 如果过期会触发通知另外的线程在后台去更新实际key的缓存。
  2. 将缓存失效时间分散开:。比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5 分钟随机,这样每-个缓存的过期时间的重复率就会降低,就很难引发集体失效的重性
  3. 通过限流措施 实现对请求的限流操作。这一般是缓存和其他限流组件一起实现  比如说springcloud的sentinel  hystrix等

redis集群:[无中心化集群] redis集群可以通过任意一个节点进入,不需要进入固定节点】

集群能解决什么问题:

  1. 扩容问题:
  2. 并发写操作问题:

Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的N分之1.

Redis集群通过分区( partition )来提供一定程度的可用性 ( availbility) :即使集群中有-部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

集群分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

  1. 互斥性。在任意时刻,只有一个客户端能持有锁。。
  2. 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
  3. 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人。
  4. 加的锁给解了,加锁和解锁必须具有原子性。

集群搭建步骤:

  • 在复制出来的配置文件中新加三条命令:

cluster-enabled yes    是否是集群

cluster-config-file nodes-6379.conf   集群的自定义配置文件  默认自动生成当前文件

cluster-node-timeout 15000            多少毫秒后自动切换集群

  • 创建集群命令:redis-cli --cluster create --cluster-replicas 1   ip  端口   ip端口  IP 端口
  • 集群进入redis命令   redis-cli -c -p 端口号
  • cliuster nodes 查看节点信息

集群插槽计算原理:

集群使用公式CRC16(key) % 16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验。如果插入多个值的情况下根据分组来取模计算

集群中的每个节点负责处理一部分插槽。举个例子 ,如果一个集群可以有主节点 ,

其中:节点A负责处理0号至5460号插槽。

节点B负责处理5479号至8761号插槽。

集群故障恢复:

如果主机挂掉,那么从机将会变成主机

如果主机和从机都挂掉了,根据配置文件来定制。cluster-require-full-coverage : 如果为yes那么整个集群都挂掉了。 如果为no 那么只是该段的插槽不能用。

redis建的操作

  1. 切换数据库命令 :      select  【默认16个数据库】
  2. 查询key操作                查询所有key   keys *    
  3. 查询key是否存在      exists  key值   如果返回1  代表数据存在  如果返回0代表数据不存在
  4. 删除key                     del   key  key   key   key  key值
  5. 删除key第二种方式      ulink  key值   他会先删除元数据   后续异步执行真正的删除操作
  6. 设置redis数据过期时间    expire  key值    时间 【秒单位】
  7. 设置redis过期时间  pxpire key milliseconds【毫秒】
  8. 查询过期时间   ttl  key值   如果返回-1  代表永不过期   如果返回-2  代表已经过期
  9. 清除当前库     flushdb
  10. 查询KEY类型   type  key   
  11. 查看rendis信息    info  repliaction   
  12. 根据端口号连接命令    redis-cli   -p 端口号
  13. 根据主机IP连接redis    redis-cli -h ip -p  port
  14. 查询key的插槽值 cluster keyslot key
  15. 查询key的插槽值 cluster countkeysinslot
  16. 查询集群完整性 redis-cli --cluster check -h 127.0.0.1 -p 6379
  17. 添加新节点进入到集群 redis-cli --cluster add-node 192.168.204.203:6306 192.168.204.203:6300
  18. 为该节点添加新的槽 redis-cli --cluster reshard 192.168.204.203:6300
  19. 为主节点添加从节点ID redis-cli --cluster add-node 192.168.204.203:6307 192.168.204.203:6306 --cluster-slave --cluster-master-id 73254af4b47aa0403e606a14f8a796b3247a9c6a
  20. 删除master,删除 salve节点 redis-cli --cluster del-node 192.168.204.203:6306 73254af4b47aa0403e606a14f8a796b3247a9c6a

1.redis的基本数据类型:  String  

String数据结构

String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList ,采用预分配冗余空间的方式来减少内存的频繁分配.

如图中所示,内部为当前字符串实际分配的空间capacity -般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M ,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

1:String :基本的数据类型 一个key对用一个value    一个redis中字符串的value值最大存储512M

字符串常用命令:

  1. set   key  value   设置值   通过set设置相同的key  当前有的key 的value值会被覆盖
  2. get  key    获取value值
  3. append  key   字符串  向当前存在的key后追加内容   返回结果是字符串长度 
  4. strlen  key    返回字符串的长度
  5. setnx   key   value   当前只当当前key不存在的时候才能设置值  如果存在不做任何操作
  6. incr   key  当key所对应的value是数字类型默认value+1
  7. decr  key  当key所对应的value是数字类型默认value-1
  8. incrby  key   step   当key所对应的value是数字类型默认value+step
  9. decrby  key  step 当key所对应的value是数字类型默认value-step
  10. mset key value  key value  key value   可以同时设置多个值
  11. mget  key key key   可以返回多个key值
  12. msetnx  key value  key value  key value
  13. getrange  key   起始位置  结束位置    可以做分割
  14. mset k{g} v k {g} v k v 集群中添加多个值的方法。这种情况需要添加一个分组

List:单键多值

List的数据结构为快速链表quickList首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist ,也即是压缩列表。。它将所有的元素紧挨着一起存储 ,分配的是一块连续的内存。。当数据量比较多的时候才会改成quicklist.。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next.。

Redis将双端链表和ziplist结合起来组成了quicklist。 也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(边)或者尾部(右边)。。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现。

常用命令:

  1. lpush  key  value  vale value...    从左侧放  如果再次执行 同一个key继续从左到右放而不是覆盖key
  2. rpush  key  value  value  value...    从右侧放如果再次执行 同一个key继续从左到右放而不是覆盖key 
  3. lrange key   0   -1 查询所有值
  4. lpop key  从左侧取第一个值,值如果值取光了  那么键自动消亡
  5. rpop  key  从右侧取出第一个值   如果值取光了  那么键自动消亡
  6. llen  获取集合的长度
  7. lindex  key  index   根据集合下标获取值  [从左到右获取]
  8. linsert key  before value newvalue  在集合中的某一个value值前添加一个新的值
  9. lrem  key   number value   [从左到右删除number个 value值为value的值]
  10. lset  key  index  value    在index位置替换值

SET:

Redis 的 Set是 string类型的无序集合。它底层其实是一个 value 为 null 的 hash表,所以添加,删除,查找的复杂度都是 O(1)一个算法,随着数据的增加,执行时间的长短,如果是 O(1),数据增加,查找数据的时间不变

  1. sadd  key   value value
  2. smembers < Key>查询该KEY值
  3. sismember 判断集合是否为含有该值,有1 ,没有0。
  4. scard 返回该集合的元素个数。
  5. srem ... 删除集合中的某个元素。。
  6. spop 随机从该集合中吐出一个值。该值会从集合中删除掉
  7. spop count   随机从集合中抽出count个数据  然后删除集合中数据
  8. srandmember 随机从该集合中取出n个值。不会从集合中删除。。
  9. smove value把集合中一个值从一个集合移动到另一个集合。
  10. sinter 返回两个集合的交集元素。。
  11. sunion 返回两个集合的并集元素。。
  12. sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)。返回k2中不包k1的值

Hash数据结构:

  1. Hash类型对应的数据结构是两种: ziplist (压缩列表),hashtable (哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable.
  2. hset .................给集合中的键赋值
  3. hget 从集合取出 value
  4. hmset ...批量设置 hash 的值
  5. hexists查看哈希表 key 中,给定域 field 是否存在。
  6. hkeys 列出该 hash 集合的所有 field
  7. hvals 列出该 hash 集合的所有 value
  8. hincrby field为哈希表 key 中的域 field 的值加上增量 1 -1
  9. hsetnx 将哈希表 key 中的域 field 的值设置为 value,当且仅当域field不存在 

Zset:SortedSet (zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map ,可以给每一个元素 value赋予一个权重score ,另-方面它又类似于TreeSet ,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。。

zset底层使用了两个数据结构。

( 1 ) hash , hash的作用就是关联元素value和权重score ,保障元素value的唯-性,可以通过元素value找到相应的score值。

(2 )跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表,实际是一个可以二分查找的有序链表。

  1. zadd ...将一个或多个member元素及其score值加入到有序集key当中。。
  2. zrange < key> [ WITHSCORES]返回有序集key中,下标在之间的元素带WITHSCORES ,可以让分数-起和值返回到结果集。
  3. zrangebyscore key min  max [withscores] [imit offset count].返回有序集key中,所有score 值介于min和max之间(包括等于min或max )的成员。有序集成员按score值递增(从小到大)次序排列。
  4. zrevrangebyscore key max min [withscores] [limit offset count]同上,改为从大到小排列。
  5. zincrby 为元素的 score加上增量
  6. zrem 删除该集合下,指定值的元素。
  7. zcount  统计该集合,分数区间内的元素个数。
  8. zrank 返回该值在集合中的排名,从0开始。

redis:发布订阅功能:

redis事务机制:Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。

redis事务的几个特性:

1.互斥性

2.排他性

事务的常用命令:

multi:开启事务

exec :执行命令

discard:关闭事务

从输入multi开始输入的命令都会依次进入命令队列中去,但不会执行,直到输入Exec后   redis会将之前的命令队列中的命令进行执行

事务包含两个阶段 一个是组队阶段  一个是执行阶段

组队阶段:组队阶段是向命令队列中执行命令

执行阶段:指的是执行在命令队列里的命令阶段  如果在执行阶段有命令失败  其他命令依然会执行成功

redis:事务三大特性

为单独的隔离操作 。

  1. 事务中的所有命令 都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 没有隔离级别的概念 。队列中的命令没有提交之 前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
  3. 不保证原子性 。事务中如果有一 条命令执行失败,其后的命令仍然会被执行,没有回滚。

redis采用乐观锁机制: 监视一个(或多个) key ,如果在事务exec执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。下面这个例子:我们在观察的时候k1值为1,但是事务执行的时候k1值为2,k1被修改了所以不能执行事务。

  1. 通过命令 watch key 。。。。。 来实现对key的监视,如果在监视key之前 key进行了改动 那么开启事务之后 修改当前key会失败 因为版本号不一致。
  2. 通过命令 unwatch key 【key.....】 实现对key解除监视。

redis持久化操作:【redis默认开启】

RDB:dump.rdb  文件   【全量备份】 RDB是一次的全量备份,即周期性的把Redis当前内存中的全量数据写入到一个快照文件中

Redis,会单独创建(调用C函数的 fork()方法) -个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件昔换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

fork的作用:

●Fork 的作用是复制一个与当前进程一样的进程。 新进程的所有数据(变量,环境变量、程序计数器等)数值都和原进程-致,但是是一个全新的进程,并作为原进程的子进程

●在Linux 程序中, fork0会产生-个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑, Limux中引入了“写时复制技术【copy-on-write】”

●一般情况父进程和子进程会共用同一段物理内存 ,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

RDB优点:

●适合大规模的数据恢复

●对数据完整性和一 致性要求不高更适合使用

●节省磁盘空间

●恢复速度快

RDB:备份  当数据丢失时进行数据备份恢复

AOF(append  nly  file)【默认不开启】

以日志的形式来记录每个写操作(增量保存),将 Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件, redis启动之初会读取该文件重

新构建数据,换言之, redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

如何开启AOF功能:在redis.cnf 文件中开启

AOF和RDB同时开启 默认执行AOF

redis异常恢复:在redis的bin目录执行

AOF流程:

  1. 所有写入命令追加到aof_buf缓冲区。
  2. AOF缓冲区根据对应的策略向硬盘做同步操作。
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
  4. 当redis服务器重启时,可以加载AOF文件进行数据恢复。

AOF优点:

  • AOF提供了3种保存策略:每秒保存、跟系统策略、每次操作保存。实时性比较高,一般来说会选择每秒保存,因此意外发生时顶多失去-秒的数据。
  • 文件追加写形式,所以文件很少有损坏问题,如最后意外发生少写数据,可通过redis-check-aof工具修复。
  • AOF由于是文本形式,直接采用协议格式,避免二次处理开销,另外对于修改也比较灵活。

AOF缺点:

  • AOF文件要比RDB文件大。
  • AOF冷备没RDB迅速。
  • 由于执行频率比较高,所以负载高时,性能没有RDB好。

redis建过期删除策略:

  1. 定时删除:在设置的过期时间同时,创建一个定时器在键的过期时间来临时,立即执行对键的操作删除。
    1. 优点:节约内存,到时间执行删除,释放内存空间; .
    2. 缺点: CPU资源占用率过高,当其他任务在执行时,会导致两者同时进行,会影响两者的效率,redis服务 器的响应时间和指令吞吐受到影响
  1. 惰性删除:放任过期键不管,但每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除,如果没有就返回该键。
    1. 优点: CPU的使用率大大降低,减轻其压力;
    2. 缺点:内存空间占用率较高,会存在长期占用内存的数据
  2. 定期删除:每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对cpu时间的影响。

redis8种:内存淘汰策略

  1. noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键。
  2. allkeys-lru: 加入键的时候,如果过限,首先通过LRU算法驱逐最最近没有使用的键。
  3. volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最近很少使用的键。
  4. allkeys-random:加入键的时候如果过限,从所有key随机删除。
  5. volatile-random:加入键的时候如果过限,从设置过期的键中随机删除。
  6. volatile-ttl:从配置了过期时间的键中驱逐将要过期的键。
  7. volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键。
  8. allkeys-lfu: 从所有键中驱逐使用频率最少的键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chrome插件开发(manifest_version版本V3 + Ant Design Vue)

1.什么是 Chrome 插件 谷歌浏览器插件是一种小型的定制浏览器体验的程序&#xff0c;通过插件可以自定义浏览器的一些行为来适合个人的需求&#xff0c;例如上面的查看服务器状态插件。 在应用商店中下载下来的插件基本上都是以.crx 为文件后缀&#xff0c;该文件其实就是一个…

Word2Vec

Word2Vec 在自然语言发展的早期阶段&#xff0c;词的表示经历了不断地发展和改进&#xff0c;直到后来有一种word vector的思想被提出以及后续的实现&#xff0c;才极大地促进了NLP的发展。 word vector的核心思想&#xff1a; 为每个单词构建一个密集向量&#xff0c;选择后…

傻白入门芯片设计,先进封装技术(五)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作&#xff0c;封装对芯片来说是必不可少的&#xff0c;随着IC生产技术的进步&#xff0c;封装技术也不断更新换代&#xff0c;每一代IC都与新一代的IC封装技术紧密相连。 一、什么是封装&#xf…

什么蓝牙耳机颜值高音质好?颜值高音质好的蓝牙耳机推荐

朋友让我推荐蓝牙耳机的时候&#xff0c;总是喜欢问哪款蓝牙耳机的性能更强&#xff0c;想要直接入手那款性能更强的蓝牙耳机&#xff0c;以此节省对比的时间。但是用户自行进行对比的步骤&#xff0c;显然是不能省的&#xff0c;所以今天我给四款蓝牙耳机做了横向对比&#xf…

C语言tips-NULL指针和void指针

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. void指针 1.1 解释 void 用在函数定义中可以表…

身份安全风险分析

摘要 从勒索软件到 APT&#xff0c;身份风险是重要的攻击向量。 管理 Active Directory 的复杂性&#xff0c;导致所有组织都存在1/6的可利用的特权身份风险。 这些身份风险包括使用过时密码的本地管理员、具有不必要权限的错误配置用户、在终端上暴露的缓存凭据等。 当攻击者…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群&#xff1a; 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词&#xff08;一&#xff09; 让学前端不再害怕英语单词&#xff08;二&#xff09; 让学前端不再害怕英语单词&#xff0…

单目标应用:最有价值球员算法(Most Valuable Player Algorithm,MVPA)求解旅行商问题TSP

一、最有价值球员算法 最有价值球员算法&#xff08;Most Valuable Player Algorithm&#xff0c;MVPA&#xff09;由Bouchekara 等人于2017年提出&#xff0c;该算法受到体育比赛的启发&#xff0c;球员们为了赢得冠军而组成队伍进行队伍竞争&#xff0c;他们也为了赢得最有价…

使用VMware安装系统Window、Linux操作系统

使用VMware安装系统Window、Linux操作系统 下载镜像文件打开VMware 下载镜像文件地址或链接&#xff1a; Windows全家桶镜像文件下载网站&#xff1a;msdn.itellyou.cnWindows 10 种子文件 ed2k://|file|cn_windows_10_business_editions_version_1803_updated_aug_2019_x64_dv…

Js逆向教程-14反调试

Js逆向教程-14反调试 一、检测是否在调试 键盘监听&#xff08;F12&#xff09;检测浏览器的高度插值检测开发者人员工具变量是否为true利用console.log调用次数利用代码运行的时间差利用toString检测非浏览器 二、显性 2.1 debugger&#xff1a; function xx() {debugger;…

盘点re:Invent历年重磅创新:今年亚马逊云科技又将有哪些重磅发布?

“云计算春晚”re&#xff1a;Invent即将开幕&#xff0c;这一次亚马逊云科技会带来哪些重磅发布&#xff1f; 一年一度的亚马逊云科技re:Invent大会即将在下周开幕。作为云计算行业的顶级盛事&#xff0c;亚马逊云科技re:Invent大会看出云计算领域创新的风向标&#xff0c;也…

QQ小程序——无法正常创建项目与uniapp联动问题

目录 一、使用QQ小程序开发者工具无法创建项目 情境引入 检查原因 解决方法 总结&#xff1a; 二、QQ小程序开发者工具无法与uniapp联动 情境导入 问题排错 解决方法 三、QQ小程序开发者工具无法正常上传 情境导入 错误分析 解决方法 心得分享 分清工作和学习的区别…

运动耳机什么牌子的好,推荐几款排行靠前的耳机

骨传导耳机近些年在耳机界迅速燃起&#xff0c;其设计原理是由贝多芬含棍棒发声所启发&#xff0c;而佩戴骨传导耳机主要是为了防止细菌在耳道内的滋生&#xff0c;除此之外骨传导耳机的佩戴方式也是直接将耳机套在头骨处即可完成佩戴&#xff0c;不用进入耳道&#xff0c;能够…

【torch-sparse及pytorch-geometric 安装】

torch-sparse及pytorch-geometric 安装 pip安装完pytorch-geometric之后&#xff0c;报错No module named torch_sparse 然后安装pip安装torch-sparse&#xff0c;结果报错&#xff0c;百度一下怎么安装&#xff0c;无果&#xff0c;转战官方文档&#xff0c;成功&#xff01; …

实验讲解-线程池停止执行任务 Executor.execute shutdown awaitTermination shutdownNow()

1 Executor.execute public interface Executor { 在将来的某个时间执行给定的可运行的任务。该可运行的任务可以在新线程、池线程或调用线程中执行&#xff0c;由Executor实现决定。 参数&#xff1a; command–可运行的任务 投掷&#xff1a; RejectedExecutionException–…

Kafka生产者之分区

一、分区好处 &#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务&#xff0c;可以实现负载均衡的效果&#xff1b; &#xff08;2&…

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现&#xff1a;显示页面 前端实现&#xff1a;显示购物车信息 分析 用户如果没有登录&#xff0c;购物车存放在浏览器端的localStorage处&#xff0c;且以数组的方式进行存储。用户如果登录了&#xff0c;购物车存放在redis中&#xff0c…

项目实战——对战回放和排行榜

目录 一、天梯积分更新 二、实现对局列表页面 三、前端测试 四、实现查看录像功能 五、实现分页功能 六、后端实现查询排行耪 七、前端展示 八、限制Bot数量 一、天梯积分更新 可以自己定义一下规则 存之前算一下两名玩家的天梯积分 实现更新&#xff0c;实现后重启看一…

挂耳式蓝牙耳机性价比推荐,盘点五款性能高的耳机分享

众所周知&#xff0c;骨传导耳机之所以能够受到人们的喜欢&#xff0c;是因为其佩戴不需入耳&#xff0c;尤其是针对于运动爱好者来说&#xff0c;在户外运动的时候不但可以听见音乐&#xff0c;还可以听见外界的声音&#xff0c;进一步的将危险系数拉低&#xff0c;其次也是因…

音乐信息提取-1-音频表示

音频信号是声音的一种表示&#xff0c;它表示由振动引起的气压随时间的波动&#xff08;数字信号处理-1-关于声音与波&#xff09;。 1 波形与时域 音频信号在时域上的表示就是波形随时间的变化&#xff0c;可以将波形的幅度值理解为声压。 声音是连续的&#xff0c;但数字记…