Redis
2019-06-17 10:56:41 6 举报
AI智能生成
redis 架构 使用 集群
作者其他创作
大纲/内容
数据类型
string
set,get,decr,incr,mget
常规key-value缓存应用
hash
hget,hset,hgetal
特别适合用于存储对象,可以直接仅仅修改这个对象中的某个字段的值
List
lpush,rpush,lpop,rpop,lrange
一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销
微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的 list 结构来实现
lrange可以实现分页查询
set
sadd,spop,smembers,sunion
基于 set 轻易实现交集、并集、差集的操作
Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能
sorted set
zadd,zrange,zrem,zcard
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列
在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜
过期时间
应用
session
token
验证码
原理
定期删除
redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key
如果过期就删除
之所以要随机,是因为如果遍历所有有过期时间的key,对cpu消耗大
惰性删除
查询key的时候再去判断是否过期
弥补定时删除的遗漏
内存淘汰机制
背景
内存不够,定期删除没有删掉,并且没有被查询,需要定期删除
过程
内存占用达到内存限制设定值时触发的redis的淘汰策略来删除键
redis配置文件中可以使用maxmemory 将内存使用限制为指定的字节数
当达到内存限制时,Redis会根据选择的淘汰策略来删除键
策略
LRU(Least Recently Used)
最近最少使用的
LFU(Least Frequently Used)
最不常用的
volatile-lru
在带有过期时间的键中选择最近最少使用的。(推荐)
allkeys-lru
在所有的键中选择最近最少使用的(一般推荐)
volatile-lfu
在带有过期时间的键中选择最不常用的
allkeys-lfu
在所有的键中选择最不常用的
volatile-random
在带有过期时间的键中随机选择
allkeys-random
在所有键中随机选择
volatile-ttl
在带有过期时间的键中选择最近过期的
noeviction
不要删除任何东西,只是在写操作上返回一个错误(默认)
持久化机制
RDB(快照方式持久化snapshotting)
默认采用的持久化方式
应用
可以将快照复制到其他服务器(Redis主从结构)
留在原地(宕机重启数据不丢失)
配置方式
AOF(append-only file)
实时性更好
appendonly yes 开启
每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件
配置方式
事务
实现方式
1、将多个命令请求打包
2、一次性、按顺序地执行多个命令
3、并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求
4、将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求
命令
缺点
Redis 事务的执行并不是原子性的
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做
集群
简介
提供在多个Redis间节点间共享数据的程序集
不支持处理多个keys的命令,因为这需要在不同的节点间移动数据
自动分割数据到不同的节点上
整个集群的部分节点失败或者不可达的情况下能够继续处理命令
需要主从复制支持
分片
没有使用一致性hash, 而是引入了 哈希槽的概念
集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽
集群的每个节点负责一部分hash槽
一致性
Redis 并不能保证数据的强一致性
在实际中集群在特定的条件下可能会丢失写操作
原因是因为集群是用了异步复制
写操作过程
0 条评论
下一页