用缓存 : 提前把数据取出来保存好(通常保存到读写更快的介质 , 比如内存) , 就可以更快地读写
Redis(分布式缓存)
memcached(分布式)
Etcd(云原生架构的一个分布式存储 , 存储配置 , 扩容能力)
ehcache
java内存集合 , 如HashMap
caffeine(java内存缓存 , 高性能)
Google Guava
NoSQL 数据库
key - value 存储系统 (区别 MySQL , 它存储的是键值对)
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
redisTemplate(RedisConnectionFactory redisConnectionFactory) { -
- RedisTemplate
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;
- }
- }
Spring Data : 通用的数据访问框架 , 定义一组 增删改查 的接口
还可以操作 : mysql , reids , jpa
1)引入依赖
-
org.springframework.boot -
spring-boot-starter-data-redis
2)配置 Reids
- #redis 有关
- redis:
- database: 1
- host: 127.0.0.1
- port: 6379
独立于Spring 操作 Redis 的 Java客户端
配合Jedis Pool 使用
分布式操作 Redis 的 Java 客户端 , 让你像在使用本地的集合一样操作Redis (分布式 Redis 数据网路)
不在阐述
对比:
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)