上一篇中已经给用户管理增长了页面,看上去比较low,可是不犯该你们学习。今天增长redis来做为缓存。
当用户访问量增大的时候,并发量也会增大,同一时间数据库查询的压力也会增大。尽管mongodb的查询速度已经很快了,可是也会出现性能瓶颈,通常会经过集群来解决。另外一方面就是增长缓存,使得不用每次查询都要通过数据库。提升响应速度。java
关于redis的安装,我以前的文章中已经讲过了,可关注个人公众号mike啥都想搞
在教程中查看。补充:
以前咱们讲了如和设置redis的密码,但是都不生效。是由于启动方式不对,须要指定备至文件react
redis-server.exe redis.windows.conf
<!-- Spring Boot 响应式 Redis 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
设置redis链接:web
spring.redis.host=localhost spring.redis.port=6379 spring.redis.password=mike123 spring.redis.timeout=5000
package com.mike.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.mike.dao.UserDao; import com.mike.po.User; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** * The class UserService.java */ @Service public class UserService { @Autowired private UserDao userDao; @Autowired private RedisTemplate redisTemplate; @Autowired private MongoTemplate mongoTemplate; public Mono<User> saveOrUpdateUser(User user){ //删除缓存 if (redisTemplate.hasKey("user_"+user.getId())) { redisTemplate.delete("user_"+user.getId()); } return userDao.save(user); } public Mono<User> findById(String id){ redisTemplate.opsForValue().set("test","test"); //先查找缓存 boolean hashKey = redisTemplate.hasKey("user_"+id); if (hashKey) { User u = (User) redisTemplate.opsForValue().get("user_"+id); return Mono.create(rs -> rs.success(u)); } Mono<User> m = userDao.findById(id); if (m!=null) { //更新缓存 m.subscribe(u -> { redisTemplate.opsForValue().set("user_"+u.getId(), u); }); } return m; } public Flux<User> findAll(){ return userDao.findAll().cache(); } public void deleteById(String id){ // 使用mongoTemplate来作删除 直接使用提供的删除方法不行 Query query = Query.query(Criteria.where("id").is(id)); mongoTemplate.remove(query, User.class); //userDao.deleteById(id); 这样没法删除,不知道为何 //同时删除缓存 if (redisTemplate.hasKey("user_"+id)) { redisTemplate.delete("user_"+id); } } }
通常咱们会和@cacheable
注解配合使用,可是在webflux中,咱们须要手动编程来实现redis的数据存储。缘由是Mono / Flux 对象没有实现 Serializable。上面用的是同步操做redis,还有一个异步操做ReactiveRedisTemplate
,可是由于咱们操做缓存的时候要先进行key
的判断后在执行后续操做,这是同步过程。使用ReactiveRedisTemplate
的话感受操做比较麻烦,谁若是有好的写法能够一块儿交流下。redis
填坑: User
对象须要实现Serializable,不然redis存储会失败。spring