Redis实现缓存功能

宋正兵 on 2020-10-21

Redis实现缓存功能

Redis的安装和启动

Redis是用C语言开发的一个高性能键值对数据库,可用于数据缓存,主要用于处理大量数据的高访问负载。

项目中整合Redis

添加项目依赖

1
2
3
4
5
<!--redis依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

修改SpringBoot配置文件

在application.yml中添加Redis的配置及Redis中自定义key的配置

在spring节点下添加Redis的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
redis:
# Redis服务器地址
host: localhost
# Redis数据库索引(默认为0)
database: 0
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
jedis:
pool:
# 连接池最大连接数
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间
timeout: 3000ms

在根节点下添加Redis自定义key的配置

1
2
3
4
5
6
7
8
# 自定义redis key
redis:
key:
prefix:
authCode: "portal:authCode:"
expire:
# 验证码超期时间
authCode: 120

注入StringRedisTemplate,实现RedisService接口

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
/**
* redis操作Service的实现类
* Create By songzb on 2020/10/21
*/
@Service
public class RedisServiceImpl implements RedisService {

@Autowired
private StringRedisTemplate stringRedisTemplate;

/**
* 存储数据
*/
@Override
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}

/**
* 获取数据
*/
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}

/**
* 设置超期时间
*/
@Override
public boolean expire(String key, long expire) {
return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
}

/**
* 删除数据
*/
@Override
public void remove(String key) {
stringRedisTemplate.delete(key);
}

/**
* 自增操作
* @param delta 自增步长
*/
@Override
public Long increment(String key, long delta) {
return stringRedisTemplate.opsForValue().increment(key, delta);
}
}

StringRedisTemplate与RedisTemplate的区别

  • 两者的关系是StringRedisTemplate继承RedisTemplate
  • 两者的数据是不共通的
  • 区别主要在于所使用的的序列化类:
    • StringRedisTemplate使用的是StringRedisSerializer
    • RedisTemplate使用的是JdkSerializationRedisSerializer,存入数据会将数据先序列化成字节数组然后再存入Redis数据库
  • 使用时注意事项:
    • 当Redis数据库里面本来存的是字符串数据或者要存取的数据就是字符串类型数据的时候,那么使用StringRedisTemplate即可
    • 如果数据是复杂的对象类型,而取出的时候又不想做任何的数据类型转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择
  • RedisTemplate使用时常见问题:RedisTemplate中存取的数据都是字节数组,当Redis中存入的数据时可读形式而非字节数组时,使用RedisTemplate取值的时候会无法获取导出数据,获得的值为null,可以使用StringRedisTemplate试试

RedisTemplate中定义了5种数据结构操作

1
2
3
4
5
redisTemplate.opsForValue(); // 操作字符串
redisTemplate.opsForHash(); // 操作hash
redisTemplate.opsForList(); // 操作list
redisTemplate.opsForSet(); // 操作set
redisTemplate.opsForzSet(); // 操作有序set

StringRedisTemplate常用操作

1
2
3
4
5
6
7
8
9
10
11
12
stringRedisTemplate.opsForValue().set("test", "100", 60*10, TimeUnit.SECONDS); // 向Redis里存入数据和设置缓存时间
stringRedisTemplate.boundValueOps("test").increment(-1); // val做-1操作
stringRedisTemplate.opsForValue().get("test"); // 根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(1); // val +1
stringRedisTemplate.getExpire("test"); // 根据key获取过期时间
stringRedisTemplate.getExpire("test", TimeUnit.SECONDS); // 根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test"); // 根据key删除缓存
stringRedisTemplate.hashKey("123"); // 检查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("read_123", "1","2","3"); // 向指定key中存放set集合
stringRedisTemplate.expire("read_123", 1000, TimeUnit.MILLISECCONDS); // 设置过期时间
stringRedisTemplate.opsForSet().isMember("read_123", "1"); // 根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("read_123"); // 根据key获取set集合

StringRedisTemplate的使用

SpringBoot中使用注解@AutoWired即可

1
2
@Autowired
public StringRedisTemplate stringRedisTemplate;

使用样例

1
2
3
4
5
6
7
@Service
public class RedisServiceImpl implements RedisService {
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}