• SpringBoot整合redis与缓存使用


    目录

    Redis简介

    springboot整合redis

    redis的存在形式

     springboot操作redis实现技术切换

    lettcus(默认)与jedis区别

    整合第三方技术

    缓存的简单介绍

    简易的自定义缓存

     SpringBoot中的缓存


    Redis简介

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

    开启运行redis 

    redis简单使用

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

    keys *查看有多少个值被设置。

    服务端启动的命令(启动redis的命令)

    redis-server.exe redis.windows.conf

    客户端启动命令

    redis-cli.exe

    springboot整合redis

    导入依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>

    test类下

    1. @SpringBootTest
    2. class SpringbootNosqlApplicationTests {
    3. @Autowired
    4. private RedisTemplate redisTemplate;
    5. @Test
    6. void setOne() {
    7. ValueOperations ops = redisTemplate.opsForValue();
    8. ops.set("name1", "zhangsan");
    9. }
    10. @Test
    11. void getOne() {
    12. ValueOperations ops = redisTemplate.opsForValue();
    13. System.out.println(ops.get("name1"));
    14. }
    15. }

     运行结果

     测试hash数据

    1. @Test
    2. void hsetOne() {
    3. HashOperations ops =redisTemplate.opsForHash();
    4. ops.put("kc","a1","aa");
    5. }
    6. @Test
    7. void hgetOne() {
    8. HashOperations ops = redisTemplate.opsForHash();
    9. System.out.println(ops.get("kc","a1"));
    10. }

    小结:

    RedisTemplate提供操作各种数据存储类型的接口API

    redis的存在形式

    之前使用的redisTemplate

    在使用RedisTemplate在库中都是以对象的形式,而在redis客服端中的操作是以字符串的形式

    可以获取在客服端的操作值

    1. @SpringBootTest
    2. public class redisTest {
    3. @Autowired
    4. private StringRedisTemplate stringRedisTemplate;
    5. @Test
    6. public void test1(){
    7. ValueOperations ops = stringRedisTemplate.opsForValue();
    8. System.out.println(ops.get("name"));
    9. }
    10. }

    运行结果 

     RedisTemplate一对象作为key和value,内部对数据进行序列化

    StringRedisTemplate以字符串作为key和value,与Redis客服端操作等效

     springboot操作redis实现技术切换

    • jedis
    • lettuce(默认)

     客户端选择:jedis

    导入

    1. <dependency>
    2. <groupId>jedis.clientsgroupId>
    3. <artifactId>jedisartifactId>
    4. dependency>

    配置客服端 

    1. spring:
    2. redis:
    3. client-type: jedis
    4. host: localhost
    5. port: 6379

    lettcus(默认)与jedis区别

    jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池是每个连接专用,这样整体性能就大受影响。

    lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全,所以一个连接可以被多线程复用,当lettcus也支持多连接示例一起工作。

    整合第三方技术

    缓存的简单介绍

     缓存是一种介于数据永久存储介质数据应用之间的数据临时存储介质

    使用缓存可以有效的较少低速读取过程的次数(如磁盘的IO),提高系统性能

    缓存主要作用是减少访问数据库的次数,从而高效读取到数据且降低了数据库的压力

    缓存也可以存储临时数据。

    简易的自定义缓存

    核心的代码

     serviceImpl下

    1. @Service
    2. public class PersonServiceImpl extends ServiceImpl implements PersonService {
    3. @Autowired
    4. private PersonDao personDao;
    5. private HashMap catchMess=new HashMap<>();
    6. @Override
    7. public Person getById(Integer id){
    8. Person person = catchMess.get(id);
    9. //如果当前缓存中没有本次数据,则进行查询,否则直接返回
    10. if(person==null){
    11. System.out.println("新的查询");
    12. Person queryPerson = personDao.selectById(id);
    13. catchMess.put(id, queryPerson);
    14. return queryPerson;
    15. }
    16. System.out.println("已经存在,不查询");
    17. return person;
    18. }
    19. }

    controller下 

    1. @RestController
    2. @RequestMapping("/persons")
    3. public class PersonController {
    4. @Autowired
    5. private PersonService personService;
    6. @GetMapping("/{id}")
    7. public Person testById(@PathVariable int id){
    8. return personService.getById(id);
    9. }
    10. }

     Postman下

     控制台中

     SpringBoot中的缓存

    导入依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-cacheartifactId>
    4. dependency>

    启动类中开启缓存

    1. @SpringBootApplication
    2. @MapperScan( basePackages = "com.dao")//扫描dao的包,扫描到mapper
    3. @EnableCaching//启用缓存
    4. public class SpringbootCatchTestApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(SpringbootCatchTestApplication.class, args);
    7. }
    8. }

    在要测试的方法中

    1. @Override
    2. @Cacheable(value = "cacheSpace",key = "#id")//value是起的名字,key表示以什么关键字存储
    3. public Person getById(Integer id){
    4. return personDao.selectById(id);
    5. }

    运行之后也是可以得到一次结果

  • 相关阅读:
    Mysql详细安装步骤
    专业翻译哪家强?插件AI来帮忙!
    气象数据库分析
    通过SIMULINK实现飞轮储能系统,对风力发电场的功率波动进行补偿,改善故障时的电压跌落并可以抑制母线电流谐波
    ChatGPT实战与私有化大模型落地
    SpringBoot如何自定义starter启动器?看这里
    大龄程序员副业及创业方向推荐
    y107.第六章 微服务、服务网格及Envoy实战 -- 可观测应用之指标和日志(十八)
    网络中特殊的 IP 地址
    百度文心一言与谷歌Gemini的对比
  • 原文地址:https://blog.csdn.net/weixin_60719453/article/details/127462355