28、Redis6详解 主要的时redis基本操作
1、redis的应用场景:排行榜,秒杀系统,手机验证吗自动失效,构建队列,消息发布订阅
2、docker-compose 安装redis docker-compose.yml 配置文件
version: '3'
services:
redis:
image: redis:latest
container_name: redis
restart: always
ports:
- 6379:6379
networks:
- mynetwork
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf:rw
- ./data:/data:rw
command:
/bin/bash -c "redis-server /usr/local/etc/redis/redis.conf "
networks:
mynetwork:
external: true
3、redis的五大数据类型:string字符串、list集合,set集合、Hash、zset有序集合
4、redis操作key的命令
4、redis 操作字符串数据类型

5、redis操作List列表数据类型

6、redis操作set集合数据类型

7、redis操作Hash数据类型

8、redis操作zset集合数据类型


9、SpringBoot整合redis发送手机验证码的实现添加依赖
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
编写配置文件application.properties
#Redis服务器地址 spring.redis.host=8.129.215.115 #Redis服务器连接端口 spring.redis.port=6379 #Redis数据库索引(默认为0) spring.redis.database= 0 #连接超时时间(毫秒) spring.redis.timeout=1800000 #连接池最大连接数(使用负值表示没有限制) spring.redis.lettuce.pool.max-active=20 #最大阻塞等待时间(负数表示没限制) spring.redis.lettuce.pool.max-wait=-1 #连接池中的最大空闲连接 spring.redis.lettuce.pool.max-idle=5 #连接池中的最小空闲连接 spring.redis.lettuce.pool.min-idle=0
编写Redis配置类
@EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
测试redisTemplate 发送验证码
@SpringBootTest
public class PhoneCodeServiceTest {
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
public void test01() {
String phoneCode = checkPhoneCode("13652332424");
checkCode("13652332424",phoneCode);
}
public void checkCode (String phone,String code) {
String codeKey = "checkPhone"+ phone+ ":code";
Object codeValue = redisTemplate.opsForValue().get(codeKey);
if(code.equals(codeValue)) {
System.out.println("成功");
}else {
System.out.println("失败");
}
}
public String checkPhoneCode (String phone) {
String codeKey = "checkPhone"+ phone+ ":code";
String countKey = "checkPhone"+ phone+ ":count";
Object count = redisTemplate.opsForValue().get(countKey);
if(count == null) {
//第一次发送验证码
redisTemplate.opsForValue().set(countKey, 1, 24*60*60, TimeUnit.SECONDS);
}else if(Integer.parseInt(String.valueOf(count)) <=2) {
// 每次加一
Long increment = redisTemplate.boundValueOps(countKey).increment(1);
System.out.println(increment);
}else if (Integer.parseInt(String.valueOf(count))>2) {
System.out.println("今天验证码发送超过三次了");
}
//把这个验证码存到redis中
String phoneCode = getCode();
redisTemplate.opsForValue().set(codeKey, phoneCode, 120, TimeUnit.SECONDS);
return phoneCode;
}
//生成验证码方法
public String getCode () {
Random random = new Random();
String code = "";
for(int i=0;i<6;i++) {
int nextInt = random.nextInt(10);
code = code + nextInt;
}
return code;
}
}

浙公网安备 33010602011771号