Redis04:redis的Jedis测试和Jedis实例与springboot整合

7 篇文章 1 订阅
6 篇文章 1 订阅

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

image-20210502172313281

是因为我们没有关闭虚拟机的防火墙

查看虚拟机防火墙状态:

[root@LJY ~]# systemctl status firewalld

image-20210502172505835

然后我们要关闭防火墙:(不推荐)

[root@LJY ~]# systemctl stop  firewalld

然后我们再去测试java代码

image-20210502172709972

就可以了


这里我们解决防火墙问题还有第二种方法(推荐用第二种方法)

首先我们把才关闭的防火墙打开

[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();
}

运行得出结果

image-20210502174322614

测试相关数据类型

以下几种测试都是一部分的方法,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

还有一些其他的方法

image-20210502175013273

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);
        }
    }

输出:image-20210502180155147

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次

解题思路:

image-20210503091725879

代码:

导包

 <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

image-20210503105512156

把code复制到代码中修改主程序

    public static void main(String[] args) {
        //模拟验证码发送
      //  verifyCode("15330329487");
        getRedisCode("15330329487","349567");
    }

再次运行

image-20210503105627441

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

访问:

image-20210503112217371

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值