最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Redis入門之緩存數(shù)據(jù)的方法

 更新時間:2021年11月17日 11:06:39   作者:花傷情猶在  
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API,下面通過本文給大家介紹下SpringBoot整合Redis入門之緩存數(shù)據(jù)的相關(guān)知識,感興趣的朋友一起看看吧

前言

Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。從2013年5月開始,Redis的開發(fā)由Pivotal贊助。

為什么要使用Redis呢?

舉個例子,假如系統(tǒng)中有2千萬用戶信息,用戶信息基本固定,一旦錄入很少變動,那么你每次加載所有用戶信息時,如果都要請求數(shù)據(jù)庫,數(shù)據(jù)庫編譯并執(zhí)行你的查詢語句,這樣效率就會低下很多,針對這種信息不經(jīng)常變動并且數(shù)據(jù)量。

較大的情況,通常做法,就是把他加入緩存,每次取數(shù)前先去判斷,如果緩存不為空,那么就從緩存取值,如果為空,再去請求數(shù)據(jù)庫,并將數(shù)據(jù)加入緩存,這樣大大提高系統(tǒng)訪問效率。


相關(guān)依賴

<!-- springboot版本 -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.7.RELEASE</version>
</parent>
<!-- 依賴 -->
<dependencies>
	<!-- redis -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
	<!-- 通用池 -->
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-pool2</artifactId>
	</dependency>
	<!-- mysql -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
	<!-- mybatis -->
		<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>2.1.1</version>
	</dependency>
	<!-- 通用mapper -->
	<dependency>
		<groupId>tk.mybatis</groupId>
		<artifactId>mapper-spring-boot-starter</artifactId>
		<version>2.1.5</version>
	</dependency>
	<!-- lombok -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>
	<!-- test -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
	</dependency>
</dependencies>

配置

# 端口
server:
  port: 9998
# mysql數(shù)據(jù)源
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/dbtest?serverTimezone=GMT%2B8
# redis
  redis:
    host: localhost
    port: 6379
    timeout: 1000
    jedis:
      pool:
        min-idle: 5
        max-idle: 10
        max-wait: -1
# mybatis
mybatis:
  mapper-locations: classpath:/mybatis/mapper/*.xml
  type-aliases-package: cn.kgc.entities
#  開啟駝峰命名
  configuration:
    map-underscore-to-camel-case: true
# log
logging:
  level:
    cn.kgc: debug

數(shù)據(jù)庫

#建表
CREATE TABLE `emp`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
#插入數(shù)據(jù)
INSERT INTO `emp` VALUES (1, '張三', 18);
INSERT INTO `emp` VALUES (2, '李四', 20);
INSERT INTO `emp` VALUES (3, '王五', 22);

實(shí)體類

Emp

@Data
@Table(name = "emp")
public class Emp implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Integer age;
}

RedisConfig

指定Redis序列化方式

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        // 指定kv的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

Mapper

Emp的Mapper接口繼承tk的Mapper類,泛型為實(shí)體類Emp

public interface EmpMapper extends Mapper<Emp> {

}

Service接口

業(yè)務(wù)接口定義add添加和getEmpById根據(jù)id查詢的方法

public interface EmpService {
    public void add(Emp emp);
    public Object getEmpById(Integer id);
}

Service實(shí)現(xiàn)類

先查Redis,Redis沒有數(shù)據(jù)再從數(shù)據(jù)庫中拿數(shù)據(jù),同時緩存到Redis中。

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {

    @Autowired
    public RedisTemplate redisTemplate;

    @Resource
    private EmpMapper empMapper;

    @Override
    public void add(Emp emp) {
        empMapper.insert(emp);
    }

    @Override
    public  Object getEmpById(Integer id) {
        // 先從緩存獲取數(shù)據(jù),如果有則直接返回
        //                   如果無,則查詢mysql,并將數(shù)據(jù)設(shè)置到緩存
        String key = "user:" + id;
        Object userObj = redisTemplate.opsForValue().get(key);
        if(userObj == null){
            synchronized (this.getClass()){
                userObj = redisTemplate.opsForValue().get(key);
                if(userObj == null ){
                    log.debug("----> 查詢數(shù)據(jù)庫..............");
                    // 查數(shù)據(jù)庫
                    Emp emp = empMapper.selectByPrimaryKey(id);
                    redisTemplate.opsForValue().set(key,emp);
                    return emp;
                }else{
                    log.debug("----> 查詢緩存(同步代碼塊)>>>>>>>>>>>>>>>>>");
                    return userObj;
                }
            }

        }else{
            log.debug("----> 查詢緩存>>>>>>>>>>>>>>>>>");
        }
        return userObj;
    }
}

測試Redis

Redis-Controller

@RestController
public class RedisContoller {
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/redis/get/{key}")
    public Object get(@PathVariable("key") String key){
       return  redisTemplate.opsForValue().get(key);
    }

    @PostMapping("/redis/set/{key}/{value}")
    public Object set(@PathVariable("key") String key,
                      @PathVariable("value") String value){
        redisTemplate.opsForValue().set(key,value);
        return "set success";
    }
}

Controller

Redis+MySQL

@RestController
public class EmpController {
    @Autowired
    private EmpService empService;

    @PostMapping("/emp")
    public String addEmp(Emp emp){
        empService.add(emp);
        return "add ok";
    }

    @GetMapping("/emp/{id}")
    public Object getEmpById(@PathVariable("id") Integer id){
        ExecutorService es = Executors.newFixedThreadPool(200);
        for(int i=0 ;i<500;i++){
            es.submit(new Runnable() {
                @Override
                public void run() {
                    empService.getEmpById(id);
                }
            });
        }
        return empService.getEmpById(id);
    }
}

到此這篇關(guān)于SpringBoot整合Redis入門之緩存數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis緩存數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用Redis作為Mybatis的二級緩存

    如何利用Redis作為Mybatis的二級緩存

    這篇文章主要介紹了如何利用Redis作為Mybatis的二級緩存,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • Redis教程(十一):虛擬內(nèi)存介紹

    Redis教程(十一):虛擬內(nèi)存介紹

    這篇文章主要介紹了Redis教程(十一):虛擬內(nèi)存介紹,本文講解了虛擬內(nèi)存簡介、應(yīng)用場景和配置方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Redisson延時隊(duì)列RedissonDelayed的具體使用

    Redisson延時隊(duì)列RedissonDelayed的具體使用

    定時調(diào)度基本是每個項(xiàng)目都會遇到的業(yè)務(wù)場景,一般地,都會通過任務(wù)調(diào)度工具執(zhí)行定時任務(wù)完成,但是會有一定的缺點(diǎn),本文主要介紹了Redisson延時隊(duì)列RedissonDelayed的具體使用,感興趣的可以了解一下
    2024-02-02
  • Redisson如何解決Redis分布式鎖提前釋放問題

    Redisson如何解決Redis分布式鎖提前釋放問題

    本文主要介紹了Redisson如何解決Redis分布式鎖提前釋放問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    這篇文章主要為大家介紹了Redis基本數(shù)據(jù)類型哈希Hash常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全

    redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全

    在Linux系統(tǒng)中我們經(jīng)常使用Redis作為高性能的緩存數(shù)據(jù)庫,然而有時候我們需要在系統(tǒng)中多個地方使用Redis命令,這就需要將Redis的全局命令設(shè)置好,這篇文章主要給大家介紹了關(guān)于redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Redis如何高效刪除大key

    Redis如何高效刪除大key

    這篇文章主要介紹了Redis如何高效刪除大key問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis的五種基本類型和業(yè)務(wù)場景和使用方式

    Redis的五種基本類型和業(yè)務(wù)場景和使用方式

    Redis是一種高性能的鍵值存儲數(shù)據(jù)庫,支持多種數(shù)據(jù)結(jié)構(gòu)如字符串、列表、集合、哈希表和有序集合等,它提供豐富的API和持久化功能,適用于緩存、消息隊(duì)列、排行榜等多種場景,Redis能夠?qū)崿F(xiàn)高速讀寫操作,尤其適合需要快速響應(yīng)的應(yīng)用
    2024-10-10
  • Redis sort 排序命令詳解

    Redis sort 排序命令詳解

    這篇文章主要介紹了Redis sort 排序命令詳解,本文講解了默認(rèn)排序命令、排序方式命令、BY語法、GET用法示例等內(nèi)容,需要的朋友可以參考下
    2015-07-07
  • Redis面試必會的題目

    Redis面試必會的題目

    這篇文章主要介紹了Redis面試必會的題目,幫助大家更好的理解和學(xué)習(xí)redis數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-08-08

最新評論

霞浦县| 许昌县| 长沙市| 中宁县| 新绛县| 望谟县| 永和县| 浠水县| 峨边| 临安市| 茶陵县| 华阴市| 张北县| 梅州市| 广平县| 观塘区| 阜新市| 湾仔区| 乌什县| 三明市| 泰宁县| 灌云县| 桃园县| 玉林市| 合山市| 高淳县| 和静县| 团风县| 房产| 清丰县| 安泽县| 广宁县| 遵化市| 宁远县| 高安市| 聂拉木县| 新龙县| 乐平市| 南投市| 呼伦贝尔市| 左云县|