一,Jedis
Jedis是针对于java对redis操作的客户端工具,类似于jdbc用于mysql数据操作一样(但jdbc也可以操作其他SQL数据库)
Jedis测试:
1,导入pom依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
2,建立连接
连接对象分两种:
1,普通连接对象:new Jedis
2,集群连接对象:new jedisCluster(具体方法和普通连接对象差不多)
//创建jedis普通对象,建立连接 Jedis jedis =new Jedis("192.168.68.153",6379);
3,具体操作
jedis对象有所有的我们命令行操作的方式的方法,通过jedis调用进行,不详细说了
案例:模拟手机验证码发送
步骤:
-
输入手机号,点击发送后随机生成6位数的验证码,2分种有效
-
输入验证码,点击验证,返回成功或者失败
-
每一个手机号每天只能输入3次
分步解决:
-
随机生成6位数的验证码:有java的random随机类实现
-
验证码两分钟内有效:把验证码放入redis中并设置过期时间120秒
-
判断验证码是否一致:把输入的验证码和redis中保存的验证码做比较
-
每次手机每天只能发3次验证码:通过incr每次发送加1大于2的时候,提交不能发送
public class redis_photo { static Jedis jedis =new Jedis("192.168.68.153",6379); public static void main(String[] args) { Boolean exit=exist_math("15526446827"); if(exit){ System.out.println("验证成功!"); }else { System.out.println("验证失败!"); } } //随机产生6位数手机验证码 public static String getrandomath(){ Random random =new Random(); String randommath =""; for(int i=0;i<=5;i++){ int math = random.nextInt(10); randommath+=math; } return randommath; } //把验证码放入redis中 public static void into_redis(String photo){ String userphoto="userphoto:"+photo; //判断数据库中的手机号是否发送验证码超过三次 if(jedis.get(userphoto)==null){//如果手机号值为空,说明它没有发送过验证码 jedis.set(userphoto,"0");//设置一个map,key为手机号,value为次数 } if(Integer.parseInt(jedis.get(userphoto))>=2){//判断次数是否大于2 System.out.println("今天发送次数超过!"); jedis.close(); } jedis.incr(userphoto); String randommath = getrandomath();//获取验证码 jedis.setex(randommath,2*60,randommath);//设置验证码和过期时间 } //判断验证码是否一致 public static boolean exist_math(String photo){ into_redis(photo); Scanner scanner = new Scanner(System.in); System.out.println("请输入验证码!!"); String math=scanner.next(); if(jedis.get(math)==math){ return true; } return false; }
二,SpringBoot整合redis
第一步:导入pom依赖
<!--redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--Springboot2.0x之后需要的common-pool连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency>
第二步:在springboot的application.yml中配置redis连接
#redis的服务器地址 spring.redis.host=192.168.68.153 #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=2 #连接池的最大空闲连接 spring.redis.lettuce.pool.max-idle=8 #连接池最小空闲连接 spring.redis.lettuce.pool.min-idle=0
第三步:redis自动配置类RedisAutoConfiguration
@Configuration(proxyBeanMethods = false) @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)//redis调用的模板 throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)//字符串操作调用的模板 throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template;}}
redistemplate:springboot操作redis的模板类,针对于K-V形式
stringredistemplate:springboot操作redis的模板类,针对于String数据形式
redistemplate和stringredistemplate的区别:
-
redistemplate采用的是JDK的序列化策略,会把对象和字符串序列化存入redis中,取的时候在反序列化回来进行显示
-
stringredistemplate采用的是String的序列化策略,都已string类型保存和取出
区别用法:
-
当你想直接保存对象或者其他序列化时,使用redistemplate,但他存储在redis中查看是不友好的,只有再进行反序列化才能正常显示
-
当你想直接以字符串保存和取出,直接用stringredistemplate
注:用redistemplate取不存在序列化的数据时返回值为空
第四步:自定义redis配置类
@EnableCaching @Configuration public class redisconfig { @Bean //自定义redistemplate的序列化器 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); //使用GenericJackson2JsonRedisSerializer这个redis的序列化器代替JDK序列化器 GenericJackson2JsonRedisSerializer generic =new GenericJackson2JsonRedisSerializer(); //将generic设置进redis的默认序列化器中 template.setDefaultSerializer(generic); return template; } @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; }}
使用redis的GenericJackson2JsonRedisSerializer 序列化器替换默认JDK的序列化器
第五步:测试:注入redistemplate和stringredistemplate进行操作
常用方法:
opsForValue:操作string类型
opsForList:操作列表类型
opsForZset:操作有序集合
opsForSet:操作集合
opsForHash:操作hash
ops代表操作那种类型,具体方法和命令行指令是一样的,不详细说
@Autowired RedisTemplate redisTemplate; @Autowired StringRedisTemplate stringRedisTemplate; @DisplayName("Springboot和redis整合测试!") @Test void redis_test() { String s = (String) redisTemplate.opsForValue().get("userphoto:15526446827");//获取不到 String s1 = stringRedisTemplate.opsForValue().get("userphoto:15526446827");//可以获取到 System.out.println(s); System.out.println(s1); }
Comments | 4 条评论
加油?
挺牛逼的!!!
博主每一篇博客都像是一篇文章!!
这个可以