Redis简介
Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存
Redis有这五种基本类型:
- String(字符串):
set key value、get key等 - Hash(哈希):
hset key field value、hget key field - List(列表):
lpush key value [value ...]、lrange key start end - Set(集合):
sadd key element [element ...]、smembers key - zset(有序集合):
zadd key score member [score member ...],zrank key member
Redis的使用场景
- 分布式共享session,登录的token的存储
- 时效性要求不高的计算类场景,比如一些预计算,对准确性和实时要求不过高,可以每天计算一次存入缓
- 需要用到分布式锁的场景,比如资源扣减等场景
- 需要后端接口进行限流保护的,可以使用redis的令牌桶进行一定时间段的请求次数限制。
Redis的过期和内存淘汰策略
1. Reids的过期策略:
- 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
- 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。节省CPU资源,却对内存非常不友好。
- 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
2. Redis的内存淘汰策略
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
功能测试角度
- 缓存存在,从缓存读取数据
- 缓存存在但过期的时候,从db读取,如有则更新到redis
- 当redis中不存在时,从db读取返回上层并写入redis,注意有效期的正确性
- 当redis和db中都不存在的时候,缓存写入null,设置短暂失效期。
- 删除数据的时候,redis和db中的数据一致性
性能测试角度
- 超量淘汰机制:结合内存淘汰策略来看
- 缓存穿透:构造不存在的数据查询,缓存写入null,设置较短失效时间。
- 缓存击穿:避免所有key同一时间失效,大量请求进入db,可以在失效时间设置增加随机数