redis

NoSql

分布式缓存

缓存方案对比

Redis简介

为什么Redis能这么快

Redis安装

cd utils/
cp redis_init_script /etc/init.d
vim /etc/init.d/redis_init_script
#chkconfig 22345 10 90
#description: Start and Stop Redis
chkconfig redis_init_script on

Redis对象结构

Redis数据结构

Redis启动服务方式

Redis基础命令

Redis键命令

Redis分布式锁命令

Redis持久化

# 如果1个缓存更新,则15分钟后备份
save 900 1
# 如果10个缓存更新,则5分钟后备份
save 300 10
# 如果10000个缓存更新,则1分钟后备份
save 60 10000
# yes(如果save出错,则停止写操作);no(可能造成数据不一致)
stop-writes-on-bgsave-error yes
# yes(开启rdb压缩模式);no(关闭,节约CPU消耗,但是文件会大)
rdbcompression
# yes(使用CRC64算法校验对rdb进行数据校验,有10%性能损耗);no(不校验)
# AOF默认关闭,yes可以开启
appendonly no
# AOF文件名
appendfilename "appendonly.aof"
# no(不同步);everysec(每秒备份,推荐使用);always(每次操作都会备份,
# 安全且数据完整,但是性能差
appendfsync everysec
# 重写的时候是否要同步,no可以保证数据安全
no-appendfsync-on-rewrite no
# 重写机制:避免文件越来越大,自动优化压缩指令,会fork一个新的进程去完成重写动作,
# 新进程里的内存数据会被重写,此时旧的aof文件不会被读取使用,类似rdb
# 当前aof文件的大小是上次aof大小的100%,并且文件体积达到64m,满足两者则触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb)

主从复制(读写分离)

# 主节点IP端口
replicaof 192.168.1.191 6379
# 主节点密码
masterauth 123
# 从节点数据是否只读
replica-read-only yes
# 是否无磁盘化复制
repl-diskless-sync no
# 无磁盘化复制同步前等待时间
repl-diskless-sync-delay 5

缓存过期处理及内存淘汰机制

# 定时随机检查过期的key,如果过期则被清理删除(每秒检查10次)
# 默认配置
hz 10
* (被动)惰性删除
# 当客户端请求一个已经过期的key时,redis会检查这个key是否过期,
过期则删除,返回nil。这种策略对CPU友好,不会有太多损耗,但是内存占用会比较高
# 当内存使用率到达,则开始清理缓存(字节)
maxmemory 3145728
# 淘汰策略
# noveiction(默认)旧缓存永不过期,新缓存设置不了,返回错误
# allkeys-lru(推荐)清楚最少用的旧缓存,然后保存新的缓存
# allkeys-random(不推荐)在所有的缓存种随机删除
# volatile-lru在那些设置了expire过期时间的缓存中,
清除最少使用的旧缓存,然后保存新的缓存
# volatile-random在那些设置了expire过期时间的缓存中,随机删除缓存
# volatile-ttl在那些设置了expire过期时间的缓存中,删除即将过期的
maxmemory-policy allkeys-lru

redis哨兵

# 配置sentinel.conf
# 普通配置
# 哨兵端口
port 26379
# pid文件路径
pidfile "/usr/local/redis/sentinel/redis-sentinel.pid"
# 工作目录
dir "/usr/local/redis/sentinel"
# 守护进程运行哨兵
daemonize yes
# 保护模式(内网不需要开启,公网可以开启并绑定IP地址)
protected-mode no
# 日志地址
logile "/usr/local/redis/sentinel/redis-sentinel.log"
# 核心配置
# 配置哨兵
sentinel monitor mymaster 127.0.0.1 6379 2
# 密码
sentinel auth-pass 123
# master被sentinel认定为失效的间隔时间
sentinel down-after-milliseconds mymaster 30000
# 剩余的slaves重新和新的master做同步的并行个数
sentinel parallel-syncs mymaster 1
# 主备切换的超时时间,哨兵要去做故障转移,这个哨兵也是一个进程,
如果没有执行,超过这个时间,会由其它哨兵来处理
sentinel failover-timeout mymaster 180000
spring:
    redis:
        database: 1
        password: 123
        sentinel:
            master: mymaster
            nodes: 192.168.1.191:26379,192.168.1.192:26739,192.168.1.193:26739

redis集群

vim redis.conf
# 开启集群模式
cluster-enabled yes
# 每个节点需要一个配置文件,该文件用于存储集群模式下的集群状态等信息,由redis自己维护,
如果需要重新创建集群,删除该文件即可
cluster-config-file nodes-201.conf
# 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000
# 开启aof
appendonly yes
# 如果使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,新版本使用c语言构建
# 这里用新版redis构建方式
# 创建集群,主节点与从节点比例为1:1,1-3为主,4-6为从,1和4,2和5,3和6为主从关系
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
spring:
    redis:
        password: 123
        cluster:
            nodes: 192.168.1.191:6379,192.168.1.192:6379,192.168.1.193:6379,192.168.1.194:6379,192.168.1.195:6379,192.168.1.196:6379

缓存穿透

缓存雪崩

常见问题

什么是redis

redis数据类型

使用redis有哪些好处

redis相比memcached有哪些优势

memcached与redis的区别有哪些

redis是单进程单线程吗?为何它那么快那么高效

一个字符串类型的值能存储最大容量是多少

redis持久化机制是什么?各自的优缺点?

redis常见性能问题和解决方案有哪些?

redis过期键的删除策略?

redis的回收策略?

为什么redis需要把所有数据放到内存中?

redis的同步机制了解吗?

pipeline有什么好处?为什么要用pipeline?

是否使用过redis集群,集群的原理是什么?

redis集群方案什么情况下会导致整个集群不可用?

redis支持的Java客户端有哪些?官方推荐用哪个?

jedis与redisssion对比有什么优缺点?

redis如何设置密码及验证密码?

说说redis哈希槽的概念

redis集群的主从复制模型是怎样的?

redis集群会有写操作丢失吗?为什么?

redis集群之间是如何复制的?

redis集群最大节点个数是多少?

redis集群如何选择数据库?

怎么测试redis连通性?

怎么理解redis事务?

redis事务相关命令有哪几个?

redis key的过期时间和永久有效分别怎么设置?

redis如何做内存优化?

redis回收进程如何工作的?

都有哪些办法可以降低redis的内存使用情况?

redis内存用完了会发生什么?

一个redis实例最多能放多少的keys?List、Set、Sorted Set它们最多能存放多少元素?

MySQL里有2000W数据,redis中只存20W的数据,如何保证redis中数据都是热点数据?

redis最适合的场景是什么?

加入redis里面有1亿个key,其中10w个key是以某个固定的已知前缀开头的,如何将它们全部找出来?

加入有大量的key需要设置同一时间过期,一般需要注意什么?

使用过redis做异步队列吗?你是怎么用的?

使用过redis分布式锁吗?它是怎么回事?

如何预防缓存穿透和雪崩?

发表评论

发表
Table of Contents