hello world
Redis: 一个NoSQL数据库,常用做缓存使用(cache)
Redis的数据类型:string,hash,set,zset,list
Redis是一个中间件:是一个独立的服务器。
java中著名的客户端:jedis,lettuce,Redisson
Spring.SpringBoot 中有一个RedisTemplate和StringRedisTemplate,处理和redis交互。
RedisTemplate 使用的 lettuce 客户端库。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
springboot自动创建了RedisTemplate等放到了容器中
data-redis使用的是 lettuce客户端库
在程序中使用RedisTemplate 类的方法 操作redis数据,实际就是调用的lettuce客户端中的方法
src/main/resources/application.properties
server.port=9001
server.servlet.context-path=/myredis
# 指定redis (host,IP,password)
spring.redis.host=localhost
spring.redis.port=6379
#spring.redis.password=
package com.firewolf.controller;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class RedisController {
/**
* 注入RedisTemplate
*
* RedisTemplate 泛型
* RedisTemplate
* RedisTemplate
@Resource
private RedisTemplate redisTemplate;
// 添加数据到redis
@PostMapping("/redis/addstring")
public String addToRedis(String name,String value){
// 操作Redis中String类型的数据,先获取ValueOperations对象
ValueOperations valueOperations = redisTemplate.opsForValue();
// 添加数据到redis
valueOperations.set("myname","lisi");
return "向redis添加string类型的数据";
}
// 从redis获取数据
@GetMapping("/redis/getk")
public String getData(String k){
ValueOperations valueOperations = redisTemplate.opsForValue();
Object v = valueOperations.get(k);
return "key是"+k+",他的值是:"+v;
}
}
可以通过postman进行测试
http://localhost:9001/myredis/redis/addstring?name=myname&value=lisi
http://localhost:9001/myredis/redis/getk?k=myname
为什么post请求可以传get的params呢?
url传参无论是post和get都是可以的,只是post还多出了更多的数据传输通道,不受url长度限制。
存字符串类型的值会有乱码
127.0.0.1:6379> keys *
1) "stunum"
2) "\xac\xed\x00\x05t\x00\x06myname"
@Resource
private StringRedisTemplate stringRedisTemplate;
// 使用rest风格
@PostMapping("/redis/{k}/{v}")
public String addStringKV(@PathVariable String k,
@PathVariable String v){
// 使用StringRedisTemplate对象
stringRedisTemplate.opsForValue().set(k,v);
return "使用StringRedisTemplate对象";
}
@GetMapping("/redis/getstr/{k}")
public String getStringValue(@PathVariable String k){
String v = stringRedisTemplate.opsForValue().get(k);
return "k的value"+v;
}
向数据库传入数据
读取数据
StringRedisTemplate:把k,v都是作为String处理,使用的是String的序列化,可读性好。
RedisTemplate:把k,v经过了序列化存到redis。k,v是序列化的内容,不能直接识别。
RedisTemplate:默认使用的jdk序列化,可以修改为前提的序列化。
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
为什么需要序列化?
序列化的最终的目的是为了对象可以跨平台存储,和进行网络传输。
进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式是字节数组。
我们把对象转成字节数组需要一种规则,即序列化。
从IO流里面读出数据的时候再以这种规则把对象还原回来,即反序列化。
序列化的方式?
序列化的规则有多种:JDK(不支持跨语言\适用于规模下,没有高并发) \ JSON \ XML \ Hessian \ Kryo (java不支持跨语言) \ Thrift (meta公司)\ Protostuff
Java的序列化
把Java对象转为byte[],二进制数据。
Json的序列化
转化成json格式的对象{“name”:“李四”,“age”:18}
/***
* 设置 RedisTemplate 序列化
* 可以设置 key的序列化 , 可以设置value的序列化
* 可以同时设置 key和 value的序列化
* **/
@PostMapping("/redis/addstr")
public String addString(String k,String v){
// 使用RedisTemplate之前设置序列化
// 设置 key 使用String的序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置value的序列化
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set(k,v);
return "定义redisTemplate对象的key,value的序列化";
}
idea 快捷键 ctrl+h 打开hierarchy查看源码类的层级机构图
idea->setting->editor->inspections->Serialization issues
勾选Serializable class without a serialVersionUID field(生成序列化版本号)
在类名上alt+enter 第一项 add serialVersionUID
import java.io.Serializable;
//类名旁 alte+enter
public class Student implements Serializable {
private static final long serialVersionUID = 7751711337147644023L;
private Integer id;
private String name;
private Integer age;
/***
* 使用json 序列化 ,把java对象转为json存储
* **/
@PostMapping("/redis/addjson")
public String addJson(){
Student student = new Student();
student.setAge(19);
student.setId(1001);
student.setName("zhangsan");
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 把值作为json序列化
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
redisTemplate.opsForValue().set("mystudent",student);
return "json序列化";
}
@PostMapping("/redis/getjson")
public String getJson(){
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 把值作为json序列化
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
Object obj = redisTemplate.opsForValue().get("mystudent");
return "json反序列化"+obj;
}
redis_cil 客户端查库验证
127.0.0.1:6379> get mystudent
"{\"id\":1001,\"name\":\"zhangsan\",\"age\":19}"
springboot+redis部分结束,redis基础部分在redis专栏。
Know how to be grateful, know how to be grateful, people will become kind, tolerant and loving