zoukankan      html  css  js  c++  java
  • 【四】Redis从入门到放弃---RedisTemplate操作Redis

       Spring对Redis的支持一般是实用Jedis操作的,在上一篇文章中也有详细介绍了。那么SpringBoot对Redis的支持则是使用 了自动配置RedisAutoConfiguration中的RedisTemplate与StringRedisTemplate,RedisTemplateStringRedisTemplate的区别:StringRedisTemplate继承了RedisTemplate;RedisTemplate是一个泛型类,而StringRedisTemplate则不是;RedisTemplate可以对任何类型的key-value键值对操作StringRedisTemplate的key-value键值都只能是String类型;两者序列化/反序列化不同。

    我们接下来就介绍下RedisTemplate是如何操作Redis的吧:

    (1)添加依赖

    <!-- 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)使用配置文件配置Redis

       application.properties

    #Redis服务器地址
    spring.redis.host=47.106.195.84
    #Redis服务器连接端口
    spring.redis.port=6379
    #有密码的设置下密码
    spring.redis.password=*****
    #Redis数据库索引(默认为0)
    spring.redis.database= 15
    #连接超时时间(毫秒)
    spring.redis.timeout=1000
    #连接池最大连接数(使用负值表示没有限制)
    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

    或者application.yml

    spring:
      redis:
        port: 6379
        database: 15
        host: 47.106.195.84
        password:
        jedis:
          pool:
            max-active: 8
            max-wait: -1ms
            max-idle: 8
            min-idle: 0
        timeout: 5000ms

    (3)添加redis配置类

    @EnableCaching
    @Configuration
    @EnableTransactionManagement//开启事务管理
    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();
            // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            //指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            // 配置连接工厂
            template.setConnectionFactory(factory);
            //key序列化方式
            template.setKeySerializer(redisSerializer);
            //value序列化
            template.setValueSerializer(jackson2JsonRedisSerializer);
            //设置hash key 和value序列化模式
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            //打开事务支持
            template.setEnableTransactionSupport(true);
            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)添加redis测试类

    /**
     * RedisTemplate 对五种数据结构分别定义了操作
     * 
     * 操作字符串:redisTemplate.opsForValue();
     * 
     * 操作list:redisTemplate.opsForList();
     * 
     * 操作set:redisTemplate.opsForSet();
     * 
     * 操作hash:redisTemplate.opsForHash();
     * 
     * 操作有序set:redisTemplate.opsForZSet();
     * 
     */
    @RestController
    @RequestMapping("/redisTest")
    public class TestRedisController {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        /**
         * 对String类型操作
         *
         * @return
         */
        @GetMapping("/testString")
        public String testString() {
            //设置值到redis
            redisTemplate.opsForValue().set("string01", "lucy");
            redisTemplate.opsForValue().set("string02", "lucy1", 60);//并设置有效时间的
            //从redis获取值
            String name = (String) redisTemplate.opsForValue().get("string01");
            return name;
        }
    
        /**
         * 对List类型操作
         *
         * @return
         */
        @GetMapping("testList")
        public String testList() {
            //从左边设置值给list01
            redisTemplate.opsForList().leftPush("list01", "value01");//单个
            redisTemplate.opsForList().leftPushAll("list01", "value02", "value03", "value04");//多个
            ArrayList<String> list = new ArrayList<>();
            list.add("add01");
            list.add("add02");
            list.add("add03");
            list.add("add04");
            redisTemplate.opsForList().leftPushAll("list01", list);//集合方式
    
            //获取某个key的长度
            System.out.println(redisTemplate.opsForList().size("list01"));
            System.out.println(redisTemplate.opsForList().range("list01", 0, -1));
            return "ok";
        }
    
        /**
         * 对Hash类型操作
         *
         * @return
         */
        @GetMapping("testHash")
        public String testHash() {
    
            redisTemplate.opsForHash().put("hash01", "hkey01","value01");//单个
            Map<String,String> map = new HashMap<>();
            map.put("addAll01","v1");
            map.put("addAll02","v2");
            map.put("addAll03","v3");
            map.put("addAll04","v4");
            redisTemplate.opsForHash().putAll("hash01", map);//集合方式
    
            //获取某个key的长度
            System.out.println(redisTemplate.opsForHash().keys("hash01"));
            //删除
            redisTemplate.opsForHash().delete("hash01", "addAll01");
            //判断是否存在
            System.out.println(redisTemplate.opsForHash().hasKey("hash01", "addAll01"));
            //获取某个key的值
            System.out.println(redisTemplate.opsForHash().values("hash01"));
            return "ok";
        }
    }
  • 相关阅读:
    windows下使用curl命令,以及常用curl命令
    使用 C# 下载文件的十八般武艺
    初闻不知曲中意,再听已是曲中人
    从线性回归走进机器学习
    自定义Vue&Element组件,实现用户选择和显示
    ARP协议原理——地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址,ARP整个完整交互过程仅需要两个包,一问一答即可搞定
    SSH加密隧道流量攻击与检测技术——这玩意和思科加密流量检测没有本质区别啊,可借鉴CNN图像
    bt2——基于telegram的C2
    通过gmail进行C2控制——看了下源码,本质上和dropbox c2架构一样,都是去轮训邮件,将c2攻击的东西以邮件形式发送,结果也发到邮箱里
    DropboxC2 工具原理总结——就是通过dropbox文件来间接做c2控制和交互。
  • 原文地址:https://www.cnblogs.com/yaoyaoling/p/15085546.html
Copyright © 2011-2022 走看看