微信公众号:一个优秀的废人。若有问题,请后台留言,反正我也不会听。前端
两个月没更新原创了,实在惭愧。没有借口,就是由于本身懒了。最近看了「刻意学习」,这本书谈的是学习与行动的关系,书中提到了「持续行动」 这个概念,意思就是:咱们要去实实在在地去作一些事情,并且是天天都作,才能称之为「持续行动」。看完这本书之后,我意识到我必需要作些什么,那就是写做。java
Redis 是一个开源的,基于内存的键值数据存储,用做数据库,缓存和消息代理。在实现方面,Key-Value 存储表明 NoSQL 空间中最大和最老的成员之一。Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。 在 spring data redis 的框架,能够很容易地编写,经过提供一个抽象的数据存储使用 Redis 的键值存储的 Spring 应用程序。 非关系型数据库,基于内存,存取数据的速度不是关系型数据库所能比拟的 redis 是键值对 (key-value) 的数据库mysql
其中,由于SpringBoot 约定大于配置的特色,只要咱们加入了 spring-data-redis 依赖包并配置 Redis 数据库,SpringBoot 就会帮咱们自动配置一个 RedisTemplate ,利用它咱们就能够按照如下方式操做对应的数据类型,在下面实战中我将会对这五种数据进行操做。git
关于如何安装 Redis 这里再也不赘述,请自行搜索引擎搜索解决。github
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
复制代码
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update #ddl-auto:设为 create 表示每次都从新建表
show-sql: true
redis:
host: localhost
port: 6379
# Redis数据库索引(默认为0)
database: 1
jedis:
pool:
#链接池最大链接数
max-active: 8
#最小空闲链接
min-idle: 0
#最大阻塞等待时间,负值表示没有限制
max-wait: -1ms
#最大空闲链接
max-idle: 8
#链接超时时间(毫秒)
timeout: 20ms
# 无密码可不写
# password:
复制代码
/** * 添加字符串 */
@Test
public void setString(){
redisTemplate.opsForValue().set(USERKEY,"nasus");
redisTemplate.opsForValue().set(AGEKEY,24);
redisTemplate.opsForValue().set(CITYKEY,"清远");
}
复制代码
首先是添加字符串类型的数据。它的运行结果以下: redis
咱们能够看到插入的数据是乱码的,这是由于 SpringBoot 自动配置的这个 RedisTemplate 是没有设置数据读取时的 key 及 value 的序列化方式的。因此,咱们要写一个本身的 RedisTemplate 并设置 key 及 value 的序列化方式才能够正常操做 Redis。以下:算法
@Configuration
public class RedisConfig {
private final RedisTemplate redisTemplate;
@Autowired
public RedisConfig(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Bean
@SuppressWarnings("unchecked")
public RedisTemplate<String, Object> redisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
//RedisSerializer<Object> jsonString = new GenericToStringSerializer<>(Object.class);
RedisSerializer<Object> jsonString = new FastJsonRedisSerializer<>(Object.class);
// String 的 key 和 hash 的 key 都采用 String 的序列化方式
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
// value 都采用 fastjson 的序列化方式
redisTemplate.setValueSerializer(jsonString);
redisTemplate.setHashValueSerializer(jsonString);
return redisTemplate;
}
}
复制代码
这时,再次运行上面的单元测试,结果就正常了。spring
/** * 添加、获取LIST */
@Test
public void setList(){
List<Student> students = studentService.findStudentList();
log.info("students size = {}", students.size());
//循环向 studentList 左添加值
students.forEach(value->redisTemplate.opsForList().leftPush(LISTKEY,value));
//向 studentList 右添加值
Student student = new Student();
student.setId(10);
student.setAge(24);
student.setName("rightPush");
redisTemplate.opsForList().rightPush(LISTKEY,student);
// 获取值
log.info("studentList->{}",redisTemplate.opsForList().range(LISTKEY,0,10));
}
复制代码
这里须要说一下,leftpush 和 rightpush 的区别,前者是在 key 对应 list 的头部添加元素,也就是咱们常说的后来居上,List 下标最大的元素在这个 list 里面处于第一位;然后者则是 在 key 对应 list 的尾部添加元素,恰好和前者相反。sql
获取值,代码这里获取的是 0 到 10 行的数据,控制台打印结果:数据库
[{"name":"优秀","id":9,"age":22}, {"name":"冯某华","id":8,"age":25}, {"name":"蓝某城","id":7,"age":25}, {"name":"优秀","id":6,"age":22}, {"name":"冯某华","id":5,"age":25}, {"name":"蓝某城","id":4,"age":25}, {"name":"冯某华","id":3,"age":25}, {"name":"蓝某城","id":2,"age":25}, {"name":"废人","id":1,"age":22}, {"name":"rightPush","id":10,"age":24}]
复制代码
添加 List 结果:
这里注意 1 到 9 行的 id 值恰好是相反的,而正常状况下,我从 mysql 数据中查出来的值是这样的:
/**
* 添加和获取Set
*/
@Test
public void setAndGetSet(){
List<String> usernameList = new ArrayList<>();
usernameList.add("nasus");
usernameList.add("nasus");
usernameList.add("一个优秀的废人");
//循环向添加值
usernameList.forEach(value->redisTemplate.opsForSet().add(SETKEY,value));
log.info("取出usernameSet->{}",redisTemplate.opsForSet().members(SETKEY));
}
/**
* 删除 Set
*/
@Test
public void delSet(){
redisTemplate.opsForSet().remove(SETKEY,"nasus");
}
复制代码
Redis 的 set 数据结构跟 java 的 hashset 数据结构同样,也是无序且不重复。因此我代码里 add 了两个 nasus 字符串,其实只 add 了一个 nasus 。结果以下:
分别做了 hash 的添加、删除以及获取,代码以下:这里须要说明一下的是,hash 的 hash 有两个键能够设置,其中第一个是 redis 中的键,而第二个是具体每条数据的 hashkey。
/**
* 添加 hash
*/
@Test
public void setHash(){
List<Student> students = studentService.findStudentList();
//添加
for (Student student : students){
redisTemplate.opsForHash().put(HASHKEY, student.getId().toString(), student);
}
}
/**
* 删除 hash
*/
@Test
public void delHash(){
Student student = studentService.findStudentById(0);
// 删除
redisTemplate.opsForHash().delete(HASHKEY,JSON.toJSONString(student));
}
/**
* 获取 Hash
*/
@Test
public void getHash(){
List<Student> students = redisTemplate.opsForHash().values(HASHKEY);
log.info("values = {}", students);
}
复制代码
添加 hash 操做结果:
获取 hash 操做结果:
若是本文对你哪怕有一丁点帮助,请帮忙点好看。你的好看是我坚持写做的动力。 另外,关注以后在发送 1024 可领取免费学习资料。
资料详情请看这篇旧文:Python、C++、Java、Linux、Go、前端、算法资料分享