目录
Redis简介
window下载地址windows版的redis下载地址
开启运行redis
redis简单使用
redis是键值对的形式,即设置一个值,就可以得到那个值,通过set和get值,若没有值则会输出nil(null)
keys *查看有多少个值被设置。
服务端启动的命令(启动redis的命令)
redis-server.exe redis.windows.conf
客户端启动命令
redis-cli.exe
springboot整合redis
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
test类下
@SpringBootTest
class SpringbootNosqlApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void setOne() {
ValueOperations ops = redisTemplate.opsForValue();
ops.set("name1", "zhangsan");
}
@Test
void getOne() {
ValueOperations ops = redisTemplate.opsForValue();
System.out.println(ops.get("name1"));
}
}
运行结果
测试hash数据
@Test
void hsetOne() {
HashOperations ops =redisTemplate.opsForHash();
ops.put("kc","a1","aa");
}
@Test
void hgetOne() {
HashOperations ops = redisTemplate.opsForHash();
System.out.println(ops.get("kc","a1"));
}
小结:
RedisTemplate提供操作各种数据存储类型的接口API
redis的存在形式
之前使用的redisTemplate
在使用RedisTemplate在库中都是以对象的形式,而在redis客服端中的操作是以字符串的形式
可以获取在客服端的操作值
@SpringBootTest
public class redisTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void test1(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
System.out.println(ops.get("name"));
}
}
运行结果
RedisTemplate一对象作为key和value,内部对数据进行序列化
StringRedisTemplate以字符串作为key和value,与Redis客服端操作等效
springboot操作redis实现技术切换
- jedis
- lettuce(默认)
客户端选择:jedis
导入
<dependency>
<groupId>jedis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置客服端
spring:
redis:
client-type: jedis
host: localhost
port: 6379
lettcus(默认)与jedis区别
jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池是每个连接专用,这样整体性能就大受影响。
lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全,所以一个连接可以被多线程复用,当lettcus也支持多连接示例一起工作。
整合第三方技术
缓存的简单介绍
缓存是一种介于数据永久存储介质数据应用之间的数据临时存储介质
使用缓存可以有效的较少低速读取过程的次数(如磁盘的IO),提高系统性能
缓存主要作用是减少访问数据库的次数,从而高效读取到数据且降低了数据库的压力
缓存也可以存储临时数据。
简易的自定义缓存
核心的代码
serviceImpl下
@Service
public class PersonServiceImpl extends ServiceImpl<PersonDao, Person> implements PersonService {
@Autowired
private PersonDao personDao;
private HashMap<Integer,Person> catchMess=new HashMap<>();
@Override
public Person getById(Integer id){
Person person = catchMess.get(id);
//如果当前缓存中没有本次数据,则进行查询,否则直接返回
if(person==null){
System.out.println("新的查询");
Person queryPerson = personDao.selectById(id);
catchMess.put(id, queryPerson);
return queryPerson;
}
System.out.println("已经存在,不查询");
return person;
}
}
controller下
@RestController
@RequestMapping("/persons")
public class PersonController {
@Autowired
private PersonService personService;
@GetMapping("/{id}")
public Person testById(@PathVariable int id){
return personService.getById(id);
}
}
Postman下
控制台中
SpringBoot中的缓存
导入依赖
<!-- 导入缓存对应的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
启动类中开启缓存
@SpringBootApplication
@MapperScan( basePackages = "com.dao")//扫描dao的包,扫描到mapper
@EnableCaching//启用缓存
public class SpringbootCatchTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootCatchTestApplication.class, args);
}
}
在要测试的方法中
@Override
@Cacheable(value = "cacheSpace",key = "#id")//value是起的名字,key表示以什么关键字存储
public Person getById(Integer id){
return personDao.selectById(id);
}
运行之后也是可以得到一次结果