目录
window下载地址windows版的redis下载地址


开启运行redis

redis简单使用
redis是键值对的形式,即设置一个值,就可以得到那个值,通过set和get值,若没有值则会输出nil(null)


keys *查看有多少个值被设置。
服务端启动的命令(启动redis的命令)
redis-server.exe redis.windows.conf
客户端启动命令
redis-cli.exe
导入依赖
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- 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

之前使用的redisTemplate

在使用RedisTemplate在库中都是以对象的形式,而在redis客服端中的操作是以字符串的形式
可以获取在客服端的操作值
- @SpringBootTest
- public class redisTest {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
- @Test
- public void test1(){
- ValueOperations
ops = stringRedisTemplate.opsForValue(); - System.out.println(ops.get("name"));
-
- }
- }
运行结果

RedisTemplate一对象作为key和value,内部对数据进行序列化
StringRedisTemplate以字符串作为key和value,与Redis客服端操作等效
客户端选择:jedis
导入
- <dependency>
- <groupId>jedis.clientsgroupId>
- <artifactId>jedisartifactId>
- dependency>
配置客服端
- spring:
- redis:
- client-type: jedis
- host: localhost
- port: 6379
jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池是每个连接专用,这样整体性能就大受影响。
lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全,所以一个连接可以被多线程复用,当lettcus也支持多连接示例一起工作。

缓存是一种介于数据永久存储介质数据应用之间的数据临时存储介质
使用缓存可以有效的较少低速读取过程的次数(如磁盘的IO),提高系统性能
缓存主要作用是减少访问数据库的次数,从而高效读取到数据且降低了数据库的压力
缓存也可以存储临时数据。
核心的代码
serviceImpl下
-
-
- @Service
- public class PersonServiceImpl extends ServiceImpl
implements PersonService { -
- @Autowired
- private PersonDao personDao;
-
- private HashMap
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下

控制台中

导入依赖
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-cacheartifactId>
- 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);
- }
运行之后也是可以得到一次结果
