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下安装步骤
- 检测是否安装C语言环境 如果没有安 gcc -version
- 如果没有安装 通过 yum install gcc
- 解压redis安装包 同时在redis文件目录 执行make命令
- 执行make命令后 执行make install
redis.conf配置:
- protected-mode yes 只支持本机访问 no 支持远程访问
- tcp-backlog 511 设置tcp的backlog , backlog 其实是一个连接队列 , backlog队列总和=未完成三E次握手队列+已经完成三次握手队列。。在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。。
- timeout 0 0代表永不超时 超时时间单位秒
- tep-keepalive 300 每隔300s判断是否连接 不连接释放连接
- daemonize 设置后台启动
- logleval debug verbose notice【生产环境】
- logfiile 日志输出路径
- database 16 默认16个数据库
- requirepass : 设置redis登陆密码
- maxclients 10000 客户端最大连接数 大于此连接数拒绝访问
- maxmemory 内存最大值
redis:修改配置文件内容两种方式
- 第一种直接修改redis安装目录下的 redsi.conf 目录下的内容
- 进入 redis 通过 config get 配置文件参数名 获取
- 进入redis 通过 config set 配置文件参数名 value 来设置值
redis启动方式:
- 前台启动 执行redis-server 但是有缺点 会让redis再关闭窗口后直接停止
- 后台启动 修改redis.conf 文件 找到 daemonize 将no修改成yes 实现后台启动 改成后台启动' 进入 usr/local/ 执行 redis-server /conf所在目录+redis.conf
- redis 进入edis命令 redis-cli
- redis-cli -p 端口 多个通过加端口的方式进入 或者添加ip redis-cli -h ip -p 端口方式进入
- kill -9 进程号 关闭redis 或者在redis中直接shutdown
redis主从配置:[一主多从:单台虚拟机,从机下也可以继续添加他的从机]
第一种方式:【单台机器实现一主多从配置】
- 复制redis的默认配置文件到自己新创建目录
- 创建多个配置文件 命名方式随意 内部定制如下
include /myredis/redis.conf
pidfile /var/run/redis 6379.pid
port 6379
dbfilename dump6379.rdb
- 将redis默认的.conf文件与自己新加的conf文件放到一起
- 添加主从配置:在想要做从机上执行 slaveof ip 端口 当前服务器默认变成从机
- 通过 info replication 可以查看 主机 从机状态
第二种方式:[一主多从:多台虚拟机]
- 复制redsi配置文件 自己定义 一个新文件或者用原有文件不复制
- 在主机配置bind配置中默认填写自己的主机ip地址 默认不添加 从机无法被访问
- 从机中执行slaveof 命令 slaveof ip port 如果添加账号密码 需要进行验证 如果不添加账号密码 可以直接实现主从 默认需要关闭防火墙策略 或者打开端口
- 依次启动redis-server 自己命名的conf文件
- 如果需要将从机变成主机 那么可以再从机上执行slaveof no one 这种情况下主机默认变成从机 从机默认变成主机 属于手动修改。也可以通过哨兵模式
主从复制原理:
- 当从机连接上主服务器之后,从服务器向主服务发送进行数据同步消息
- 主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化存入到rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
- 每次主服务器进行写操作之后,和从服务器进行数据同步
注意: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
哨兵模式的工作原理:
- 每个Sentiel以每秒钟一-次的频率向它所知的Master, Slavel以及其他Sentine|实例发送一 个 PING命令。
- 如果一个实例(instance) 距离最后- -次有效回复PING命令的时间超过down-atter-milliseconds选项所指定的值,则这 个实例会被Sentinel标记为主观下线。
- 如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒- -次的频率确认Master的确进入了 主观下线状态
- 当有足够数量的Sentinel (大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
- 在-般情况下,每个Sentinel会以每10秒- -次的频率向它已知的所有Master, Slave发送INFO命令。当Master被Sentinel标记为客观下线时,Sentinel 向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次
- 若没有足够数量的Sentine|同意Master已经下线,Master的客观 下线状态就会被移除;若Master 重新向Sentinel的PING命令返回有效回复,Master 的主观下线状态就会被移除。
缓存穿透出现的两个原因:
1:应用服务器压力变大
2:大量请求时,缓存命中率降低。出现大量直接查询数据库,但是redis还是在平稳的运行
解决缓存穿透的几种方式:
- 对空值缓存:如果-个查询返回的数据为空(不管是数据是否不存在) ,我们仍然把这个空结果( null )进行缓存,设置空结果的过期时间会很短,最长不超过五分钟
优点
- 实现简单维护方便
- 因为redis是直接读取内存的 所以会造成redis一些无用的消耗
- 设置可访问的名单(白名单) :使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
- 采用布隆过滤器: (布隆过滤器( Bloom Filter )是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。
- 内存占用少
- 实现复杂,并且存在误判
缓存击穿:当出现一个key过期的一瞬间有大量的请求涌入进来。造成直接访问数据库造成瞬时压力
解决办法:
- 预先设置热门数据:在redis 高峰访问之前,把一些热门key数据提前存入到redis里面,加大这些热点key数据key的时长。
- 实时调整:现场监控哪些数据热门,实时调整key的过期时长。
- 使用分布式锁
缓存雪崩:在某一个时间段内,查询数据量比较大。同时我又出现了大量的key过期。造成数据库访问眼里巨大甚至过期。这种叫做缓存雪崩。
解决办法:
- 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量) , 如果过期会触发通知另外的线程在后台去更新实际key的缓存。
- 将缓存失效时间分散开:。比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5 分钟随机,这样每-个缓存的过期时间的重复率就会降低,就很难引发集体失效的重性
- 通过限流措施 实现对请求的限流操作。这一般是缓存和其他限流组件一起实现 比如说springcloud的sentinel hystrix等
redis集群:[无中心化集群] redis集群可以通过任意一个节点进入,不需要进入固定节点】
集群能解决什么问题:
- 扩容问题:
- 并发写操作问题:
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的N分之1.
Redis集群通过分区( partition )来提供一定程度的可用性 ( availbility) :即使集群中有-部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
集群分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
- 互斥性。在任意时刻,只有一个客户端能持有锁。。
- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
- 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人。
- 加的锁给解了,加锁和解锁必须具有原子性。
集群搭建步骤:
- 在复制出来的配置文件中新加三条命令:
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建的操作
- 切换数据库命令 : select 【默认16个数据库】
- 查询key操作 查询所有key keys *
- 查询key是否存在 exists key值 如果返回1 代表数据存在 如果返回0代表数据不存在
- 删除key del key key key key key值
- 删除key第二种方式 ulink key值 他会先删除元数据 后续异步执行真正的删除操作
- 设置redis数据过期时间 expire key值 时间 【秒单位】
- 设置redis过期时间 pxpire key milliseconds【毫秒】
- 查询过期时间 ttl key值 如果返回-1 代表永不过期 如果返回-2 代表已经过期
- 清除当前库 flushdb
- 查询KEY类型 type key
- 查看rendis信息 info repliaction
- 根据端口号连接命令 redis-cli -p 端口号
- 根据主机IP连接redis redis-cli -h ip -p port
- 查询key的插槽值 cluster keyslot key
- 查询key的插槽值 cluster countkeysinslot
- 查询集群完整性 redis-cli --cluster check -h 127.0.0.1 -p 6379
- 添加新节点进入到集群 redis-cli --cluster add-node 192.168.204.203:6306 192.168.204.203:6300
- 为该节点添加新的槽 redis-cli --cluster reshard 192.168.204.203:6300
- 为主节点添加从节点ID redis-cli --cluster add-node 192.168.204.203:6307 192.168.204.203:6306 --cluster-slave --cluster-master-id 73254af4b47aa0403e606a14f8a796b3247a9c6a
- 删除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
字符串常用命令:
- set key value 设置值 通过set设置相同的key 当前有的key 的value值会被覆盖
- get key 获取value值
- append key 字符串 向当前存在的key后追加内容 返回结果是字符串长度
- strlen key 返回字符串的长度
- setnx key value 当前只当当前key不存在的时候才能设置值 如果存在不做任何操作
- incr key 当key所对应的value是数字类型默认value+1
- decr key 当key所对应的value是数字类型默认value-1
- incrby key step 当key所对应的value是数字类型默认value+step
- decrby key step 当key所对应的value是数字类型默认value-step
- mset key value key value key value 可以同时设置多个值
- mget key key key 可以返回多个key值
- msetnx key value key value key value
- getrange key 起始位置 结束位置 可以做分割
- mset k{g} v k {g} v k v 集群中添加多个值的方法。这种情况需要添加一个分组
List:单键多值
List的数据结构为快速链表quickList首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist ,也即是压缩列表。。它将所有的元素紧挨着一起存储 ,分配的是一块连续的内存。。当数据量比较多的时候才会改成quicklist.。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next.。
Redis将双端链表和ziplist结合起来组成了quicklist。 也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(边)或者尾部(右边)。。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现。
常用命令:
- lpush key value vale value... 从左侧放 如果再次执行 同一个key继续从左到右放而不是覆盖key
- rpush key value value value... 从右侧放如果再次执行 同一个key继续从左到右放而不是覆盖key
- lrange key 0 -1 查询所有值
- lpop key 从左侧取第一个值,值如果值取光了 那么键自动消亡
- rpop key 从右侧取出第一个值 如果值取光了 那么键自动消亡
- llen 获取集合的长度
- lindex key index 根据集合下标获取值 [从左到右获取]
- linsert key before value newvalue 在集合中的某一个value值前添加一个新的值
- lrem key number value [从左到右删除number个 value值为value的值]
- lset key index value 在index位置替换值
SET:
Redis 的 Set是 string类型的无序集合。它底层其实是一个 value 为 null 的 hash表,所以添加,删除,查找的复杂度都是 O(1)一个算法,随着数据的增加,执行时间的长短,如果是 O(1),数据增加,查找数据的时间不变
- sadd key value value
- smembers < Key>查询该KEY值
- sismember 判断集合是否为含有该值,有1 ,没有0。
- scard 返回该集合的元素个数。
- srem ... 删除集合中的某个元素。。
- spop 随机从该集合中吐出一个值。该值会从集合中删除掉
- spop count 随机从集合中抽出count个数据 然后删除集合中数据
- srandmember 随机从该集合中取出n个值。不会从集合中删除。。
- smove value把集合中一个值从一个集合移动到另一个集合。
- sinter 返回两个集合的交集元素。。
- sunion 返回两个集合的并集元素。。
- sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)。返回k2中不包k1的值
Hash数据结构:
- Hash类型对应的数据结构是两种: ziplist (压缩列表),hashtable (哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable.
- hset .................给集合中的键赋值
- hget 从集合取出 value
- hmset ...批量设置 hash 的值
- hexists查看哈希表 key 中,给定域 field 是否存在。
- hkeys 列出该 hash 集合的所有 field
- hvals 列出该 hash 集合的所有 value
- hincrby field为哈希表 key 中的域 field 的值加上增量 1 -1
- 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的范围获取元素列表,实际是一个可以二分查找的有序链表。
- zadd ...将一个或多个member元素及其score值加入到有序集key当中。。
- zrange < key> [ WITHSCORES]返回有序集key中,下标在之间的元素带WITHSCORES ,可以让分数-起和值返回到结果集。
- zrangebyscore key min max [withscores] [imit offset count].返回有序集key中,所有score 值介于min和max之间(包括等于min或max )的成员。有序集成员按score值递增(从小到大)次序排列。
- zrevrangebyscore key max min [withscores] [limit offset count]同上,改为从大到小排列。
- zincrby 为元素的 score加上增量
- zrem 删除该集合下,指定值的元素。
- zcount 统计该集合,分数区间内的元素个数。
- zrank 返回该值在集合中的排名,从0开始。
redis:发布订阅功能:
redis事务机制:Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。
redis事务的几个特性:
1.互斥性
2.排他性
事务的常用命令:
multi:开启事务
exec :执行命令
discard:关闭事务
从输入multi开始输入的命令都会依次进入命令队列中去,但不会执行,直到输入Exec后 redis会将之前的命令队列中的命令进行执行
事务包含两个阶段 一个是组队阶段 一个是执行阶段
组队阶段:组队阶段是向命令队列中执行命令
执行阶段:指的是执行在命令队列里的命令阶段 如果在执行阶段有命令失败 其他命令依然会执行成功
redis:事务三大特性
为单独的隔离操作 。
- 事务中的所有命令 都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 没有隔离级别的概念 。队列中的命令没有提交之 前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
- 不保证原子性 。事务中如果有一 条命令执行失败,其后的命令仍然会被执行,没有回滚。
redis采用乐观锁机制: 监视一个(或多个) key ,如果在事务exec执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。下面这个例子:我们在观察的时候k1值为1,但是事务执行的时候k1值为2,k1被修改了所以不能执行事务。
- 通过命令 watch key 。。。。。 来实现对key的监视,如果在监视key之前 key进行了改动 那么开启事务之后 修改当前key会失败 因为版本号不一致。
- 通过命令 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流程:
- 所有写入命令追加到aof_buf缓冲区。
- AOF缓冲区根据对应的策略向硬盘做同步操作。
- 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
- 当redis服务器重启时,可以加载AOF文件进行数据恢复。
AOF优点:
- AOF提供了3种保存策略:每秒保存、跟系统策略、每次操作保存。实时性比较高,一般来说会选择每秒保存,因此意外发生时顶多失去-秒的数据。
- 文件追加写形式,所以文件很少有损坏问题,如最后意外发生少写数据,可通过redis-check-aof工具修复。
- AOF由于是文本形式,直接采用协议格式,避免二次处理开销,另外对于修改也比较灵活。
AOF缺点:
- AOF文件要比RDB文件大。
- AOF冷备没RDB迅速。
- 由于执行频率比较高,所以负载高时,性能没有RDB好。
redis建过期删除策略:
- 定时删除:在设置的过期时间同时,创建一个定时器在键的过期时间来临时,立即执行对键的操作删除。
-
- 优点:节约内存,到时间执行删除,释放内存空间; .
- 缺点: CPU资源占用率过高,当其他任务在执行时,会导致两者同时进行,会影响两者的效率,redis服务 器的响应时间和指令吞吐受到影响
- 惰性删除:放任过期键不管,但每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除,如果没有就返回该键。
- 优点: CPU的使用率大大降低,减轻其压力;
- 缺点:内存空间占用率较高,会存在长期占用内存的数据
- 定期删除:每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对cpu时间的影响。
redis8种:内存淘汰策略
- noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键。
- allkeys-lru: 加入键的时候,如果过限,首先通过LRU算法驱逐最最近没有使用的键。
- volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最近很少使用的键。
- allkeys-random:加入键的时候如果过限,从所有key随机删除。
- volatile-random:加入键的时候如果过限,从设置过期的键中随机删除。
- volatile-ttl:从配置了过期时间的键中驱逐将要过期的键。
- volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键。
- allkeys-lfu: 从所有键中驱逐使用频率最少的键。