Redis作為一個Java后端面試中的一個常問考點,並且在項目中越來越常用,所以自己動手搭建了一個基於springboot集成redis做為數據緩存的demo(springboot集成mybatis、redis,並具有增刪改查詢接口)。關注微信公眾號【菜鳥阿都】並回復:redis,可獲得源碼。后面也會繼續深入研究redis相關知識,期待與大家一起學習交流。
redis簡介
基於鍵值對的開源內存數據庫,支持5種數據類型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。spring對redis的支持是通過spring Data Redis來實現的,Spring Data Redis 提供了RedisTemplate和StringRedisTemplate兩個模板來進行數據操作,StringRedisTemplate只針對鍵值都是字符型的數據進行操作,StringRedisTemplate繼承於RedisTemplate,並采用StringRedisSerializer對鍵值序列化。
StringRedisTemplate 實現源碼
public class StringRedisTemplate extends RedisTemplate<String, String>{
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
}
public interface RedisSerializer<T> {
static RedisSerializer<String> string() {
return StringRedisSerializer.UTF_8;
}
}
RedisTemplate提供的數據訪問方法
方法 |
說明 |
opsForValue() |
操作只有簡單屬性的數據 |
opsForList() |
操作含有list的數據 |
opsForSet() |
操作含有set的數據 |
opsForZSet() |
操作含有ZSet(有序的set)的數據 |
opsForHash() |
操作含有hash的數據 |
1. 添加reids依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.1</version>
</dependency>
2. 封裝redis工具類
將redis的操作方法封裝為工具類,方便使用
/**
* Redis操作工具類
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
// 存入數據到緩存
public void setValue(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
// 通過key獲得數據
public Object getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
// 存入數據到緩存並設置過期時間(單位為秒)
public void setValueAndExpire(String key, Object value, long time){
redisTemplate.opsForValue().set(key, value,time,TimeUnit.SECONDS);
}
// 刪除緩存
public void delete(String key){
redisTemplate.delete(key);
}
}
3. redis使用
查詢數據時先查詢緩存中是否存在,存在時,返回內存中的數據,緩存中不存在時,再查詢數據庫並存入緩存,然后返回查詢出的數據
// 根據id查詢記錄
@Override
public User find(int id) {
//根據key查詢緩存
User user=(User) redisUtil.getValue("userKey"+id);
//判斷是否為空
if(user==null){
// 緩存為空,查詢數據庫
user=userMapper.find(id);
System.out.println("緩存為空,查詢數據庫");
// 插入緩存,並設置過期時間(單位為秒)
redisUtil.setValueAndExpire("userKey"+id,user,30);
System.out.println("插入緩存");
}else{
System.out.println("緩存不為空");
}
return user;
}
4. 自定義緩存序列化方式
RedisTemplate默認采用JdkSerializaationRedisSerializer方式序列化,以二進制數據存放,使用redis客戶端工具查看數據時不直觀,並且需要對實體類進行序列化(實現Serializable接口)。所以編寫redis的配置類修改RedisTemplate的序列化方式,將JdkSerializaationRedisSerializer序列化方式修改為Jackson2JsonRedisSerialize,以json格式對數據進行保存。StringRedisTemplate默認使用的是StringRedisSerializer。
@Configuration
public class RedisConfig {
// 使用Jackson2JsonRedisSerialize替換默認JDK序列化
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// key采用String的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
// hash的key也采用String的序列化方式
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// value序列化方式采用jackson
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// hash的hash的value序列化方式采用jackson
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
默認序列化(通過redisClient客戶端查看)
使用自定義序列化后,存入緩存中的數據(通過redisClient客戶端查看)
5.結果分析
第一次訪問時,緩存為空,查詢數據庫並插入緩存中,總共用時2941毫秒,第二次查詢時,直接從緩存中獲取,用時僅僅25毫秒。
緩存為空,查詢數據庫
插入緩存
總用時:2941
緩存不為空
總用時:25
關注微信公眾號【菜鳥阿都】並回復:redis,可獲得源碼
資源獲取
回復關鍵字(關注微信公眾號) | 描述 |
redis | 獲得springboot集成redis.,mybatis增刪改查示例源碼 |
easymock | 獲得免費easymock接口服務 |
springboot | 獲得springboot集成swagger,mybatis增刪改查示例源碼 |
redis客戶端 | 獲得redis數據庫管理軟件redisClient |
java資源 | 獲得java多線程,springboot,sql優化,java面試視頻資源 |
開發手冊 | 阿里巴巴java開發手冊(嵩山版) |