亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

SpringBoot 實戰(zhàn) (二十)| 整合 Redis

kevin / 2629人閱讀

摘要:前言兩個月沒更新原創(chuàng)了,實在慚愧。在實現(xiàn)方面,存儲代表空間中最大和最老的成員之一。支持數(shù)據(jù)結(jié)構(gòu),如字符串,散列,列表,集和帶范圍查詢的有序集。所以我代碼里了兩個字符串,其實只了一個。另外,關(guān)注之后在發(fā)送可領(lǐng)取免費學習資料。

微信公眾號:一個優(yōu)秀的廢人。如有問題,請后臺留言,反正我也不會聽。

前言

兩個月沒更新原創(chuàng)了,實在慚愧。沒有借口,就是因為自己懶了。最近看了「刻意學習」,這本書談的是學習與行動的關(guān)系,書中提到了「持續(xù)行動」 這個概念,意思就是:我們要去實實在在地去做一些事情,而且是每天都做,才能稱之為「持續(xù)行動」??赐赀@本書以后,我意識到我必須要做些什么,那就是寫作。

Redis 簡介
Redis 是一個開源的,基于內(nèi)存的鍵值數(shù)據(jù)存儲,用作數(shù)據(jù)庫,緩存和消息代理。在實現(xiàn)方面,Key-Value 存儲代表 NoSQL 空間中最大和最老的成員之一。Redis 支持數(shù)據(jù)結(jié)構(gòu),如字符串,散列,列表,集和帶范圍查詢的有序集。
在 spring data redis 的框架,可以很容易地編寫,通過提供一個抽象的數(shù)據(jù)存儲使用 Redis 的鍵值存儲的 Spring 應用程序。
非關(guān)系型數(shù)據(jù)庫,基于內(nèi)存,存取數(shù)據(jù)的速度不是關(guān)系型數(shù)據(jù)庫所能比擬的
redis 是鍵值對 (key-value) 的數(shù)據(jù)庫
數(shù)據(jù)類型

字符串類型 string

散列類型 hash

列表類型 list

集合類型 set

有序集合類型 zset

其中,因為SpringBoot 約定大于配置的特點,只要我們加入了 spring-data-redis 依賴包并配置 Redis 數(shù)據(jù)庫,SpringBoot 就會幫我們自動配置一個 RedisTemplate ,利用它我們就可以按照以下方式操作對應的數(shù)據(jù)類型,在下面實戰(zhàn)中我將會對這五種數(shù)據(jù)進行操作。

redisTemplate.opsForValue(); //操作字符串

redisTemplate.opsForHash(); //操作hash

redisTemplate.opsForList(); //操作list

redisTemplate.opsForSet(); //操作set

redisTemplate.opsForZSet(); //操作有序set

開發(fā)環(huán)境

SpringBoot 2.1.6 RELEASE

spring-data-redis 2.1.9 RELEASE

Redis 3.2

IDEA

JDK8

mysql

關(guān)于如何安裝 Redis 這里不再贅述,請自行搜索引擎搜索解決。

pom 依賴

        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
            mysql
            mysql-connector-java
            runtime
        
        
            org.projectlombok
            lombok
            true
        
        
        
            com.alibaba
            fastjson
            1.2.58
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
配置文件
spring:

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true
    username: root
    password: 123456

  jpa:
    hibernate:
      ddl-auto: update   #ddl-auto:設(shè)為 create 表示每次都重新建表
    show-sql: true

  redis:
    host: localhost
    port: 6379
    # Redis數(shù)據(jù)庫索引(默認為0)
    database: 1
    jedis:
      pool:
        #連接池最大連接數(shù)
        max-active: 8
        #最小空閑連接
        min-idle: 0
        #最大阻塞等待時間,負值表示沒有限制
        max-wait: -1ms
        #最大空閑連接
        max-idle: 8
    #連接超時時間(毫秒)
    timeout: 20ms
    # 無密碼可不寫
    # password:
為什么亂碼?
    /**
     * 添加字符串
     */
    @Test
    public void setString(){
        redisTemplate.opsForValue().set(USERKEY,"nasus");
        redisTemplate.opsForValue().set(AGEKEY,24);
        redisTemplate.opsForValue().set(CITYKEY,"清遠");
    }

首先是添加字符串類型的數(shù)據(jù)。它的運行結(jié)果如下:

如何解決亂碼

我們可以看到插入的數(shù)據(jù)是亂碼的,這是因為 SpringBoot 自動配置的這個 RedisTemplate 是沒有設(shè)置數(shù)據(jù)讀取時的 key 及 value 的序列化方式的。所以,我們要寫一個自己的 RedisTemplate 并設(shè)置 key 及 value 的序列化方式才可以正常操作 Redis。如下:

@Configuration
public class RedisConfig {

    private final RedisTemplate redisTemplate;

    @Autowired
    public RedisConfig(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Bean
    @SuppressWarnings("unchecked")
    public RedisTemplate redisTemplate() {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        //RedisSerializer jsonString = new GenericToStringSerializer<>(Object.class);
        RedisSerializer jsonString = new FastJsonRedisSerializer<>(Object.class);
        // String 的 key 和 hash 的 key 都采用 String 的序列化方式
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        // value 都采用 fastjson 的序列化方式
        redisTemplate.setValueSerializer(jsonString);
        redisTemplate.setHashValueSerializer(jsonString);
        return redisTemplate;
    }

}

這時,再次運行上面的單元測試,結(jié)果就正常了。

操作 List
    /**
     * 添加、獲取LIST
     */
    @Test
    public void setList(){
        List students = studentService.findStudentList();
        log.info("students size = {}", students.size());
        //循環(huán)向 studentList 左添加值
        students.forEach(value->redisTemplate.opsForList().leftPush(LISTKEY,value));
        //向 studentList 右添加值
        Student student = new Student();
        student.setId(10);
        student.setAge(24);
        student.setName("rightPush");
        redisTemplate.opsForList().rightPush(LISTKEY,student);
        // 獲取值
        log.info("studentList->{}",redisTemplate.opsForList().range(LISTKEY,0,10));
    }

這里需要說一下,leftpush 和 rightpush 的區(qū)別,前者是在 key 對應 list 的頭部添加元素,也就是我們常說的后來居上,List 下標最大的元素在這個 list 里面處于第一位;而后者則是 在 key 對應 list 的尾部添加元素,剛好和前者相反。

獲取值,代碼這里獲取的是 0 到 10 行的數(shù)據(jù),控制臺打印結(jié)果:

[{"name":"優(yōu)秀","id":9,"age":22}, {"name":"馮某華","id":8,"age":25}, {"name":"藍某城","id":7,"age":25}, {"name":"優(yōu)秀","id":6,"age":22}, {"name":"馮某華","id":5,"age":25}, {"name":"藍某城","id":4,"age":25}, {"name":"馮某華","id":3,"age":25}, {"name":"藍某城","id":2,"age":25}, {"name":"廢人","id":1,"age":22}, {"name":"rightPush","id":10,"age":24}]

添加 List 結(jié)果:

這里注意 1 到 9 行的 id 值剛好是相反的,而正常情況下,我從 mysql 數(shù)據(jù)中查出來的值是這樣的:

因此,驗證了 leftpush 和 rightpush 的區(qū)別。

操作 set
    /**
     * 添加和獲取Set
     */
    @Test
    public void setAndGetSet(){
        List usernameList = new ArrayList<>();
        usernameList.add("nasus");
        usernameList.add("nasus");
        usernameList.add("一個優(yōu)秀的廢人");
        //循環(huán)向添加值
        usernameList.forEach(value->redisTemplate.opsForSet().add(SETKEY,value));
        log.info("取出usernameSet->{}",redisTemplate.opsForSet().members(SETKEY));
    }

    /**
     * 刪除 Set
     */
    @Test
    public void delSet(){
        redisTemplate.opsForSet().remove(SETKEY,"nasus");
    }

Redis 的 set 數(shù)據(jù)結(jié)構(gòu)跟 java 的 hashset 數(shù)據(jù)結(jié)構(gòu)一樣,也是無序且不重復。所以我代碼里 add 了兩個 nasus 字符串,其實只 add 了一個 nasus 。結(jié)果如下:

操作 hash

分別作了 hash 的添加、刪除以及獲取,代碼如下:這里需要說明一下的是,hash 的 hash 有兩個鍵可以設(shè)置,其中第一個是 redis 中的鍵,而第二個是具體每條數(shù)據(jù)的 hashkey。

    /**
     * 添加 hash
     */
    @Test
    public void setHash(){
        List students = studentService.findStudentList();
        //添加
        for (Student student : students){
            redisTemplate.opsForHash().put(HASHKEY, student.getId().toString(), student);
        }
    }

    /**
     * 刪除 hash
     */
    @Test
    public void delHash(){
        Student student = studentService.findStudentById(0);
        // 刪除
        redisTemplate.opsForHash().delete(HASHKEY,JSON.toJSONString(student));
    }

    /**
     * 獲取 Hash
     */
    @Test
    public void getHash(){
        List students = redisTemplate.opsForHash().values(HASHKEY);
        log.info("values = {}", students);
    }

添加 hash 操作結(jié)果:

獲取 hash 操作結(jié)果:

源碼地址

https://github.com/turoDog/Demo/tree/master/springboot_redis_demo

推薦閱讀

SpringBoot | 自動配置原理

后語

如果本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫作的動力。
另外,關(guān)注之后在發(fā)送 1024 可領(lǐng)取免費學習資料。

資料詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/62116.html

相關(guān)文章

  • spring boot - 收藏集 - 掘金

    摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實戰(zhàn)六消息隊列篇掘金本文,講解如何集成,實現(xiàn)消息隊列。博客地址揭秘與實戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實現(xiàn)緩存。 Spring Boot 揭秘與實戰(zhàn)(九) 應用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<