持久化
rdb:内存数据快照,覆盖磁盘中旧的快照数据 快照期间如果有新的数据写入不会在此次快照过程中保留 占用内存小
aof:每次变更操作时将操作语句通过write函数写入文件中,追加到磁盘中 优势:数据不丢失 缺点占用内心大
支持数据类型和数据结构
String:
List:双向链表结构
hash:
Set:
ZSet:
缓存穿透、缓存击穿、缓存雪崩的概念以及处理办法
缓存穿透:数据库和缓存中均不存在,每次访问都会去访问数据库。
解决方案:1.对空值做缓存,设置过期时间;2.使用布隆过滤器 (布隆过滤器会判断数据库中是否存在该数据,不存储具体值,而是根据hash算法最终记录是否存在,用位记录,占用空间极小)
缓存击穿:过期时间失效
解决方案:1.不设置过期时间;2.加互斥锁,即使一时失效也不会出现同时大量访问数据库的情况;
缓存雪崩:
同一时间点,过期时间都失效了
解决方案:1.分开设置过期时间;2.热点数据不设置过期时间;
redis数据统计
PV:page view 单页访问量。 给每个网页一个独立的 Redis 计数器就可以了,来一个请求,incrby 一次,最终就可以统计出所有的 PV 数据;
UV:unique view 自然人访问量。
1.使用Set集合统计,集合有去重功能,在每个页面设置一个集合,将来访问的用户ID存储其中,然后统计数量。缺点占用内存较大。
2.使用bitmap位图功能。
#设置指定位置的位值
setbit key offset value setbit 2021-01-01 32 1 offset可以当做用户的自增ID
#或者指定位置的位值
getbit key offset getbit 2021-01-01 获取用户在2021-01-01这天的登录状态
#获取指定范围内key为1的数量
bitcount key start end bitcount 2021-01-01 12 100 2021-01-01这天用户ID在12到100范围内多少个用户登录过
3.HyperLogLog基数统计,特点是占用内存小,有一定的错误率
127.0.0.1:6379> PFadd 2022-02-02 a b c d e f g h i j
(integer) 1
127.0.0.1:6379> PFadd 2022-02-02 h i j 重复数据返回0
(integer) 0
127.0.0.1:6379> PFcount 2022-02-02
(integer) 10 统计出2022-02-02这天有多少用户访问
127.0.0.1:6379> PFadd mykey2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
127.0.0.1:6379>
缓存淘汰策略和过期删除策略(定期删除和惰性删除)
内存不足的淘汰策略:
1.直接报错;
2.加入键时,如果过限,首先通过LRU算法驱逐最久没有使用的键;
#设置过过期
3.加入键时,如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键;
#已经过期
4.加入键时,如果过限,从所有key随机删除;
5.加入键时,如果过限,从过期键的集合中随机删除;
#马上过期
6.从配置了过期时间的键中驱逐马上就要过期的键;
7.从所有配置了过期时间的键中驱逐使用频率最少的键;
8.从所有键中驱逐使用频率最少的键;
Redis数据存储在内存中,做缓存能提供访问速度,单线程确保线程安全,可以当做分布式锁,支持事务,可以做消息队列,发布-订阅模式。支持Master-Slave模式,集群哨兵模式。
网友评论