SpringBoot下使用Redis进行缓存

1.Redis简单介绍

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。

2.Redis的特点

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

3.为什么要用Redis

当系统需要对数据进行操作时,会调用SQL语句,让数据库服务器对数据进行操作。在小规模的系统中,调用SQL语句次数少频率低,数据库服务器不会有什么大的问题。但是随着系统的规模越来越大,数据操作越来越频繁,数据库执行SQL语句的速度就会大幅度下降,严重影响操作的进度,数据库服务器甚至不堪重负直接挂了。为了缓解数据库服务器的压力,在系统与服务器之间建立一个缓冲区是很好的选择。当需要大量操作数据时,先对缓冲区的数据进行操作,然后缓冲区将响应的操作进行处理,再让数据库服务器执行,这样就减少了数据库服务器的压力,而Redis就是起到这个缓冲区的作用。下面用图来简单对比一下,如有不当欢迎斧正:
正常情况下是这样子的:

正常情况下

当数据操作变多了之后:
在这里插入图片描述

加入缓存:
在这里插入图片描述

Redis在分布式中尤其常用,这篇博文讲述得很好,戳我查阅

4.SpringBoot中Redis的简单应用

4.1在pom.xml文件中添加redis的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

4.2 修改application.properties

###########################redis#########################
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#Redis数据库索引(默认为0)
spring.redis.database=0
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=50
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=3000
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接超时时间(毫秒)
spring.redis.timeout=2000

4.3 编写POJO类

User类

package com.eknaij.springredis.pojo;

public class User {
    String occupation;
    String name;



    public String getOccupation() {
        return occupation;
    }

    public void setOccupation(String occupation) {
        this.occupation = occupation;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4.4 编写操作数据库的工具类

package com.eknaij.springredis.config;

import com.eknaij.springredis.pojo.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class Utils {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    Gson gson = new Gson();
    /**添加操作,一下三个分别为1.添加普通的String 2.添加对象作为value 3.添加列表作为value**/
    public void add(String key,String value){
        redisTemplate.opsForValue().set(key, value);
    }

    public void add(String key,User user){
        redisTemplate.opsForValue().set(key, gson.toJson(user));
    }

    public void addList(String key,List<User> userList){
        redisTemplate.opsForValue().set(key, gson.toJson(userList));
    }
    /**根据key进行删除**/
    public boolean deleteByKey(String key){
        return redisTemplate.opsForValue().getOperations().delete(key);
    }
    /**查询返回的是一个对象**/
    public User  getByKey(String key){
        Gson gson = new Gson();
        User user = null;
        String dataJson = redisTemplate.opsForValue().get(key);
        if(dataJson != null){
            user =  gson.fromJson(dataJson, User.class);
        }
        return user;
    }
    /**查询返回的是一个列表**/
    public List<User> getUserListByKey(String key){
        List<User> userList = null;
        String userJson = redisTemplate.opsForValue().get(key);
        if(userJson != null){
            userList =  gson.fromJson(userJson, new TypeToken<List<User>>(){}.getType());
        }
        return userList;
    }


}

4.5 编写service层

package com.eknaij.springredis.service;

import com.eknaij.springredis.config.Utils;
import com.eknaij.springredis.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserService  {
    @Autowired
    Utils redisUtils;
    public void redisInitData(){
        redisUtils.add("添加key","添加value");
        //测试添加对象
        User user =new User();
        user.setOccupation("医生");
        user.setName("小明");
        redisUtils.add(user.getOccupation(),user);
        //测试添加列表
        List<User> ls = new ArrayList();
        User user2 =new User();
        user2.setOccupation("列表里的对象1");
        user2.setName("列表里的对象11");
        User user3=new User();
        user3.setOccupation("列表里的对象2");
        user3.setName("列表里的对象22");
        ls.add(user2);
        ls.add(user3);
        redisUtils.addList("列表",ls);
    }
    public User getUserRedis(String key){
        User user = redisUtils.getByKey(key);
        return user;
    }
    public List<User> getUserList(String key){
        List ls = redisUtils.getUserListByKey(key);
        return ls;
    }
    public boolean deleteUserByKey(String key){
        return redisUtils.deleteByKey(key);
    }

}

4.6 编写Controller

package com.eknaij.springredis.controller;

import com.eknaij.springredis.pojo.User;
import com.eknaij.springredis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController

public class UserController {
    @Autowired
    UserService userService;

    //模拟添加数据
    @RequestMapping("/add")
    public String addRedisData(){
        userService.redisInitData();
        return "success";
    }
    @RequestMapping("/getUserByKey")
    public Map<String,Object> getUserRedisByKey(String key){
        Map<String,Object> result = new HashMap<String, Object>();
        User user = userService.getUserRedis(key);
        result.put("occupation",user.getOccupation());
        result.put("name", user.getName());
        return result;
    }

    @RequestMapping("/getUserList")
    public List getUserList(String key){
        List ls = userService.getUserList(key);
        return ls;
    }
    @RequestMapping("/deleteUserByKey")
    public String deleteUserByKey(String key){
        if(userService.deleteUserByKey(key))
            return "删除成功";
        return "删除失败";
    }

}

4.7 运行测试

浏览器输入http://localhost:8080/add 将数据添加到数据库中
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
工程目录:
在这里插入图片描述

5. 总结

简单整合了一下SpringBoot+Redis,整个过程比较简单,但是Redis的实际运用远远比这复杂得多,具体运用要根据具体的项目来决定。文中有不当的地方,欢迎大神斧正,共同学习共同进步。

相关源码下载地址,源码地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答问题。但是,需要说明的是,关于Spring BootRedis使用,需要具体的场景和需求,才能给出更加准确的答案。我可以为您提供一些参考资料和建议,供您参考: 首先,Spring Boot已经内置了对Redis的支持,它通过Spring Data Redis框架对Redis进行封装,提供了一系列的API来操作Redis中的数据。您可以通过在pom.xml文件中添加依赖,来引入Spring Data Redis: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,在application.properties或application.yml中配置Redis的连接信息。例如: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` 配置完成后,您就可以在代码中使用Redis了。例如: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; ``` 上面的代码中,首先通过@Autowired注解注入了一个RedisTemplate来操作Redis。然后,您可以使用RedisTemplate提供的方法来对Redis进行读写操作,例如: ``` redisTemplate.opsForValue().set("key", "value"); String value = (String) redisTemplate.opsForValue().get("key"); ``` 上面的代码中,首先使用opsForValue方法获取一个ValueOperations对象,然后通过set方法将键值对写入Redis。接着,通过get方法获取Redis中的值。 当然,在实际的应用场景中,您可能需要根据具体的需求来对Redis进行更加复杂的读写操作。例如,您可以使用Redis的hash数据结构来存储对象,使用Redis的list数据结构来实现消息队列等等。对于这些更加复杂的操作,可以参考Spring Data Redis官方文档或者其他相关的参考资料。 希望上面的回答能够为您提供一些帮助,如果您还有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值