Redis(远程字典服务:内存存储)
问题:
- 数据库压力过大 数据库查询属于磁盘文件读写 redis属于内存c’c
- 数据不同步
- 传统锁失效
特点
- nosql数据库 没有sql语句数据库 非关系型数据库
- 内存存储
- 存储结构 key value
- 支持持久化(内存中数据能够进行文件存储 防止服务器断电数据丢失 用于数据内容的恢复)
- 支持集群 :高并发 高使用
redis五种数据类型
- string 字符串 及其 数值
存储结构:字符串 “ ”
-
list 有序可重复的列表格式 多个值
-
hash 存对象 student s3=new student(“1003”,“张三”)
存储结构:hset (对象名) (属性名) (值)(属性名) (值)
-
set 无序唯一
-
zset 有序 唯一
缓存预热
热点数据:访问频次高 数据量大的数据
Redis存放项目中的热点数据 例如:项目题库里的题
缓存预热:提前把热点数据存入到redis中
管理员:进行缓存预热 功能–是一个功能,也可以写定时任务
把热点数据存入redis中有两种方式 byte方式 和 json 方式
方式1:byte方式 把对象也就是集合转成byte
byte【】 bytekey=SerializtionUtils.serialize(对象)
byte【】 bytekey=SerializtionUtils.serialize(对象)
方式2:json方式 把集合转成json字符串String jsonStr=json.toJSONString(list)
添加依赖 springframework 添加字符串 添加操作字符串的方法
管道技术
频繁的向Redis写数据
管道技术提高效率
创建管道Pipeline pipeline=jedis.pipelined();
把管道积攒的命令一次性发送到Redis中 pipeline.syncAndReturnAll()
管理员进行缓存预热
Redis持久化
Redis中存放了很多不同的 如果Redis宕机了 因为是内存存储形式
数据就会丢失 重启需要重新缓存预热 为了防止这个现象
Redis支持持久化
就是将Redis内存中的数据存到本地文件中 当Redis重启 会把文件中的数据自动加载
到Redis内存中 无需进行缓存预热
两种方式
-
RDB快照
Redis调用系统fork()创建子线程 子线程会将数据存到RDB临时文件中 当
子线程完成写入 RDB临时文件会替换掉所有RDB文件 并删除旧文件
服务器宕机 丢失数据
-
AOF
每次执行命令 都会追加到aof文件末尾 如果数据丢失 只需要重新执行aof文件中的命令
集群技术
主从集群:生产环境不会使用
一主多从 读写分离 主负责写 从负责读 Redis会将主的数据同步到从中 主宕机 无法进行缓存预热
哨兵集群:
以主从集群为基础 每个服务器都有哨兵 哨兵会观察主服务器的运行情况 如果超过一半的哨兵发现
主服务器宕机 哨兵会发起投票 重新选择主服务器
缓存穿透
缓存命中:到Redis中获取数据 根据key就直接获取到数据了 就是缓存命中
缓存穿透:不让缓存命中 请求一个不存在的数据 redis中查不到 到数据库中查也查不到 大量这样的请求就会导致数据库瘫痪(大量请求redis中的key)
缓存穿透的解决方案:
- 布隆过滤:hash化 把redis中的key 存到集合中 请求Redis时判断 是否有这个key 如果没有 返回空(需要预热所有的key)
- 缓存空值 数据库中查不到 将key对应的值为null存到redis中(会查到大量空值)
Redis存放数据规则:
- 不经常变的 设置为永久
- 经常变的 根据变化速度 设置有效期长短
- 设置数据为易失 避免数据在同一时间过期
缓存雪崩
Redis宕机了 整个集群都宕机了
解决方案:
- 让集群更健壮
- 服务降级 Redis请求量达到一定量级后 返回空值
缓存并发
并发量大 设置不同的过期时间
使用集群