1.redis常用命令和数据结构
1.1 redis常用命令
- randomkey:返回随机key
- type key:返回key存储的类型
- exists key:判断某个key是否存在
- del key:删除key
- rename key newkey:改名
- renamenx key newkey:如果newkey不存在则修改成功
- move key 1:将key移动到1数据库
- ttl key:查询key的生命周期(秒)
- expire key 整数值:设置key的生命周期以秒为单位
- pexpire key 整数值:设置key的生命周期以毫秒为单位
- pttl key:查询key 的生命周期(毫秒)
- perisist key:把指定key设置为永久有效
1.2 redis数据结构
1.2.1 字符串(String)
字符串类型是其他几种的基础,值可以是字符串(简单,复杂的json,xml),数字(整型,浮点),二进制(图片,音频,视频),最大值不能超过512MB。
1.2.2 列表(List)
一个列表结构可以有序地存储多个字符串。
1.2.3 哈希(hash)
散列可以存储多个键 值 对之间的映射,散列存储的值既可以是字符串又可以是数字值。
1.2.4 集合(Set)
集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表(hashtable)来保证自已存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值),redis中的集合是无序的。
1.2.5 有序集合(zset)
有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是各不相同的。有序集合的值则被称为分值(score),分值必须为浮点数。
1.2.6 GEO(功能在Redis3.2)
存储地理空间位置(纬度、经度、名称)
2.redis内存管理
3.redis持久化机制
3.1 RDB
RDB持久化是把当前进程数据生成快照保存到硬盘的过程。
RDB是一个紧凑压缩的二进制文件,代表Redis在某一个时间点上的数据快照。非常适合用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
Redis加载RDB恢复数据远远快于AOF方式。
3.2 AOF
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
4.redis主从复制和哨兵高可用机制
redis主从复制的特点:
- 一个Master可以有多个slave主机,支持链式复制;
- Master以非阻塞方式同步数据至slave主机;
复制的两种方式:
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization”,此时其同步方式有两种方式:
- Disk-backend:主节点基于内存创建快照文件于磁盘中,而后将其发送给从节点;从节点收到快照进行恢复,快照恢复完后接着快照的那一刻随后内容进行复制,主节点每写一行,并直接将语句发送给从节点(跨网络复制适合)
- Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;(占用网络带宽)
哨兵机制是为了解决主从复制的缺点的:
主从复制高可能问题:
(1)如果主节点出现问题,需手工解决问题,也就是重启master或手工选择一个slave,使用slaveof no one命令或slaveof new master命令选出主和从。需要单独写脚本处理。问题是如何判断节点故障,如何将命令发送给节点
(2)写能力和存储能力受限,写只在一个节点
sentinal哨兵: redis集群架构中重要的组件,主要功能如下
①集群监控,负责监控redis master和slave进程是否正常工作
②消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
③故障转移,如果master node挂掉了,会自动转移到slave node上
④配置中心,如果故障转移发生了,通知client客户端新的master地址
哨兵本身也是分布式的,作为一个哨兵集群去运行,互相协同工作
①故障转移时,判断一个master node是宕机了,需要大部分的哨兵都同意才行,涉及分布式选举的问题
②即使部分哨兵节点挂掉了,哨兵集群还能正常工作,如果只有一个哨兵,不合理。
5.管道
Pipeline指的是管道技术,指的是客户端允许将多个请求依次发给服务器,过程中而不需要等待请求的回复,在最后再一并读取结果即可。
6种数据淘汰策略
1、volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据