要了解redis 首先你得有redis
下载地址
1、Github下载地址:Releases · microsoftarchive/redis · GitHub
2、百度网盘下载地址 百度网盘 请输入提取码 密码:kdfq
正文
一:为什么使用redis
1.单线程
2.速度快
3.丰富的数据类型(set,zset,list,hash,string)
4.支持持久化
5.存储在硬盘上
6.单个key或value可达1G
二:redis中keys和scan对比
redis中的keys是返回符合条件的key并且是精准的不会有重复的
scan是在数量未知或数量较大的情况下使用scan遍历获取所有的key
三:什么是雪崩,穿透,击穿
1.雪崩:是指缓存中的数据在同一时间大面积失效,所有请求来到服务器上,从而导致服务器宕机。
解决方式: 1.给key设置不同的过期时间 2.保证redis高可用 搭集群
2.穿透:穿透是指用户恶意访问数据库和缓存中不存在的数据 这时请求会来的缓存中,若查无此数据,则会来到数据库中进行查询,数据库中也没有,这个时候就会导致服务器宕机
解决方式:1.给缓存中设置一个null值 2.使用布隆过滤器(布隆过滤器(Bloom Filter)详解 - 李玉龙 - 博客园 (cnblogs.com))
3.击穿:是指一条数据过期时,所有请求都来到了数据库中
解决方式:1.设置热点数据永不过期2.加锁:每次只能让一个人进行访问,访问过后把数据加载到缓存中
四:redis删除大key
redis删除大key(hash,list,set,zset)时,由于redis是单线程的,在删除或清理千万级别的key是,主线程会忙于删除key,从而导致redis服务异常
如何解决:1.分批删除key 2.采用unlink(4.0之后新推出)开启一个线程来执行删除操作
unlink和del的区别
unlink基本可以代替del 但个别场景还需要del.例如在空间累积量过快的时候不适合用unlink,因为unlink不是立刻释放空间
五:redis定时删除策略
reids会把设置了过期时间的key放到字典数据中,每100ms扫描一次
六:redis序列化的几种方式
1.jdk序列化方式(默认)javaSerializationRedisSerizatir,这个序列化方式必须时间serialiable接口,不方便人工排查
2.json序列化方式GenericJackson2JsonRedisSerialize 这个redis会获取数据失败,原因是jdk1.8之后会增加一个LockDate的类 GenericJackson2JsonRedisSerialize只能识别一个@Class属性,
添加这个属性解决了反序列化,但是json字符串占用较大
3.String序列化,如果redis中key和value都是string类型 那么可以用此序列化方式
4.xml序列化
七:解决缓存和数据库双写不一致的问题
1. 先更新数据库在更新缓存(脏读)
脏读 一个事务读取了另一个事务未提交的数据
2. 先更新数据库 在删除缓存
3. 先增加数据库 在更新缓存
11.reids持久化的方式
RDB: redisDataBase
AOF: appendOnlyFile
RDB主要存储快照,会造成数据丢失 AOF不会造成数据丢失,但是如果数据量过大的时候,出现删除操作,恢复是比较慢的
建议两种方式一起使用