redis学习笔记
-
执行流程 发送命令->命令排队->命令执行->返回结果
-
string类型有三种实现方式 如果是值是int类型,那么底层用int实现,
短的字符串使用embstr:小于等于39byte,长的用raw实现:大于39byte -
哈希类型实现有两种,当哈希类型的元素小于512并且size小于64byte时
使用ziplist实现,否则使用hashtable实现 -
列表类型也有两种实现 第一种和哈希类型一样,第二种是链表实现,3.2以后提供了quicklist来实现
-
集合使用intset 整数集合和hashtable实现 当元素全为int并且小于512个用前者
###典型使用场景
string:
1.缓存功能 一般使用redis作为缓存层 mysql作为存储层
2.计数 比如视频播放量计数,访问接口统计 incr key
3.共享session
4.限速 可以通过incr+expire 自增加过期来实现
hash:
可以用来复杂的用户信息
list:
1.可以做消息队列 通过lpush+brpop可实现阻塞队列,生产者从lrpush插入元素,
消费者客户端使用brpop从列表尾部拿取元素
2.文章列表 因为list是有序的
lpush+lpop=stack 栈
lpush+rpop=queue 队列
lpush+ltrim=campped collection 有限集合
lpush+brpop=message queue 消息队列
set:
比较典型的场景是为用户贴标签tag
sadd 用来贴标签
srandmember可以生成随机数
sadd+sinter social graph 做社交
###迁移键
1.move move命令用于在redis内部进行数据迁移 move key db
2.dump key + restore key ttl value
dump+restore可以实现不同的redis实例之间进行数据迁移
1) 在源redis上 dump会将键值序列化 格式采用rdb格式
2)在目标redis上 restore命令将上面序列化的值进行复原
其中ttl表示过期时间ttl=0 表示没有过期时间
3.migrate
也是用于redis实例之间的数据迁移 实际就是将dump、restore和del命令进行组合
###redis持久化
redis支持rdb和aof两种持久化机制
1.rdb:
rdb是将当前进程的数据生成快照保存到硬盘的过程,触发rdb持久化有手动触发和自动触发。
手动触发分别对应sava和bgsava,前者会阻塞当前服务器,直到rdb完成 一般不使用
bgsava会fork出一个子进程 rdb由子进程来完成
自动触发
1)进行sava设置 sava m n 表示m秒内数据在n次修改自动触发bgsava
2)在节点复制的时候回进行bgsava生成rdb文件并发送给从节点
3)执行debug reload命令重载redis时也会触发sava操作
4)默认情况下执行shutdown命令 如果没有开启AOF持久化则会自动执行bgsava
2.aof:
aof持久化是以独立日志的方式记录每一次写命令,重启时再执行aof文件的命令达到恢复数据的作用。
开启aof需要在配置文件中打开appendonly yes,默认文件名称appenonly.aof
随着aof文件的变大,redis引入文件重写机制来压缩文件体积,也就是把redis进程内的数据转化为写命令同步到新的aof文件中
新的aof文件之所以会变下,主要是因为旧的aof文件一些命令,比如del key1 、del key2 等无效的命令不会在保存
然后还会将多条命令合并为一条命令 如:lpush list a、lpush list b等转化为lpush list a b
AOF重写过程也分为手动和自动触发 手动bgrewriteaof命令 自动需要在配置文件配置