Redis 入门

  1. Redis 在windows环境中启动服务器命令(在Redis文件夹中启动命令行窗口):
1
redis-server.exe redis.windows.conf
  1. Redis 在windows环境启动客服端命令(在Redis文件夹中启动命令行窗口):
1
redis-cli.exe -h localhost -p 6379 -a 123456

-h 后面跟服务器IP地址

-p 后面跟端口号

-a 后面跟密码

常用数据类型

Redis 存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型

字符串 String:普通字符串,Redis中最简单的数据类型

哈希 hash:散列,类似于Java中的HashMap结构

列表 list概念:按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList

集合 set:无序集合,没有重复元素,类似于Java中的HashSet

有序集合 sorted set / zset:集合中每一个元素关联一个分数,根据分数升序排序,没有重复元素

常用命令

字符串操作命令

  • SET key value:设置指定key的值
  • GET key:获取指定key的值
  • SETEX key seconds value:设置指定key的值,并将key的过期时间设为seconds秒
  • SETNX key value:只有在key不存在时设置key的值

哈希操作命令

  • HSET key field value:将哈希表 key 中的字段 field 的值设为 value
  • HGET key field:获取存储在哈希表中指定字段的值
  • HDEL key field:删除存储再哈希表中的指定字段
  • HKEYS key:获取哈希表中所有字段
  • HVALS key:获取哈希表中所有值

列表操作命令

  • LPUSH key value1 [value2]:将一个或多个值插入到列表头部
  • LRANGE key start stop:获取列表指定范围内的元素(左右下标元素都包含)
  • RPOP key:移除并获取列表最后一个元素
  • LLEN key:获取列表长度

集合操作命令

  • SADD key member1 [member2]:向集合添加一个或多个成员
  • SMEMBERS key:返回集合中的所有成员
  • SCARD key:获取集合的成员数
  • SINTER key1 [key2]:返回给定所有集合的交集
  • SUNION key1 [key2]:返回所有给定集合的并集
  • SREM key member1 [member2]:删除集合中一个或多个成员

有序集合操作命令

Redis有序集合是String类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数

  • ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member:有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member …]:移除有序集合中的一个或多个成员

通用命令

下列命令部分数据类型,都可以使用:

  • KEYS pattern:查找所有复合给定模式(pattern)的key
  • EXISTS key:检查给定key是否存在
  • TYPE key:返回key所存储的值的类型
  • DEL key:该命令用于在key存在是删除key

在Java中操作Redis

Redis 的 Java 客户端

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用 Spring Data Redis 来简化操作

Spring Data Redis 使用方式

步骤

  • 导入Spring Data Redis的Maven坐标
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 配置Redis数据源
1
2
3
4
5
6
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 10
  • 编写配置类,创建RedisTemplate对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.sky.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* @author 奥数定理
* @version 1.0
*/
@Slf4j
@Configuration
@SuppressWarnings({"all"})
public class RedisConfiguration {

/**
* 返回RedisTemplate对象,并将其交给IOC容器管理
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
log.info("配置Redis模板对象");
RedisTemplate redisTemplate = new RedisTemplate();
// 设置redis连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置redis key序列化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}

}

  • 通过RedisTemplate对象操作Redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package com.sky;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
* @author 奥数定理
* @version 1.0
*/
@SpringBootTest
public class SpringDataRedisTest {

@Autowired
private RedisTemplate redisTemplate;

@Test
public void redisTest() {
System.out.println(redisTemplate);
// valueOperations 用来操作字符串类型的数据
ValueOperations valueOperations = redisTemplate.opsForValue();
// hashOperations 用来操作哈希类型的数据
HashOperations hashOperations = redisTemplate.opsForHash();
// listOperations 用来操作列表类型的数据
ListOperations listOperations = redisTemplate.opsForList();
// setOperations 用来操作集合类型的数据
SetOperations setOperations = redisTemplate.opsForSet();
// zSetOperations 用来操作有序集合类型的数据
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}

// 操作字符串数据
@Test
public void testString() {
ValueOperations valueOperations = redisTemplate.opsForValue();
// set key value
valueOperations.set("name", "zhangsan");
// get key
String value = (String) valueOperations.get("name");
System.out.println(value);
// setex key seconds value
valueOperations.set("age", 22, 10, TimeUnit.SECONDS);
// setnx key value
valueOperations.setIfAbsent("sex", "男");
}

// 操作哈希数据
@Test
public void testHash() {
HashOperations hashOperations = redisTemplate.opsForHash();
// HSET key field value
hashOperations.put("100", "name", "lisi");
hashOperations.put("100", "age", "22");
// HGET key field
String name = (String) hashOperations.get("100", "name");
System.out.println(name);
// HKEYS key
Set keys = hashOperations.keys("100");
System.out.println(keys);
// HVALUES key
List values = hashOperations.values("100");
System.out.println(values);
// HDEL key field
hashOperations.delete("100", "age");
}

// 操作列表数据
@Test
public void testList() {
ListOperations listOperations = redisTemplate.opsForList();
// LPUSH key value1 [value2]
listOperations.leftPushAll("mylist", "a", "b", "c");
listOperations.leftPush("mylist", "d");

// LRAGE key start end
List mylist = listOperations.range("mylist", 0, -1);// 表示取所有列表元素
System.out.println(mylist);

// RPOP key
listOperations.rightPop("mylist");

// LLEN key
System.out.println(listOperations.size("mylist"));
}

// 操作集合数据
@Test
public void testSet() {
SetOperations setOperations = redisTemplate.opsForSet();
// SADD key member1 [member2]
setOperations.add("set1", "a", "b", "c", "d");
setOperations.add("set2", "a", "b", "x", "y");
// SMEMBERS key
Set set1 = setOperations.members("set1");
System.out.println(set1);
// SCARD key
System.out.println(setOperations.size("set1"));
// SINTER key1 [key2]
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
// SUNION key1 [key2]
Set union = setOperations.union("set1", "set2");
System.out.println(union);
// SREM key member1 [member2]
setOperations.remove("set1", "c", "d");
}

// 操作有序集合
@Test
public void testZSet() {
ZSetOperations zSetOperations = redisTemplate.opsForZSet();

// ZADD key score1 member1 [score2 member2]
zSetOperations.add("zset1", "a", 10);
zSetOperations.add("zset1", "b", 9);
zSetOperations.add("zset1", "c", 12);

// ZRAGE key start end
System.out.println(zSetOperations.range("zset1", 0, -1)); // 获取有序集合中所有的元素

// ZINCRBY key increment member
zSetOperations.incrementScore("zset1", "c", 10);

//ZREM key member1 [member2]
zSetOperations.remove("zset1", "a", "b");
}

// 通用命令
@Test
public void testCommon() {
// KEYS pattern
Set keys = redisTemplate.keys("*");
System.out.println(keys);

// EXISTS key
Boolean mylist = redisTemplate.hasKey("mylist");
Boolean set1 = redisTemplate.hasKey("set1");

// TYPE key
for (Object key : keys) {
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}

// DEL key
redisTemplate.delete("mylist");
}
}

Spring Cache

  1. 概念:Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
  2. Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
  • EHCache
  • Caffeine
  • Redis
  1. 相关信息
  • 导入Maven依赖配置
1
2
3
4
5
<dependency>
<groupId>org. springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>
  • 常用注解(后三个注解一般用在控制层方法上)
说明 注解
开启缓存注解功能,通常加在启动类上 @EnableCaching
在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 @Cacheable
将方法的返回值放到缓存中 @CachePut
将一条或多条数据从缓荏中删除 @CacheEvict****
  • @CachePut(cacheNames = “userCahe” , key = “#user.id”) // 使用Spring Cache缓存数据,key的生成为:userCache::1

#user.id 是SrpingEL语言,其中user是方法中的参数,id则是该对象的id属性,生成的key中后面的1就是其对应的值

  • @Cacheable(cacheNames = “userCahe” , key = “#id”) // 使用Spring Cache缓存数据,key的生成为:userCache::1

#user.id 是SrpingEL语言,其中id是方法中的参数,生成的key中后面的1就是其对应的值

  • @CacheEvict(cacheName = “userCache”, key = “#id”) // 使用Spring Cache缓存数据,key的生成为:userCache::1
  • @CacheEvict(cacheName = “userCache”, allEntries = true) 该注解则是删除所有以userCache开头的key