基于 SpringCloud, 用戶發(fā)起點贊、取消點贊后先存入 Redis 中,再每隔兩小時從 Redis 讀取點贊數(shù)據(jù)寫入數(shù)據(jù)庫中做持久化存儲。點贊功能在很多系統(tǒng)中都有,但別看功能小,想要做好需要考慮的東西還挺多的。 點贊、取消點贊是高頻次的操作,若每次都讀寫數(shù)據(jù)庫,大量的操作會影響數(shù)據(jù)庫性能,所以需要做緩存。 至于多久從 Redis 取一次數(shù)據(jù)存到數(shù)據(jù)庫中,根據(jù)項目的實際情況定吧,我是暫時設了兩個小時。 項目需求需要查看都誰點贊了,所以要存儲每個點贊的點贊人、被點贊人,不能簡單的做計數(shù)。 文章分四流量交易部分介紹: Redis 緩存設計及實現(xiàn) 數(shù)據(jù)庫設計 數(shù)據(jù)庫操作 開啟定時任務持久化存儲到數(shù)據(jù)庫 一、Redis 緩存設計及實現(xiàn) 1.1 Redis 安裝及運行 Redis 安裝請自行查閱相關(guān)教程。 說下Docker 安裝運行 Redis docker run -d -p 6379:6379 redis:4.0.8 如果已經(jīng)安裝了 Redis,打開命令行,輸入啟動 Redis 的命令 redis-server 1.2 Redis 與 SpringBoot 項目的整合 1.在 pom.xml 中引入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.在啟動類上添加注釋 @EnableCaching @SpringBootApplication @EnableDiscoveryClient @EnableSwagger2 @EnableFeignClients(basePackages = "com.solo.coderiver.project.client") @EnableCaching public class UserApplication {
public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } } 3.編寫 Redis 配置類 RedisConfig import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import java.net.UnknownHostException;
@Configuration public class RedisConfig {
@Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<String, Object> redisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(jackson2JsonRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }
@Bean @ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } } 至此 Redis 在 SpringBoot 項目中的配置已經(jīng)完成,可以愉快的使用了。 1.3 Redis 的數(shù)據(jù)結(jié)構(gòu)類型 Redis 可以存儲鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這5種數(shù)據(jù)結(jié)構(gòu)類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
|