第一章 Jedis 测试
jedis是redis的java版本的客户端实现。
1.1.Jedis所需要的jar包
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
1.2 连接Redis注意事项
- 禁用Linux的防火墙:Linux(CentOS7)里执行命令systemctl stop/disable firewalld.service
- redis.conf中注释掉bind 127.0.0.1 ,然后 protected-mode no
- 云服务器有的还需要设置安全组端口,开启6379端口
1.3 Jedis常用操作
创建测试程序
import redis.clients.jedis.Jedis; public class Demo01 { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.137.3",6379); String pong = jedis.ping(); System.out.println("连接成功:"+pong); jedis.close(); } }
Jedis-API
//操作zset @Test public void demo5() { //创建Jedis对象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.zadd("china",100d,"shanghai"); Set<String> china = jedis.zrange("china", 0, -1); System.out.println(china); jedis.close(); } //操作hash @Test public void demo4() { //创建Jedis对象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.hset("users","age","20"); String hget = jedis.hget("users", "age"); System.out.println(hget); jedis.close(); } //操作set @Test public void demo3() { //创建Jedis对象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.sadd("names","lucy"); jedis.sadd("names","mary"); Set<String> names = jedis.smembers("names"); System.out.println(names); jedis.close(); } //操作list @Test public void demo2() { //创建Jedis对象 Jedis jedis = new Jedis("112.16.10.11",6379); jedis.lpush("key1","lucy","mary","jack"); List<String> values = jedis.lrange("key1", 0, -1); System.out.println(values); jedis.close(); } //操作key string @Test public void demo1() { //创建Jedis对象 Jedis jedis = new Jedis("112.16.10.11",6379); //添加 key-value jedis.set("name","lucy"); //获取 String name = jedis.get("name"); System.out.println(name); //设置多个key-value jedis.mset("k1","v1","k2","v2"); List<String> mget = jedis.mget("k1", "k2"); System.out.println(mget); Set<String> keys = jedis.keys("*"); for(String key : keys) { System.out.println(key); } jedis.close(); }
第二章 Jedis实例
1.1 完成一个手机验证码功能
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次
设计
public class PhoneCode { public static void main(String[] args) { //模拟验证码发送 //verifyCode("13678765435"); //模拟验证码校验 getRedisCode("13678765435","447005"); } //3 验证码校验 public static void getRedisCode(String phone,String code) { //从redis获取验证码 Jedis jedis = new Jedis("112.16.10.11",6379); //验证码key String codeKey = "VerifyCode"+phone+":code"; String redisCode = jedis.get(codeKey); //判断 if(redisCode.equals(code)) { System.out.println("成功"); }else { System.out.println("失败"); } jedis.close(); } //2 每个手机每天只能发送三次,验证码放到redis中,设置过期时间120 public static void verifyCode(String phone) { //连接redis Jedis jedis = new Jedis("112.16.10.11",6379); //拼接key //手机发送次数key String countKey = "VerifyCode"+phone+":count"; //验证码key String codeKey = "VerifyCode"+phone+":code"; //每个手机每天只能发送三次 String count = jedis.get(countKey); if(count == null) { //没有发送次数,第一次发送 //设置发送次数是1 jedis.setex(countKey,24*60*60,"1"); } else if(Integer.parseInt(count)<=2) { //发送次数+1 jedis.incr(countKey); } else if(Integer.parseInt(count)>2) { //发送三次,不能再发送 System.out.println("今天发送次数已经超过三次"); jedis.close(); } //发送验证码放到redis里面 String vcode = getCode(); jedis.setex(codeKey,120,vcode); jedis.close(); } //1 生成6位数字验证码 public static String getCode() { Random random = new Random(); String code = ""; for(int i=0;i<6;i++) { int rand = random.nextInt(10); code += rand; } System.out.println(code); return code; } }
第三章 与Spring Boot整合
Spring Boot整合Redis非常简单,只需要按如下步骤整合即可
3.1 整合步骤
1、在pom.xml文件中引入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>
2、application.properties配置redis配置
#Redis服务器地址 spring.redis.host=112.16.10.11 #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
3、添加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; } }
4、测试一下
RedisTestController中添加测试方法
@RestController @RequestMapping("/redisTest") public class RedisTestController { @Autowired private RedisTemplate redisTemplate; @GetMapping public String testRedis() { //设置值到redis redisTemplate.opsForValue().set("name","lucy"); //从redis获取值 String name = (String)redisTemplate.opsForValue().get("name"); return name; } }
浏览器访问:http://localhost:8080/redisTest
显示 lucy
在redis客户端中