一、数据类型
基本数据类型:
String:一个 key 对应一个 value,redis的 string是二进制安全的(输入任何字节都能正确处理,不想C字符串不能包含空字符),可以包含任何数据,比如jpg图片或者序列化的对象。string 类型的值最大能存储 512MB。
Hash:一个 key 对应一个 键值对,特别适合用于存储对象
List:一个 key 对应一个 列表,列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。列表适合用来做粉丝列表,评论列表以及消息队列
set:一个key对应一个set集合,set可以用来分布式系统去重,共同好友(set交集),并集,差集
Sortedset:在set基础上加了一个score,按照score排序,又叫Zset,是有序的集合。适用于排行榜
进阶数据类型:
geo:地理位置系列,存储经纬度,可以计算两地之前的距离,以及返回指定半径内元素的个数,适用于附近的人
HyperLogLog:HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的;缺点是有一定的误差
pub/sub:Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道
二、使用问题
缓存击穿:
高并发情况下,大量请求查询同一个key值,当这个key值时效时,所有请求直接打在数据库上
解决方案:可以设置热点key永不过期(定时任务)
缓存穿透:
有意或无意情况下,一直请求redis和数据库都不存在的key值,由于没有缓存,导致每次都会去访问数据库
解决方案:1、根据业务实际情况设置参数校验,不在范围内的不处理2、缓存不存在的key值,设置较短的过期时间3、BloomFilter
缓存雪崩:
同一时间大规模的缓存失效,一般是缓存服务器宕机了。前者可以采取过期时间加一个随机值,后者需要考虑集群
三、集群
//TODO
四、主从
//TODO
五、持久化
redis的持久化分为两种:
RDB:全量。指定的时间间隔内生成数据集的时间点快照,出问题时可能丢失间隔时间内的部分数据。非常适用于灾难恢复。
原理:fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。save, shutdown, slave 命令会触发这个操作
AOF:增量。把写操作指令,持续的写到一个类似日志文件里,AOF 的默认策略为每秒钟 fsync 一次。后台会对 AOF 文件进行重写(rewrite),避免文件过大
Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在
六、过期策略
1、定期删除:默认100ms就抽取设置了过期时间的kye,检查是否过期,过期了就删除
2、惰性删除:查询的时候检查是否过期,过期了就删除,不返回
七、内存淘汰机制
redis中当内存超过限制时,按照配置的策略,淘汰掉相应的key-value,使得内存可以继续留有足够的空间保存新的数据
1、no-enviction:不淘汰,删除报错。默认。
2、allkeys-lru:淘汰所有key中使用最少的key
3、volatile-lru:淘汰设置了过期时间的key中使用最少的key
4、volatile-ttl:淘汰设置里过期时间的key中的存活时间最短的(马上就要过期的)key
5、volatile-random:随机淘汰设置了过期时间的key
6、allkeys-random:随机淘汰