一.Redis集群
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。通过分区来实现高可用,部分失效也可使用。
1.设置集群
/opt.redis-版本号/src
2.此处设置一主一从最简单集群
redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391
3.集群命令
cluster nodes 查看集群信息
redis-cli -c -p port 连接到集群
set k1 v1 此处返回值为插槽号
mset k1{user}v1 k2{user}v2 {组}集群中加入多个键
cluster keyslot <k> 获取k的插槽值
cluster countkeysinslot [插槽值] 只可查找属于自己范围插槽中的值
cluster getkeysinslot <slot><count> 返回count个slot槽中的key
4.故障恢复
当主机断开后从机会上位成为主机
之前的主机恢复连接后成为从机
二.缓存穿透
问题原因:key对应的数据源不存在,请求被压到数据库可能会压倒数据源。
redis 命中率降低 非正常url访问
解决:1.对空值缓存(过期时间短)
2.白名单(bitmaps)可访问(效率不高)
3.布隆过滤器(底层bitmaps)
4.进行实时监控:排查访问对象和访问数据
三.缓存击穿
问题原因:热门key过期,此时出现大量访问这个时候大并发的请求可能会瞬间把后端DB压垮。
解决:1.预设热门key
2.实时调整
3.使用锁:在查询db时不让其他线程访问,直到缓存成功
四.缓存雪崩
问题原因:极少时间段内,大量key集中过期
解决:1.加多级缓存 nginx+reids+...(ehcache)
2.使用锁或队列 用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写(不适用于高并发)
3.设置过期标志更新缓存
4.缓存失效时间分散