一、基础环境
- 首先在pom.xml中导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下(其实就是对应五大常用数据类型):
- ValueOperations:简单K-V操作 -String类型
- SetOperations:set类型数据操作 -无序集合set类型
- ZSetOperations:zset类型数据操作 -有序集合set类型
- HashOperations:针对map类型的数据操作 -哈希类型
- ListOperations:针对list类型的数据操作 -list类型
- 配置application.yml文件
spring:
application:
name: springdataredis_demo
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456
database: 0 #操作的是0号数据库
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
这里的database默认操作0号数据库,Redis为我们默认提供了16个数据库。具体看配置文件redis.windows.conf
二、序列设置及操作常用五大类类型
1. 操作String类型数据
redisTemplate由Spring管理且在我们没有配置该类可以被直接注入。
redisTemplate为我们提供了opsForxxx方法 对应五种常用类型,直接set即可
如 HashOperations hashOperations = redisTemplate.opsForHash();
redisTemplate.opsForHash()得到的类型为HashOperations
其他的opsForxxx也同样对应五大常用数据类型。
@Test
public void testString(){
redisTemplate.opsForValue().set("city","beijing");
}
在直接set之后,我们发现Redis数据库中并不存在city 而是:
这里是由于redisTemplate在往Redis数据库存入的时候进行了序列化,这里需要我们重新设置序列化器保证key不被序列化
/**
* Redis配置类
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的Key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
RedisTemplate在由Spring管理有条件(如果我们没有配置该类则调用Spring所提供的RedisTemplate),由于在存入时RedisTemplate会将我们存入的key进行序列化(默认序列化器为:JdkSerializationRedisSerializer),所以我们需要配置新的序列化器保证存入key不被序列化,这时我们@Autowired自动注入进来的是我们所写的配置类
配置完成后,key可以被正常查出来,但是发现value也被序列化了,这里就不需要管了,因为在我们客户端查询它还会被反序列化出来
2. 操作hash类数据
操作hash数据对应的是redisTemplate.opsForHash()方法,返回值是hashOperations类型
hashOperations.put 为存值 --相当于命令行中 hset
hashOperations.get 为取值 --相当于命令行中 hget
hashOperations.keys 为获取所有字段(key值) --相当于命令行中 hkeys
hashOperations.values 为获取hash结构的所有值(value值) --相当于命令函中的hvals
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//存值
hashOperations.put("002","name","xiaoming");
hashOperations.put("002","age","20");
hashOperations.put("002","address","bj");
//取值
String age = (String) hashOperations.get("002", "age");
System.out.println(age);
//获得hash结构中的所有字段
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
//获得hash结构中的所有值
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
}
3. 操作list类型数据
操作list数据是redisTemplate.opsForList()方法,返回类型是ListOperations
listOperations.leftPush为存值(只存一个),listOperations.leftPushAll为存值(存多个) --lpush
listOperations.range为取值 --相当于命令行lrange
listOperations.size为获取长度 --相当于命令行llen
listOperations.rightPop为移除最后一个元素 --相当于命令行rpop
/**
* 操作List类型的数据
*/
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//存值
listOperations.leftPush("mylist","a");
listOperations.leftPushAll("mylist","b","c","d");
//取值
List<String> mylist = listOperations.range("mylist", 0, -1);
for (String value : mylist) {
System.out.println(value); // d c b a
}
//获得列表长度 llen
Long size = listOperations.size("mylist");
int lSize = size.intValue();
for (int i = 0; i < lSize; i++) {
//出队列
String element = (String) listOperations.rightPop("mylist");
System.out.println(element); // a b c d
}
}
4. 操作set类型数据(无序、不可重复)
操作set类型数据是redisTemplate.opsForSet(),返回类型为SetOperations
setOperations.add是存值,可以存一个或多个。 --对应命令行sadd
setOperations.members是取值。 --对应命令行为smembers
setOperations.remove是删除成员。 --对应命令行srem
/**
* 操作Set类型的数据
*/
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("myset","a","b","c","a");
//取值
Set<String> myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
//删除成员
setOperations.remove("myset","a","b");
//取值
myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
}
5. 操作zset类型数据(有序)
操作zset类型的是redisTemplate.opsForZSet(),返回类型ZSetOperations
zSetOperations.add 存值 --zadd
zSetOperations.range 取值 --zrange
zSetOperations.remove 删除成员 --zrem
/**
* 操作ZSet类型的数据
*/
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("myZset","a",10.0);
zSetOperations.add("myZset","b",11.0);
zSetOperations.add("myZset","c",12.0);
zSetOperations.add("myZset","a",13.0);
//取值
Set<String> myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//修改分数
zSetOperations.incrementScore("myZset","b",20.0);
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//删除成员
zSetOperations.remove("myZset","a","b");
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
}
6.操作通用命令(针对不同的类型都可以操作)
redisTemplate.keys(“*”)获取数据库所有的key字段 --keys *
redisTemplate.hasKey判断key值是否存在 --exists (key)
redisTemplate.delete删除key – del (key)
redisTemplate.type获取指定key的类型 --type(key) 这里返回的为DataType类型,dataType.name()为其类型所对应名称
/**
* 通用操作,针对不同的数据类型都可以操作
*/
@Test
public void testCommon(){
//获取Redis中所有的key
Set<String> keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
//判断某个key是否存在
Boolean itcast = redisTemplate.hasKey("itcast");
System.out.println(itcast);
//删除指定key
redisTemplate.delete("myZset");
//获取指定key对应的value的数据类型
DataType dataType = redisTemplate.type("myset");
System.out.println(dataType.name());
}