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 发布到的频道 要发送到消息
发布者
订阅者