在使用之前先簡單介紹一下,redis和mongoDB這兩個nosql的區別以及使用場景。
1. redis
redis是一個分布式緩存、高性能的key-value數據庫。支持存儲的value類型包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。數據操作在內存中,因此效率非常高。可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。
2. mongoDB
mongoDB 是一種文檔性的數據庫。先解釋一下文檔的數據庫,即可以存放xml、json、bson類型系那個的數據。這些數據具備自述性(self-describing),呈現分層的樹狀數據結構。支持豐富的查詢語句。
使用場景總結
-
mongodb 更偏向保存數據,而 redis 更偏向保持狀態。
-
業務數據量小且對效率有要求用redis.
-
mongoDB用於對海量數據的操作性能提升。
最簡單的就這幾點,最最重要的是你要知道一個叫緩存,一個是數據庫。想清楚了就理解了。
這些都是個人理解,關於事務方面的,雖然redis支持,但很弱,真正涉及到事務的場景基本不會用它的。
接下來,進入正題,首先你的機器上要先安裝redis,建議用docker.
docker使用redis
-
獲取
redis
鏡像
執行命令docker pull redis
-
運行
redis
並進行端口映射和持久化存儲
docker run -d --name myredis -p6379:6379 -v /d/dockerdata/redis/data:/data redis --appendonly yes
參數說明:
-
-d ——后台運行
-
-name —— 運行后容器的名字
-
-p 6379:6379 —— 端口映射,默認端口
-
-v /d/dockerdata/redis/data:/data —— 保存數據的位置。
-
redis –appendonly yes —— 在容器執行redis啟動命令,並打開redis持久化配置。
有可能會提示輸入Windows密碼,或者提示找不到文件存儲目錄,正常輸入密碼,指定位置創建文件夾就好。
- 測試運行是否成功
PS C:\Users\Gyyyang> docker exec -it myredis redis-cli
127.0.0.1:6379> info
# Server
redis_version:5.0.6
redis_git_sha1:00000000
......
spring boot項目中使用redis
1.添加 Redis 依賴
Spring Boot 官方已經為我們提供好了集成 Redis 的 Starter,我們只需要簡單地在 pom.xml 文件中添加如下代碼即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.配置 Redis
spring:
redis:
host: 192.168.2.28
port: 6379
database: 0 # 數據庫索引,默認是0
password: # Redis 服務器連接密碼(默認為空)
# 在2.0后 redis 底層已經默認修改為使用的是 Lettuce 而不是 Jedis 作為 Redis 驅動程序,但是仍然支持 Jedis,配置用法一致
lettuce:
pool:
max-active: 8 #連接池最大連接數(使用負值表示沒有限制)
max-wait: -1 # 連接池最大阻塞等待時間(使用負值表示沒有限制)
max-idle: 8 # 連接池中的最大空閑連接
min-idle: 0 # 連接池中的最小空閑連接
timeout: 0 # 連接超時時間(毫秒)
Spring Boot
的 spring-boot-starter-data-redis
為 Redis
的相關操作提供了一個高度封裝的 RedisTemplate
類,而且對每種類型的數據結構都進行了歸類,將同一類型操作封裝為 operation
接口。RedisTemplate
對五種數據結構分別定義了操作,如下所示:
-
操作字符串:
redisTemplate.opsForValue()
-
操作
Hash:redisTemplate.opsForHash()
-
操作
List:redisTemplate.opsForList()
-
操作
Set:redisTemplate.opsForSet()
-
操作
ZSet:redisTemplate.opsForZSet()
但是對於 string
類型的數據,Spring Boot
還專門提供了 StringRedisTemplate
類,而且官方也建議使用該類來操作 String
類型的數據。那么它和 RedisTemplate
又有啥區別呢?
-
RedisTemplate
是一個泛型類,而StringRedisTemplate
不是,后者只能對鍵和值都為String
類型的數據進行操作,而前者則可以操作任何類型。 -
兩者的數據是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的數據,RedisTemplate 只能管理 RedisTemplate 中 的數據。
RedisTemplate
的配置
一個 Spring Boot 項目中,我們只需要維護一個 RedisTemplate 對象和一個 StringRedisTemplate 對象就可以了。所以我們需要通過一個 Configuration 類來初始化這兩個對象並且交由的 BeanFactory 管理。在 config 包下面新建了一個 RedisConfig 類,其內容如下所示:
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) {
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) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
其中@Configuration
代表這個類是一個配置類,然后@AutoConfigureAfter(RedisAutoConfiguration.class)
是讓我們這個配置類在內置的配置類之后在配置,這樣就保證我們的配置類生效,並且不會被覆蓋配置。其中需要注意的就是方法名一定要叫redisTemplate
因為@Bean
注解是根據方法名配置這個bean
的name
的。
測試
新建一個實體類:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final Long serialVersionUID = 111111111L;
private String username;
private String password;
private Integer age;
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
測試代碼:
@SpringBootTest
class BootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
String key = "name";
stringRedisTemplate.opsForValue().set(key, "hai");
String value = stringRedisTemplate.opsForValue().get(key);
System.out.println(key + "----" + value);
User user =new User();
user.setUsername("yang");
user.setPassword("ssss");
user.setAge(12);
String userKey = "yang";
redisTemplate.opsForValue().set(userKey,user);
User newUser = (User) redisTemplate.opsForValue().get(userKey);
System.out.println("獲取緩存中key為" + userKey + "的值為:" + newUser);
}
}
測試結果:
name----hai
獲取緩存中key為yang的值為:User{username='yang', password='ssss', age=12}
其他數據類型操作類似,就不一一列舉了,也可以下載一個可視化工具查看一下緩存。
文章內容純屬個人理解,可能存在錯誤,望及時指出,希望對你有用。