Redis
用缓存 : 提前把数据取出来保存好(通常保存到读写更快的介质 , 比如内存) , 就可以更快地读写
缓存分类
分布式缓存
Redis(分布式缓存)
memcached(分布式)
Etcd(云原生架构的一个分布式存储 , 存储配置 , 扩容能力)
单机缓存 (存在问题 : 数据不一致)
ehcache
java内存集合 , 如HashMap
caffeine(java内存缓存 , 高性能)
Google Guava
Redis缓存实现
NoSQL 数据库
key - value 存储系统 (区别 MySQL , 它存储的是键值对)
Redis 数据结构
基本
String 字符串类型 : name : "String"
List 列表 : name : ["List1","List1","List2"]
Set 集合 : name : ["Set1" , "Set2"]
Hash 哈希 : name : { "name1" : "Hash" , "name2" : "Hash2"}
Zset 集合 : name : {name1 - 9 , name2 - 8} (适合做排行榜)
高级
bloomfilter (布隆过滤器 , 主要从大量的数据中快速过滤值, 比如邮件黑名单拦截)
geo (计算地理位置)
hyperlglog (pv /uv)
pub /sub (发布订阅 , 类似消息队列)
BitMap (10101010010101010101010)
自定义序列化
为了防止写入 Redis 的数据乱码 , 浪费空间等 , 可以自定义序列化器 .
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> objectObjectRedisTemplate = new RedisTemplate<>();
objectObjectRedisTemplate.setConnectionFactory(redisConnectionFactory);
//设置KEY 序列化使用 String 字符串
objectObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
objectObjectRedisTemplate.setHashKeySerializer(RedisSerializer.string());
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置Value 序列化 格式
objectObjectRedisTemplate.setValueSerializer(jsonRedisSerializer);
objectObjectRedisTemplate.setHashValueSerializer(jsonRedisSerializer);
return objectObjectRedisTemplate;
}
}
Java 操作 Redis
Spring Data Redis (推荐)
Spring Data : 通用的数据访问框架 , 定义一组 增删改查 的接口
还可以操作 : mysql , reids , jpa
1)引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2)配置 Reids
#redis 有关
redis:
database: 1
host: 127.0.0.1
port: 6379
Jedis
独立于Spring 操作 Redis 的 Java客户端
配合Jedis Pool 使用
Redisson
分布式操作 Redis 的 Java 客户端 , 让你像在使用本地的集合一样操作Redis (分布式 Redis 数据网路)
JetCache
不在阐述
对比:
1.如果用Spring , 并且没有过多的定制化要求 , 可以用 Spring Data Redis , 最简单
2.如果你用的不是Spring , 并且追求简单 , 并且没有过高的性能要求 , 可以用Jedis + Jedis Pool
3.如果你用的不是Spring , 并且追求高性能 , 高定制化 , 可以用Lettue ,支持异步 ,连接池
缓存预热
问题 : 即使用了缓存 , 第一个用户的访问还是很慢 (假如第一个访问的是老板 直接毕业)
缓存预热的优点 :
1.解决上面的问题, 可以让用户始终访问很快
2.也能一定程度上保护数据库
缺点 :
1.增加开发成本
2.预热的时机和时间如果错了 , 有可能缓存的数据不对或者太老
3.需要占用额外空间
怎么缓存预热
1.定时任务
2.手动触发
实现
用定时任务,每天刷新所有用户的推荐列表 .
注意点:
1.缓存预热的意义 ((新增少、总用户多)
2.缓存的空间不能太大,要预留给其他缓存空间
3.缓存数据的周期 (此处每天一次)
定时任务实现
1.Spring Schedule (Spring boot 默认整合了)
2.Quartz(独立于Spring 存在的定时任务框架)
3.XXL-job 之类的分布式任务调度平台(界面 + sdk)