五. spring boot 集成redis 实现增,删,查,

本文在: 四.spring boot 项目多环境设置,日志设置   上实现 

代码地址:spring-boot-demo-profiles

1.地址配置

在pom.xml中引入访问数据库需要依赖


   org.springframework.boot
   spring-boot-starter-data-redis

在多环境配置文件yml中加入不同环境的redis地址

五. spring boot 集成redis 实现增,删,查,_第1张图片

 redis  默认使用jdk自带的序列化,存值会出现/0Xab/0xac/00 乱码前缀

对RedisTemplate的序列化策略,在config目录下创建一个类:

package com.ldxdcxy.demo.config.redis;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis Template 自定义的string序列化
 * @author ldxdcxy
 */
@Configuration
public class RedisTemplateConfig {

    /**
     * @Description RedisTemplate配置类
     * 默认使用jdk自带的序列化,存值会出现/0Xab/0xac/00 乱码前缀
     * 修改序列化器,使用阿里的FastJson2JsonRedisSerializer
     * @return
     */
    @Bean(name = {"redisTemplate"})
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.WRAPPER_ARRAY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 防止乱码
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        //解决json转换
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        //解决哈唏值转换
        redisTemplate.setHashValueSerializer(stringSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

为什么使用 Jackson2JsonRedisSerializer 而不是  GenericJackson2JsonRedisSerializer 作为序列化执行器?

答:在百度搜索Jackson2JsonRedisSerializer 和 GenericJackson2JsonRedisSerializer的区别,又很多大神对两者进行了比较。

使用Stringredistemplate 可以解决序列化,为什么还要对RedisTemplate进行序列化了?

答:StringRedisSerializer的泛型指定的是String,主要是存储字符串的,不能存对象,如果你项目都是字符串存储可考虑用StringRedisTemplate。对RedisTemplate序列化让对象(包含字符串)具有了可读性。

redis 常用操作语句

opsFor 系列操作

/**
 * 操作字符串
 */
redisTemplate.opsForValue();
redisTemplate.opsForValue().set("data-key","data-value");
String dataValue= (String) redisTemplate.opsForValue().get("data-key");
/**
 * 操作hash
 */
redisTemplate.opsForHash();
 Map maps = new HashMap();
 maps.put("1", "张三");
 maps.put("2", "李四");
 maps.put("3", "王五");
 maps.put("4", "六七");
 redisTemplate.opsForHash().putAll("dataKey:user", maps);
Map entries = redisTemplate.opsForHash().entries("dataKey:user");
/**
 * 操作list
 */
redisTemplate.opsForList();
  /**
   * 添加值
   */
redisTemplate.opsForList().leftPush("dataKey","a");
redisTemplate.opsForList().leftPush("dataKey","b");
redisTemplate.opsForList().leftPush("dataKey","c");
redisTemplate.opsForList().leftPush("dataKey","d");
 /**
  * 获取集合指定位置的值。
  */
String listValue = (String) redisTemplate.opsForList().index("dataKey",1);
 /**
  * 获取指定区间的值 (可实现分页) 获取集合的长度,然后获取区间的值
  */
long listLength = redisTemplate.opsForList().size("dataKey");
List list =  redisTemplate.opsForList().range("dataKey",0,10); 
  
/**
 * 操作set
 */
redisTemplate.opsForSet();
 /**
  * 添加值
  */
redisTemplate.opsForSet().add("dataKey","A","B","C","B","D","E","F");
 /**
  * 获取值
  */
 Set set = redisTemplate.opsForSet().members("dataKey");
/**
 * 操作有序set
 */
redisTemplate.opsForZSet();
  /**
   * 添加值
   * score 指定顺序
   */
redisTemplate.opsForZSet().add("dataKey","A",3);
redisTemplate.opsForZSet().add("dataKey","B",1);
redisTemplate.opsForZSet().add("dataKey","C",2);
redisTemplate.opsForZSet().add("dataKey","D",4);
/**
 *  获取变量指定区间的元素。
 */
Set zSetValue = redisTemplate.opsForZSet().range("dataKey",0,4);

bound 系列操作

BoundValueOperations就是一个绑定key的对象,我们可以通过这个对象来进行与key相关的操作。

/**
 * 操作字符串 
 */
redisTemplate.boundValueOps(key).set(value);
 /**
  * 绑定key
  */
BoundValueOperations boundValueOps = redisTemplate.boundValueOps("dataKey");
/**
 * 添加值
 */
 boundValueOps.set("路灯下的程序员");
 /**
  * 获取值
  */
String str = (String) boundValueOps.get();
/**
 * 操作hash
 */
BoundHashOperations boundHashOps = redisTemplate.boundHashOps(key);
/**
 * 绑定key
 */
BoundHashOperations boundHashOps = redisTemplate.boundHashOps("dataKey");
/**
 * 添加值
 */
boundHashOps.put("ldxdcxy1","路灯下的程序员1");
boundHashOps.put("ldxdcxy2","路灯下的程序员2");
/**
 * 获取值
 */
String str = (String) boundHashOps.get("ldxdcxy1");
/**
 * 操作list
 */
BoundListOperations boundListOps = redisTemplate.boundListOps(key);
 /**
  * 绑定key
  */
BoundListOperations boundListOps = redisTemplate.boundListOps("dataKey");
 /**
  * 添加值
  */
boundListOps.leftPush("a");
boundListOps.leftPush("b");
boundListOps.leftPush("c");
/**
 * 获取指定值
 */
boundListOps.index(2);
/**
 * 获取区间值
 */
List range = boundListOps.range(0, -1);
/**
 * 操作set
 */
BoundSetOperations boundSetOps = redisTemplate.boundSetOps(key);
   /**
    * 绑定key
    */
BoundSetOperations boundSetOps = redisTemplate.boundSetOps("dataKey");
  /**
   * 添加值
   */
boundSetOps .add("a","b","c");
  /**
   * 获取所有值
   */
Set members = boundSetOps.members();
/**
 * 操作zset
 */
BoundZSetOperations boundZSetOps = redisTemplate.boundZSetOps(key);
/**
 * 绑定key
 */
BoundZSetOperations boundZSetOps = redisTemplate.boundZSetOps("dataKey");
 /**
  * 添加值
  */
boundZSetOps .add("ldxdcxy1",1);
boundZSetOps .add("ldxdcxy2",2);
 /**
  * 获取绑定键的指定区间值
  */
 Set range = boundZSetOps.range(0, 1);
 /**
  * 删除一个Key
  */
  redisTemplate.delete("dataKey");
  /**
   * 删除多个Key - 可以是集合、数组、多参数
   */
 redisTemplate.delete(list);

opsFor 系列  和  bound 系列 的区别是什么?

答:通过以上操作可以发现:opsFor系列对同一个key有多次操作,比如:新增、修改,而bound 是直接将key和bound**Operations对象进行了绑定,后续直接通过boundHashOperations对象进行相关操作即可,写法简洁,不需要每次将key写出来

以上只是基本操作,如果需要更多操作,比如数字增加、递减等,可以进入RedisTemplate (Spring Data Redis 2.6.0 API)  查看

你可能感兴趣的:(spring,boot,redis,java)