基于 SpringCloud, 用戶發(fā)起點(diǎn)贊、取消點(diǎn)贊后先存入 Redis 中,再每隔兩小時(shí)從 Redis 讀取點(diǎn)贊數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)中做持久化存儲(chǔ)。點(diǎn)贊功能在很多系統(tǒng)中都有,但別看功能小,想要做好需要考慮的東西還挺多的。 點(diǎn)贊、取消點(diǎn)贊是高頻次的操作,若每次都讀寫(xiě)數(shù)據(jù)庫(kù),大量的操作會(huì)影響數(shù)據(jù)庫(kù)性能,所以需要做緩存。 至于多久從 Redis 取一次數(shù)據(jù)存到數(shù)據(jù)庫(kù)中,根據(jù)項(xiàng)目的實(shí)際情況定吧,我是暫時(shí)設(shè)了兩個(gè)小時(shí)。 項(xiàng)目需求需要查看都誰(shuí)點(diǎn)贊了,所以要存儲(chǔ)每個(gè)點(diǎn)贊的點(diǎn)贊人、被點(diǎn)贊人,不能簡(jiǎn)單的做計(jì)數(shù)。 文章分四流量交易部分介紹: Redis 緩存設(shè)計(jì)及實(shí)現(xiàn) 數(shù)據(jù)庫(kù)設(shè)計(jì) 數(shù)據(jù)庫(kù)操作 開(kāi)啟定時(shí)任務(wù)持久化存儲(chǔ)到數(shù)據(jù)庫(kù) 一、Redis 緩存設(shè)計(jì)及實(shí)現(xiàn) 1.1 Redis 安裝及運(yùn)行 Redis 安裝請(qǐng)自行查閱相關(guān)教程。 說(shuō)下Docker 安裝運(yùn)行 Redis docker run -d -p 6379:6379 redis:4.0.8 如果已經(jīng)安裝了 Redis,打開(kāi)命令行,輸入啟動(dòng) Redis 的命令 redis-server 1.2 Redis 與 SpringBoot 項(xiàng)目的整合 1.在 pom.xml 中引入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.在啟動(dòng)類上添加注釋 @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.編寫(xiě) 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 項(xiàng)目中的配置已經(jīng)完成,可以愉快的使用了。 1.3 Redis 的數(shù)據(jù)結(jié)構(gòu)類型 Redis 可以存儲(chǔ)鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這5種數(shù)據(jù)結(jié)構(gòu)類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
|