目录

一、简介

什么是Redis

为什么要使用Redis

二、复习 常用Redis类型

1、string类型

1.1、string类型的介绍

1.2、string类型数据的基本操作 

2、hash类型(常用)

2.1、hash类型的介绍

2.2、hash类型的基本操作

3、list类型

3.1、list类型的基本概念

3.2、list类型的基本操作

4、set类型

4.1、set类型的基本介绍

4.2、set类型数据的基本操作

5、sorted_set (zset)

5.1、sorted_set概念

5.2、sorted_set基本操作

三、SpringBoot整合Redis

 引入依赖

配置yaml

 RedisTemplate模版序列化配置

Redis的Demo案例


一、简介

什么是Redis

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

为什么要使用Redis

在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:

  1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
  2. 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
  3. 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
  4. 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低

为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。

二、复习 常用Redis类型

主要是springBoot对Redis的整合,所以在介绍类型使用的时候只展示增删改查。

  • string
  • hash
  • list
  • set
  • sorted_set

1、string类型

1.1、string类型的介绍

存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型

存储数据的格式:一个存储空间保存一个数据

存储内容:通常使用字符串,如果字符串以整形的形式展示,可作为数字操作使用

1.2、string类型数据的基本操作 

  •  添加/修改数据

                set  key  value

  • 获取数据

                get key

  • 删除

               del key  

2、hash类型(常用)

2.1、hash类型的介绍

新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。

需要的存储结构:一个存储空间保存多个键值对数据

hash类型:底层使用哈希表结构实现数据存储

2.2、hash类型的基本操作

  • 添加/修改数据 

                 hset  key   field  value

                        eg:hset   user  name zhansgan

                        eg:hset  user   age  38

  • 获取数据

                hget    key    field

  • 删除数据

                hdel    key    field1 [field2]  (可以删除多个field)

                        eg: hdel  user   name  age

3、list类型

3.1、list类型的基本概念

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。

需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序。

list类型:保存多个数据,底层使用双向链表存储结构实现。

3.2、list类型的基本操作

  • 添加/修改数据 

                 lpush   key   value1 [value2] (从左到右存储)

                        eg:lpush  name  zhangsan lisi  wangwu

                 rpush  key   value1 [value2] (从右往左存储)

                       eg:rpush  name  zhangsan lisi  wangwu

  • 获取数据

                lrange   key    start stop  下标从几到几  -1表示最后一个

                        eg:  lrange  name  0 -1

  • 获取并移除数据

                lpop  key 

                        eg:lpop name (获取并移除第一个数据)

                rpop  key 

                        eg:rpop name (获取并移除最后一个数据)

  • 删除数据

                lrem   key    count   value  (在一个key中从左边开始删除几个这样的值)                     

4、set类型

4.1、set类型的基本介绍

新的存储需求:存储大量的数据,在查询方面提供更高的效率

需要的存储结构:能够保证大量的数据,高效的内部存储机制,便于查询。

set类型:与hash存储结构完全相同,仅存储键,不存储值,并且键是不允许重复的。 

 

4.2、set类型数据的基本操作

  • 添加数据 

                 sadd  key   member1  [member2]

                        eg:sadd  users zhansgan  lisi

                        eg:sadd  users    wangwu

  • 获取数据

                smembers key 

  • 删除数据

                srem  key    member1 [member2]  (可以删除多个field)

                        eg: srem users zhangsan 

5、sorted_set (zset)

5.1、sorted_set概念

新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式

需要的存储结构:新的存储模型,可以保存可排序的数据

sorted_set类型:在se的存储结构基础上添加可排序字段

5.2、sorted_set基本操作

  • 添加数据 

                 zadd  key  scorel   member1  [ scorel member2]

                        eg:sadd  users 19 lisi 

                 

  • 获取全部数据

                zrange   key start stop [WITHSCORES]

                        eg:  zrange users 0 -1(从小到大获取数据的的属性)

                        eg: zrange users 0 -1 withscores(从小到大获取数据的编号和属性)

                zrevrange  key start stop [WITHSCORES]

                         eg:  zrevrange users 0 -1(从大到小获取数据的的属性)

                        eg:  zrevrange users 0 -1  withscores(从大到小获取数据的的属性和编号)

  • 删除数据

                zrem  key    member1 [member2] 

                        eg: zrem users lisi

三、SpringBoot整合Redis

SpringBoot版本:     2.3.4.RELEASE

 引入依赖

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


    <!-- spring2.X集成redis所需common-pool2-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.6.0</version>
    </dependency>

配置yaml

spring:
  redis:
    host: 自己的ip
    port: 自己的端口号  默认 6379
    #Redis使用的数据库
    database: 0
    #连接超时事件毫秒
    timeout: 18000
    lettuce:
      pool:
        #连接池最大连接数
        max-active: 20
        #最大阻塞等待时间
        max-idle: 5
        #连接池最小空闲连接
        min-idle: 0

 RedisTemplate模版序列化配置

在不使用序列化配置之前Java数据序列化底层使用的是默认序列化存入Redis中是解析过乱码的数据,存到Redis中可视化太低!使用之后可以显示中文

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    /**
     * redis序列化的工具配置类,下面这个请一定开启配置
     * 127.0.0.1:6379 keys *
     * 1)"ord:102" 序列化过
     * 2)"\xac\xed\x00\x05t\ord:102"  没有序列化过
     * this.redisTemplate.opsForValue()//提供了操作String类型的所有方法
     * this.redisTemplate.opsForList()//提供了操作List类型的所有方法
     * this.redisTemplate.opsForSet()//提供了操作Set类型的所有方法
     * this.redisTemplate.opsForHash()//提供了操作Hash类型的所有方法
     * this.redisTemplate.opsForZSet()//提供了操作ZSet类型的所有方法
     *
     *
     * @param lettuceConnectionFactory
     * @return
     */

    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        //设置key序列化方式String
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认的序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

 下面图片就是上述代码,请忽略!

在SpringBoot中集成了两个模版一个是 RedisTemplate,另一个为 StringRedisTemplate 

而虽然StringRedisTempate帮助我们做了序列化,但是存储数据的时候只能存储Sting类型的数据,而RedisTemplate可以存储Object类型,所以我们一个使用RedisTemplate比较多一些!

Redis的Demo案例

@SpringBootTest
public class RedisTest {

    /**
     * redis序列化的工具配置类,下面这个请一定开启配置
     * 127.0.0.1:6379 keys *
     * 1)"ord:102" 序列化过
     * 2)"\xac\xed\x00\x05t\ord:102"  没有序列化过
     * this.redisTemplate.opsForValue()//提供了操作String类型的所有方法
     * this.redisTemplate.opsForList()//提供了操作List类型的所有方法
     * this.redisTemplate.opsForSet()//提供了操作Set类型的所有方法
     * this.redisTemplate.opsForHash()//提供了操作Hash类型的所有方法
     * this.redisTemplate.opsForZSet()//提供了操作ZSet类型的所有方法
     *
     *
     * @param lettuceConnectionFactory
     * @return
     */

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void test1(){

            //boundhashOps也是操作redis的一种方法,但是是低版本操作。
            //操作方式和opsForhash一样。根据个人喜好都可以
        Object content = redisTemplate.boundHashOps("content").get("1");
        System.out.println(content);
    }

        /**
            存储string类型
    */
    @Test
    public void test2(){
        /**
         *  redisTemplate.opsForValue()//提供了操作String类型的所有方法
         */
            Object name ="dession";

            redisTemplate.opsForValue().set("name",name);
            //设置过期时间1天过期
            redisTemplate.expire("name",1, TimeUnit.DAYS);

        System.out.println(redisTemplate.opsForValue().get("name"));
        //  结果为:dession



    }

        /**
                存储Hash数据类型
            */
    @Test
    public void test3(){
        //单个存储
        redisTemplate.opsForHash().put("users","name","zhangsan");
        //设置过期时间
        redisTemplate.expire("users",1, TimeUnit.DAYS);
        //多只存储
        Map map = new HashMap();
        map.put("age",12);
        map.put("sex","男");
        redisTemplate.opsForHash().putAll("users",map);

        Object o = redisTemplate.opsForHash().get("users", "name");
        System.out.println(o);



    }

}

 好啦,以上是我操作两个最最最常用的数据类型的方式来进行的案例讲解,还有其中还有很多方法不能一一列举出来,剩下的任务传递给你,认真探索一下redis的奥秘吧!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐