本文在: 四.spring boot 项目多环境设置,日志设置 上实现
代码地址:spring-boot-demo-profiles
在pom.xml中引入访问数据库需要依赖
org.springframework.boot
spring-boot-starter-data-redis
在多环境配置文件yml中加入不同环境的redis地址
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
为什么使用 Jackson2JsonRedisSerializer 而不是 GenericJackson2JsonRedisSerializer 作为序列化执行器?
答:在百度搜索Jackson2JsonRedisSerializer 和 GenericJackson2JsonRedisSerializer的区别,又很多大神对两者进行了比较。
使用Stringredistemplate 可以解决序列化,为什么还要对RedisTemplate进行序列化了?
答:StringRedisSerializer的泛型指定的是String,主要是存储字符串的,不能存对象,如果你项目都是字符串存储可考虑用StringRedisTemplate。对RedisTemplate序列化让对象(包含字符串)具有了可读性。
redis 常用操作语句
/** * 操作字符串 */ 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);
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) 查看