Redis——缓存中间件学习

一、五大常用基本类型

1、String类型

2、List类型

3、Set类型

4、哈希(Hash)

5、有序集合(Zset)

二、常用命令:

setex:设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期

setnx:将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写

sinter:交集

sunion:并集

sdiff:差集

geoadd:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

geopos:从key里返回所有给定位置元素的位置(经度和纬度)。

geodist:返回两个给定位置之间的距离(详情

georadius:以给定的经纬度为中心, 找出某一半径内的元素

三、基本的事务操作

常用事务命令:

multi:开启事务

exec:执行事务

discard:回滚事务(即丢弃所有multi之后发出的命令)

watch:锁定key直到执行了multi / exec

unwatch:取消事务

四、乐观锁实现

通过watch命令锁定key来实现Redis中的乐观锁

五、SpringBoot整合Redis

1、导入依赖

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、配置

3、定义User类

 1 package com.lzp.redis02springboot.pojo;
 2 
 3 import lombok.*;
 4 
 5 import java.io.Serializable;
 6 
 7 /**
 8  * @Author 14715
 9  * @Date 2021/9/15 15:25
10  */
11 @Getter
12 @Setter
13 @ToString
14 @AllArgsConstructor
15 @NoArgsConstructor
16 // 企业中开发,pojo对象一般都需要序列化,因为要进行网络传输
17 public class User implements Serializable {
18 
19     private String userName;
20     private String password;
21 
22 }

这里要注意:User类一定要实现序列化接口,不然后面会报错无法序列化

4、测试

 1 package com.lzp.redis02springboot;
 2 
 3 import com.fasterxml.jackson.core.JsonProcessingException;
 4 import com.fasterxml.jackson.databind.ObjectMapper;
 5 import com.lzp.redis02springboot.pojo.User;
 6 import org.junit.jupiter.api.Test;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.data.redis.core.RedisTemplate;
10 import java.util.HashMap;
11 import java.util.Map;
12 
13 @SpringBootTest
14 class Redis02SpringbootApplicationTests {
15 
16     @Autowired
17     private RedisTemplate<String, Object> redisTemplate;
18 
19     @Test
20     void contextLoads() throws JsonProcessingException {
21         User user = new User();
22         user.setUserName("程序鹏");
23         user.setPassword("123");
24         // 转成json字符串(序列化)
25 //        String jsonUser = new ObjectMapper().writeValueAsString(user);
26         // 或者直接存放对象
27         redisTemplate.opsForValue().set("user", user);
28         System.out.println(redisTemplate.opsForValue().get("user"));
29     }
30 
31 }

测试结果(IDEA控制台)

redis客户端(命令行窗口)

六、自定义RedisTemplate(模板)

 1 package com.lzp.redis02springboot.config;
 2 
 3 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 4 import com.fasterxml.jackson.annotation.PropertyAccessor;
 5 import com.fasterxml.jackson.databind.ObjectMapper;
 6 import org.springframework.context.annotation.Bean;
 7 import org.springframework.context.annotation.Configuration;
 8 import org.springframework.data.redis.connection.RedisConnectionFactory;
 9 import org.springframework.data.redis.core.RedisTemplate;
10 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
11 import org.springframework.data.redis.serializer.StringRedisSerializer;
12 
13 /**
14  * @Author 14715
15  * @Date 2021/9/15 15:34
16  */
17 @Configuration
18 public class RedisConfig {
19 
20     // 自定义RedisTemplate
21     @Bean
22     @SuppressWarnings("all")
23     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
24         // 为了开发方便,一般直接使用 <String, Object>
25         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
26         // 设置redis连接工厂
27         redisTemplate.setConnectionFactory(redisConnectionFactory);
28 
29         // jackson的序列化器
30         Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
31         ObjectMapper om = new ObjectMapper();
32         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
33         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
34         jackson2JsonRedisSerializer.setObjectMapper(om);
35 
36         // String的序列化器
37         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
38 
39         redisTemplate.setKeySerializer(stringRedisSerializer);
40         redisTemplate.setHashKeySerializer(stringRedisSerializer);
41         redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
42         redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
43         redisTemplate.afterPropertiesSet();
44 
45         return redisTemplate;
46     }
47 
48 }

七、发布订阅

命令

1、订阅:subscribe

  使用:subscribe 订阅的频道

2、发布:publish

  使用:publish 发布到的频道 要发送到消息

发布者

订阅者

 

posted @ 2021-09-14 14:35  没有你哪有我  阅读(177)  评论(0编辑  收藏  举报