1.Redis常⽤数据类型
redis常用的数据类型主要有以下5种:
(1)Sting类型
存:set key value
取:get key 获得对应的value值
(2)list类型 :
存:lpush key values
取:lpush list1 1 2 3 4 5
注:栈的数据结构是先进后出(后进先出)
lpush表示从左边开始进行压栈操作,取出的数据顺序和进栈的顺序刚好相反,
rpush表示从最右边开始进行压栈操作,取出数据的顺序和插入数据的顺序一致
(3)set无序集合
set集合不允许有重复的元素,如果有重复的,自动将重复的数据删除
存:sadd key values
例:sadd list2 a b c
取:smembers key
例:smembers list2
(4)zset集合
zset有顺序,不能重复,会将插入数据时的数字作为排序的依据,默认进行升序的排列
存值:zset key score1 value1 score2 value2 score3 value3
取值:取出的数据是经过升序排列的没有重复的有序集合
zrange key 0 -1 升序输出
zrevrange key 0 -1 降序输出
删除:zrem key value
(5)hash数据类型
hash: key-fields-values(做缓存使用)
Hset :向hash中添加数据
Hget:从hash中取出数据
注:redis中的所有数据都是字符串,命令不区分大小写,key是区分大小写的,由于redis是单线程的,因此不适合保存内容大的数据,key/value,单个value的数据最⼤为512M。
2.Redis作为单线程模型为什么效率这么⾼
Redis是单线程模型为什么这么快:多路(多个⽹络连接)复⽤(复⽤同⼀个线程)
1、纯内存访问
2、⾮阻塞I/O:Redis采⽤epoll作为I/O的多路复⽤器实现
3、采⽤单线,避免了不必要的上下⽂切花和竞争
3. 如何实现Redis数据持久化
redis的持久化分为两种⽅式:RDB、AOF
3.1. RDB⽅式
Redis将内存中所有数据全量写⼊⽂件的⽅式
优势
每隔⼀段时间进⾏备份,全量备份
灾备简单,可以远程传输
备份是会fork⼀个⼦进程,对当前进⾏数据访问的主进程不影响
劣势
发⽣故障时,有可能或丢失最后⼀次要备份的数据
⼦进程进⾏数据备份时会复制内存数据导致内存瞬间膨胀两倍,如果复制的数据量很⼤就会
导致CPU和内存负载很⾼产⽣卡顿
Redis RDB备份的设置⽅式
save 900 1 900内更新1次就触发RDB全量备份
save 300 10
save 60 10000
如果RDB过程中出错,则redis停⽌写操作
stop-writes-on-bgsave-error yes
save 不会fork⼀个新进程,所以在save的过程中,主进程可能会卡住
bgsave 会fork⼀个新进程,系统⾃动触发也是使⽤的bgsave
数据已经持久化到RDB⽂件,如果恢复?
只需要把dump.rdb 复制到dir⽬录中,redis在启动的时候机会⾃动加载
3.2. AOF⽅式
AOF的特点
以⽇志的形式来记录⽤户的请求写操作(特别像MySQL的binlog),读操作不会保存
⽂件是以追加的形式进⾏记录
redis的aof恢复其实就是把追加的⽂件从头到尾全部执⾏⼀遍
优势:
AOF以秒为单位进⾏备份,丢失数据范围更⼩
log⽇志形式追加,如果磁盘满了会调⽤redis-check-aof⼯具进⾏⽂件的重写
当数据量太⼤的时候,redis会在后台⾃动重新AOF⽇志⽂件
劣势:
相同的key数据会有多份,AOF⽐RDB⼤的多
AOF⼀旦出现过问题,就会导致数据不完整
RDB(全量备份mysqldump)+AOF(增量备份binlog)最后组合使⽤
# AOF默认是不开启的
appendonly no | yes
# AOF的⽂件名,同样存在dir⽬录下
appendfilename "appendonly.aof"
# 同步策略
# appendfsync always 每次操作都会备份,性能差
appendfsync everysec # 每秒备份⼀次,推荐时间
# appendfsync no aof备份时不进⾏磁盘同步
# 重写aof⽂件时是否同步,no同步 ,yes不同步
no-appendfsync-on-rewrite no
# AOF⽂件重写机制:避免AOF⽂件越来越⼤,将key的历史轨迹整合只保留最后⼀个
# 当前⽂件的容量⽐上⼀次重写后多出100%,也就现在是之前的两倍
auto-aof-rewrite-percentage 100
# 当前⽂件⼤于64mb
auto-aof-rewrite-min-size 64mb
# 如果要触发重写,以上两个条件都要满⾜
重新的时候Redis也会从主进程fork⼀个⼦进程进⾏重写操作,所有和RDB的开销⼀样
AOF默认是不开启,如何你在Redis运⾏过程中开启AOF⼀定要注意不要直接开启后重启
如果AOF和RDB同时开启,Redis只读取AOF⽂件的内容
如何解决:在运⾏中修改appendonly 为 yes:config set appendonly yes
4. Redis内存管理之缓存过期机制
redis⾥定义key的时候set gavin EX 10,数据过期后只是你⽆法访问了,但不会直接删除,什么时候删除
(主动)定期删除
redis默认会⼀秒10次巡检内存,将已经过期的数据进⾏删除
可以设置主动频次:config get hz
(被动)惰性删除
当客户端请求时,如果发现过期超时就进⾏删除并返回客户端⼀个nil
如果redis内存被占满(你的key都没有设置过期时间)
# redis提供了⼀套缓存淘汰机制
# maxmemory <bytes> //可以设置内存的可⽤⼤⼩,可以预留内存给操作系统,主从两台机器内存不⼀样⼤,设置成⼩的
# redis提供了⼀套缓存淘汰机制
# maxmemory-policy noeviction 这是默认,旧缓存永不过期,如果内存满了新缓存⽆法写⼊
# allkeys-lru 当内存满时,有新缓存进⼊,将最少使⽤的旧缓存清除
5.Redis读写分离主从架构搭建
# 从机的单机安装参考前⾯
# 修改slave的redis.conf
# 主机连接
replicaof 127.0.0.1 6379
# 主机访问密码
masterauth icoding
# 主从复制过程中,从服务是否可以响应客户端请求
replica-serve-stale-data yes
# 从机只读
replica-read-only yes