zoukankan      html  css  js  c++  java
  • Redis(二)jedis API

    第一章 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客户端中

    作者:王陸

    -------------------------------------------

    个性签名:罔谈彼短,靡持己长。做一个谦逊爱学的人!

    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。鉴于博主处于考研复习期间,有什么问题请在评论区中提出,博主尽可能当天回复,加微信好友请注明原因

  • 相关阅读:
    table常用功能总结
    oracle中number类型的数据使用as string 得到的值为null
    Oracle连接超时
    VS重新生成后仍然执行旧代码
    .NET 环境中使用RabbitMQ
    使用CLR Function代替T-SQL函数,优化检索效率
    SQL Server CLR 使用 C# 自定义存储过程和触发器
    OrderBy排序和IComparer的使用
    System.net.mail 使用ssl发送邮件失败
    C#利用CDO.Message发送邮件
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/15746214.html
Copyright © 2011-2022 走看看