redis 是基于内存的数据库,因为出内存操作,而且还是单线程的所以处理效率会快很多。缺点首先至于内存。不适用于海量数据 。 其中常用的有5大数据类型
String
常用命令:set get insr。看似是个字符串实际上还可以支持数值
实现方式:默认存储方式就是一个字符串 但是遇到insr就会将类型转化为int
应用场景: session共享(二进制安全)。秒杀(redis用来限流 削峰)。计数。bitmap
List
常用命令: lpush
应用场景:实现队列
Hash
实现方式:hashmap.
应用场景: 聚集数据。对于数据变化不是很大的,并且访问次数比较多的。可以跑一个批处理 用流水号啊什么的作为一个 key。加快了我们的查询速度
Set
无序集合不可重复
实现方式:底层就是可以为空的hashmap。
应用场景:随机数 srandmenber.spop 还可以实现 交并差集。这个可以用来做一个推荐
或者共同好友这样的
Zset
有序不可重复
就可以做一些和排序有关的列表
Iothrad 在 redis 6.0+ 版本实现
持久化 就是将数据保存到磁盘 redis.conf
RDB(快照) 速度快 丢失多
AOF 慢 但是数据完整 因为一直都是append。
如何解决持久化 快照 aof混合使用。先把数据写入aof文件里,
synchronized voliate
普通对象内存存储布局。如何看?(palyout)
markword class pointer(类型指针) insatance data(实例数据) padding(对齐);
包含hashcode GC信息 锁信息。
缓存穿透
指缓存和数据库都没有的数据,而用户不断发起请求。
解决方案: 接口层增加校验,如用户鉴权校验。
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点, 如30秒
缓存击穿
缓存中没有但数据库中有的数据
解决方案: 设置热点数据永远不过期
缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
解决方案: 缓存数据的过期时间设置随机。设置热点数据永远不过期。