武漢網站制作/建立一個網站的費用
數據庫在用戶數量多,系統(tǒng)訪問量大的時候,系統(tǒng)性能會下降,用戶體驗差。
1.緩存優(yōu)化
作用:
???????1.降低數據庫的訪問壓力
???????2.提高系統(tǒng)的訪問性能
???????3.從而提高用戶體驗
實現思路:
1.先查詢緩存
2.如果緩存有數據,直接返回
3.如果緩存中沒有數據,則需要查詢數據庫,再將數據庫查詢的結果,緩存到redis中。
4.如果數據庫中的數據發(fā)生修改,緩存數據應當清空,保證和數據庫中的數據一致!(下一次查詢會查詢數據庫,然后最新的數據就到緩存了)
2.使用Redis緩存優(yōu)化
1.環(huán)境搭建
1.導入maven坐標
<!--spring Data Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2.修改配置文件
# redis相關配置redis:host: ip地址port: 6379password: 密碼database: 0 # 操作的是0號數據庫jedis:#redis連接池配置pool:max-active: 8 #最大連接數max-wait: 1ms #連接池最大阻塞等待時間max-idle: 4 #連接池中最大空閑連接min-idle: 0 #連接池中最小空閑連接
3.導入配置類
/*** Redis配置類*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默認的key序列化器為:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}
2.使用RedisTemplate操作Redis
在高并發(fā)的情況下,頻繁地查詢數據庫會導致系統(tǒng)性能下降,服務端響應時間增加,需要對這些Controller方法進行緩存優(yōu)化,提高系統(tǒng)的性能。
實現思路:
????????1.先查詢redis,如果redis中有就直接返回結果,如果沒有就去查詢數據庫,并將查詢到的結果放入Redis并指定有效期。
????????2.在新增,刪除和修改操作的時候,清空對應的緩存,保證數據庫中數據和緩存中數據一致。
3.Spring?Cache(重點)
Spring Cache是一個框架,實現了基于注解的緩存功能,只需要簡單地加一個注解,就能實現緩存功能。
Spring Cache提供了一層抽象,底層可以切換不同的cache實現,具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術。
????????????ChacheManager是Spring提供的各種緩存技術抽象接口
????????????EhCacheCacheManager :使用EhCache作為緩存技術
????????????GuavaCacheManager:使用Google的GuavaCache作為緩存技術
????????????RedisCacheManager:使用Redis作為緩存技術
使用步驟:
1.導入Maven坐標:(使用redis緩存技術)
<!--spring cache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>
<!--spring Data Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2.配置application.yml
spring:cache:redis:time-to-live: 1800000?#設置緩存有效時間
3.在啟動類上加入@EnableCaching注解,開啟緩存注解功能
@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}
4.在Controller方法上加入@Cacheable,@CacheEvict等注解,進行緩存操作
@EnableCaching | 開啟緩存注解功能 |
@Cacheable | 在方法執(zhí)行前spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據,調用方法并將方法返回值放到緩存中。 |
@CachePut | 將方法的返回值放到緩存中 |
@CacheEvict | 將一條或多條數據從緩存中刪除 |
注意:在Spring Boot項目中使用緩存技術只需在項目中導入相關緩存技術的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。

例如:使用Redis作為緩存技術,只需要導入Spring data Redis的maven坐標即可。
對象在網絡中傳輸需要實現序列化接口。

@Slf4j
@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate CacheManager cacheManager;/** 緩存測試 @Cacheable** @Cacheable:* 作用:* 1.可以在方法執(zhí)行前,先自動查詢緩存,如果緩存中存在數據,就直接返回(此方法不再執(zhí)行)* 2.如果緩存中沒有數據,執(zhí)行此方法,并且將方法返回值自動存入redis** 屬性:* cacheNames:key名稱空間* key: 名稱空間下的key* 最終redis存儲的key:[cacheNames::key]* 最終redis存儲的key:[userCache::1]*/@Cacheable(cacheNames = "userCache",key = "#id")@GetMapping("/{id}")public User one(@PathVariable Long id){User user = userService.getById(id);log.info("緩存中沒有查數據庫");return user;}/** 測試緩存清理:@CacheEvict** @CacheEvict* 作用:* 當方法執(zhí)行完畢后,去清理對應的緩存數據** allEntries = true:代表把當前名稱空間下的key都清理(默認false)* */
// @CacheEvict(cacheNames = "userCache",allEntries = true)@CacheEvict(cacheNames = "userCache",key = "#id")@DeleteMapping("/{id}")public void delete(@PathVariable Long id){userService.removeById(id);}@CacheEvict(cacheNames = "userCache",key = "#user.id")@PutMappingpublic User update(@RequestBody User user){userService.updateById(user);return user;}
}

cacheNames和key相當于這樣的結構