Redis04:redis的Jedis测试和Jedis实例与springboot整合
Redis_Jedis_测试
Jedis所需要的jar包
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
</dependencies>
连接Redis注意事项(开放端口,取消保护)
redis.conf中注释掉bind 127.0.0.1 ,然后 protected-mode no
这一步在配置文件中网络相关配置有说。然后才能在外连接不然就只能说虚拟机本机连接
然后测试代码:
public class JedisDemo1 {
public static void main(String[] args) {
//创建Jedis对象
Jedis jedis = new Jedis("192.168.31.249",6379);
//测试
String value = jedis.ping();
System.out.println(value);
}
}
会报错connect timed out
是因为我们没有关闭虚拟机的防火墙
查看虚拟机防火墙状态:
[root@LJY ~]# systemctl status firewalld
然后我们要关闭防火墙:(不推荐)
[root@LJY ~]# systemctl stop firewalld
然后我们再去测试java代码
就可以了
这里我们解决防火墙问题还有第二种方法(推荐用第二种方法)
首先我们把才关闭的防火墙打开
[root@LJY ~]# systemctl start firewalld
然后测试连接失败,接下来我们就用这个方法来连接。
开放6379端口
[root@LJY ~]# firewall-cmd --list-all #查看已经开放的端口
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: cockpit dhcpv6-client ssh
ports: 9000/tcp 80/tcp 8080/tcp 3306/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@LJY ~]# firewall-cmd --zone=public --add-port=6379/tcp --permanent #永久开启6379端口
success
[root@LJY ~]# systemctl restart firewalld.service #重启防火墙
然后再测试,OK
Jedis常用操作
创建动态的工程
导入jedis包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
创建工程
public class JedisDemo1 {
public static void main(String[] args) {
//创建Jedis对象
Jedis jedis = new Jedis("192.168.31.249",6379);
//测试
String value = jedis.ping();
System.out.println(value);
jedis.close();
}
}
创建测试程序
导入测试类包
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
创建测试重新
package com.li.jedis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
//操作key
public class JedisTest {
@Test
public void demo01(){
//创建Jedis对象
Jedis jedis = new Jedis("192.168.31.249",6379);
Set<String> keys = jedis.keys("*");
for (String key:keys){
System.out.println(key);
}
}
jedis.close();
}
运行得出结果
测试相关数据类型
以下几种测试都是一部分的方法,jedis里面方法和常用的五大类型数据里的命令一样。
Jedis-API: key
jedis.set("k1", "v1");
jedis.set("k2", "v2");
jedis.set("k3", "v3");
Set<String> keys = jedis.keys("*");
System.out.println(keys.size());
for (String key : keys) {
System.out.println(key);
}
System.out.println(jedis.exists("k1"));
System.out.println(jedis.ttl("k1"));
System.out.println(jedis.get("k1"));
为了便于练习先去redis-cli把以前的库都清理一下
127.0.0.1:6379> flushdb
@Test
public void demo01(){
//创建Jedis对象
Jedis jedis = new Jedis("192.168.31.249",6379);
//添加
jedis.set("name","ljy");
//获取
String name = jedis.get("name");
System.out.println(name);
Set<String> keys = jedis.keys("*");
for (String key:keys){
System.out.println(key);
}
jedis.close();
}
输出:ljy
name
还有一些其他的方法
Jedis-API: String
//操作key
public class JedisTest {
@Test
public void demo01() {
//创建Jedis对象
Jedis jedis = new Jedis("192.168.31.249", 6379);
//添加
jedis.set("name", "ljy");
//获取
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();
}
输出:
ljy,[v1, v2],name,k1,k2
Jedis-API : List
//操作List
@Test
public void demo02(){
Jedis jedis=new Jedis("192.168.31.249",6379);
//设置List
jedis.lpush("key5","aaa","bbb","ccc");
List<String> key = jedis.lrange("key5", 0, -1);
for (String key1:key) {
System.out.println(key1);
}
}
输出:
Jedis-API: set
//操作set
@Test
public void demo03(){
Jedis jedis=new Jedis("192.168.31.249",6379);
//设置set集合
jedis.sadd("t1","v1","v2","v3","v4");
//获取
Set<String> t1 = jedis.smembers("t1");
for (String ti:t1){
System.out.println(ti);
}
jedis.close();
}
Jedis-API: hash
//操作hash
@Test
public void demo04(){
Jedis jedis=new Jedis("192.168.31.249",6379);
//设置hash
jedis.hset("users","name","li");
//获取hash
String hget = jedis.hget("users", "name");
System.out.println(hget);
jedis.close();
}
Jedis-API: zset
//操作zset
@Test
public void demo05(){
Jedis jedis=new Jedis("192.168.31.249",6379);
//设置
jedis.zadd("china",100d,"shanghai");
jedis.zadd("china",101d,"chongqing");
//获取值
Set<String> china = jedis.zrange("china", 0, -1);
// for (String chinas :china) {
System.out.println(china);
// }
jedis.close();
}
[shanghai, chongqing]
Redis_Jedis实例(手机验证操作)
完成一个手机验证码功能
要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次
解题思路:
代码:
导包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
public class PhoneCode {
public static void main(String[] args) {
//模拟验证码发送
verifyCode("15330329487");
//getRedisCode("","");
}
//3、验证码校验
public static void getRedisCode(String phone, String code) {
//从redis中获取验证码
Jedis jedis = new Jedis("192.168.31.249", 6379);
//验证码key
String codeKey = phone + ":code";
String redisCode = jedis.get(codeKey);
//判断
if (redisCode.equals(code)) {
System.out.println("验证成功");
} else {
System.out.println("验证码错误");
}
jedis.close();
}
//每个手机每天只能发送三次,验证码放到redis中,设置过期时间
public static void verifyCode(String phone) {
//连接jedis
Jedis jedis = new Jedis("192.168.31.249", 6379);
//拼接key
//手机发送次数key
String countKey = phone + ":count";
//验证码key
String codeKey = 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;
}
return code;
}
}
然后测试,再去linux中查看key和value
把code复制到代码中修改主程序
public static void main(String[] args) {
//模拟验证码发送
// verifyCode("15330329487");
getRedisCode("15330329487","349567");
}
再次运行
Redis与Spring boot的整合
整合步骤
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.9.0</version>
</dependency>
2、 application.properties配置redis配置
#Redis服务器地址
spring.redis.host=192.168.31.249
#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;
}
}
导入包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4、测试一下
Controller层中添加测试方法
@RestController
@RequestMapping("/redistest")
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping
public String testRedis() {
//设置值到redis中
redisTemplate.opsForValue().set("name", "ljy");
//从redis中获取值
String name = (String) redisTemplate.opsForValue().get("name");
return name;
}
}
然后启动springbott
访问: