深入实践Spring Boot2.2.2 创建Redis服务类

    xiaoxiao2024-05-09  7

    2.2.2 创建Redis服务类

    Redis提供了下列几种数据类型可供存取:

    string;

    hash;

    list;

    set及zset。

    在实例中,将使用string即字符串的类型来演示数据的存取操作。对于Redis,Spring Boot没有提供像JPA那样相应的资源库接口,所以只能仿照上一节中Repository的定义编写一个实体User的服务类,如代码清单2-10所示。这个服务类可以存取对象User以及由User组成的列表List,同时还提供了一个删除的方法。所有这些方法都是使用RedisTemplate来实现的。

    代码清单2-10 用户实体的Redis服务类

    @Repository

    public class UserRedis {

        @Autowired

        private RedisTemplate<String, String> redisTemplate;

     

        public void add(String key, Long time,User user) {

            Gson gson = new Gson();

            redisTemplate.opsForValue().set(key, gson.toJson(user), time, TimeUnit.

    MINUTES);

        }

     

        public void add(String key, Long time, List<User> users) {

            Gson gson = new Gson();

            redisTemplate.opsForValue().set(key, gson.toJson(users), time, TimeUnit.

    MINUTES);

        }

     

        public User get(String key) {

            Gson gson = new Gson();

            User user = null;

            String userJson = redisTemplate.opsForValue().get(key);

            if(!StringUtils.isEmpty(userJson))

                user = gson.fromJson(userJson, User.class);

            return user;

        }

     

        public List<User> getList(String key) {

            Gson gson = new Gson();

            List<User> ts = null;

            String listJson = redisTemplate.opsForValue().get(key);

            if(!StringUtils.isEmpty(listJson))

                ts = gson.fromJson(listJson, new TypeToken<List<User>>(){}.getType());

            return ts;

        }

     

        public void delete(String key){

            redisTemplate.opsForValue().getOperations().delete(key);

        }

    }

    Redis没有表结构的概念,所以要实现MySQL数据库中表的数据(即普通Java对象映射的实体数据)在Redis中存取,必须做一些转换,使用JSON格式的文本作为Redis与Java普通对象互相交换数据的存储格式。这里使用Gson工具将类对象转换为JSON格式的文本进行存储,要取出数据时,再将JSON文本数据转化为Java对象。

    因为Redis使用了key-value的方式存储数据,所以存入时要生成一个唯一的key,而要查询或者删除数据时,就可以使用这个唯一的key进行相应的操作。

    保存在Redis数据库中的数据默认是永久存储的,可以指定一个时限来确定数据的生命周期,超过指定时限的数据将被Redis自动清除。在代码清单2-10中我们以分钟为单位设定了数据的存储期限。

    另外,为了能正确调用RedisTemplate,必须对其进行一些初始化工作,即主要对它存取的字符串进行一个JSON格式的系列化初始配置,如代码清单2-11所示。

    代码清单2-11 RedisTemplate初始化

    @Configuration

    public class RedisConfig {

     

        @Bean

        public RedisTemplate<String, String> redisTemplate(

                RedisConnectionFactory factory) {

            StringRedisTemplate template = new StringRedisTemplate(factory);

            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.setValueSerializer(jackson2JsonRedisSerializer);

            template.afterPropertiesSet();

            return template;

        }

     

    }

    最新回复(0)