Redis基本使用!

目录

1.基本概念:

1.Redis的安装和启动

下载

目录结构

3.Redis的命令(重点)

Redis数据结构

 1.String字符串(重点)

2.Hash哈希(重点)

 3.Set集合

 4.ZSet集合

通用命令

4.Jedis的基本使用(了解) 相当于JDBC

JedisAPI

5.SpringDataRedis(重点*****)

操作哈希类型数据

操作列表类型数据

操作集合类型数据(扩展)

操作有序集合类型数据(扩展)

通用操作(必须掌握)


1.基本概念:

1.redis介绍: 

        redis是一个 基于 内存 的  key = value 结构数据库

端口号:6379

 2.主要特点:

        1.内存存储,读写性能高 - Redis读的 速度是110000次/S

        2.它存储的 value 类型比较丰富(5种数据类型),也称为结构化NoSQL数据库

        3. 适合存储热点且不是时刻发生改变的数据(商品、资讯、新闻)

 3.NoSQL介绍

        NoSQL(Not Only SQL )不仅仅是SQL,泛指==非关系型数据库==

关系型数据库 (Mysql,Oracle等)

        优点:

                1.易于维护:都是使用表结构,格式统一

                2.使用方便:SQL语言通用

                3.可以多表查询:可用于一个表或多个表之间非常复杂查询

        缺点:

                1.储存在硬盘上,所以读写能力比较差

                2.固定的表结构,灵活性差

                3.高并发读写需求,硬盘I/O是一个很大的瓶颈

非关系型数据库(redis,MongoDB等)

        优点:

                1.格式灵活:储存数据的格式可以是key,value等形式的应用场景。

                2.速度快:nosql可以使用硬盘或内存为载体,而非硬盘;

                3.成本低:nosql数据库部署简单,基本都是免费的;

        缺点:

                1.不提供sql支持,学习和使用成本较高。

                2.一般没有事务处理

                3.复杂查询方面欠缺

1.Redis的安装和启动

下载

 

目录结构

目录或文件 作用
redis-benchmark 性能测试工具
redis-check-aof AOF文件修复工具
redis-check-dump RDB文件检查工具(快照持久化文件)
redis-cli 命令行客户端
redis-server 启动redis服务器
redis.windows.conf redis核心配置文件

 

启动服务:

 启动命令行:

3.Redis的命令(重点)

Redis数据结构

Redis采用的是键值对存储,(key)键的类型只能为字符串,(value)值支持五种数据类型:

  • 字符串:String

  • 哈希:HashMap

  • 双向链表:LinkedList

  • 无序集合:HashSet

  • 有序集合:LinkedHashSet

 1.String字符串(重点)

  字符串类型是Redis中最为基础的数据存储类型

    * 新增  set key value
    * 查询  get key

    * 删除  del key

    * 新增的时候设置过期时间(验证码)  setex key second value
    * 查看剩余时间   ttl key        
    * 根据键判断记录是否存   exists key    0:不存在 1:存在

2.Hash哈希(重点)

Hash类型极其类似于java中的Map,值里面可以存放一组组的键值对

该类型非常适合于存储java中对象的信息

* 新增   hset key hkey hvalue
        
* 查询 所有  hgetall key
          单个   hget key hkey
  * 删除
    
删除单个value的key    hdel key hkey
删除redis的key            del key 
        
* 获取所有hkey            hkeys key 
        
* 获取所有hvalue          hvals key         
* 新增
    左压入
        lpush key value
    右压入
        rpush key value
        
        
* 列表长度
        llen key        
        
* 查询元素
        lrange key  [开始索引  结束索引]
                      0         -1
* 删除元素
    左弹出
        lpop key
    右弹出
        rpop key

 3.Set集合

Set类型底层是一张hash表。里面的元素是无序的,不可重复的

* 新增
        sadd key value
    
 * 查询集合数量
        scard key   
    
* 查询元素
        smembers key
                
* 删除元素    
        srem key value

 4.ZSet集合

Zset,也称sortedSet, 在Set的基础上,加入了有序功能,在添加元素的时候,允许指定一个分数,它会按照这个分数排序

* 新增
        zadd key score value
        
* 查询
    升序
        zrange key [开始索引  结束索引] [withscores] 
    降序    
        zrevrange key [开始索引  结束索引] [withscores] 

* 删除
        zrem key value

通用命令

* 模糊查询键
        keys *

* 删除键
        del key....

* 根据键判断值类型 
        type key

* 选择数据库
        select 0~15

* 清空当前数据库
        flushdb

* 清空所有数据库
        flushall

4.Jedis的基本使用(了解) 相当于JDBC

Redis作为一款优秀的缓存服务器存在,大多数语言都提供了连接Redis的驱动包,在java中,比较出名的是Jedis和Redisson,我们今天以Jedis为例学习,看看如何是用程序操作redis。

JedisAPI

方法 解释
new Jedis(host, port) 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口
set(key,value) 设置字符串类型的数据
get(key) 获得字符串类型的数据
hset(key,field,value) 设置哈希类型的数据
hget(key,field) 获得哈希类型的数据
lpush(key,values) 设置列表类型的数据
lpop(key) 列表左面弹栈
rpop(key) 列表右面弹栈
del(key) 删除指定的key

<dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.3</version>
    </dependency>
</dependencies>
 public static void main(String[] args) {
        // 1.创建连接
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 2.新增
        jedis.set("1002", "李四");
      	//3.查询
        String value = jedis.get("1002");
        System.out.println(value);

        // 4.关闭连接
        jedis.close();
    }

 Jedis连接池

  public static void main(String[] args) {
        // 0.创建连接池配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(50); // 最大连接数
        config.setMaxIdle(20); // 最大空闲数
        // 1.创建连接池
        JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379);
        // 2.获取连接
        Jedis jedis = jedisPool.getResource();
        // 3.进行 新增、修改、删除、查询

        // 4.归还连接
        jedis.close();
    }

5.SpringDataRedis(重点*****)

介绍:

Spring Data Redis提供了 从Spring应用程序轻松配置和访问Redis的功能

通过RedisTemplate对底层Jedis进行了高度封装,提供了redis各种操作

  • ValueOperations:简单键值对操作 String


  • SetOperations:set类型数据操作 set


  • ZSetOperations:zset类型数据操作 sortedset---->zset


  • HashOperations:针对hash类型的数据操作 hash


  • ListOperations:针对list类型的数据操作 list

环境搭建

1.依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
</parent>

<dependencies>
  	<!-- SpringDataRedis框架-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

       <!-- spring测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

2.配置文件

spring:
  redis:
    host: localhost
    port: 6379
    database: 0 # 操作的是0号数据库
    jedis: #Redis连接池配置
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4 #连接池中的最大空闲连接
        min-idle: 0 #连接池中的最小空闲连接

3.API

    @Autowired
    private RedisTemplate redisTemplate;//二进制(能取,在可视化工具中看不到数据)

    @Autowired
    private StringRedisTemplate stringRedisTemplate;//RedisTemplate 的子类 

3.1 操作value

        // 操作字符串类型
@Test
public void test01() throws Exception {
    // 获取string操作对象
    ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();

    // 存值
    opsForValue.set("city", "北京");

    // 取值
     String value = opsForValue.get("city");
     System.out.println(value);

    // 存验证码存活5分钟
     opsForValue.set("sms_13700137000", "6375",TimeUnit.SECONDS);
  
   //删除
   redisTemplate.delete("city");

}

操作哈希类型数据

// 操作hash类型
@Test
public void test02() throws Exception {
    // 获取hash操作对象
    HashOperations<String, Object, Object> opsForHash = stringRedisTemplate.opsForHash();

    // 存值
    //opsForHash.put("1005", "nage", "zhangsan");
    //opsForHash.put("1005", "age", "18");
    //opsForHash.put("1005", "sex", "man");

    // 取出年龄
    String age = (String) opsForHash.get("1005", "age");
    System.out.println(age);
    System.out.println("---------------");
    // 取出所有key
    Set<Object> keys = opsForHash.keys("1005");
    for (Object key : keys) {
        System.out.println(key);
      	if("sex".equals(key)){
               ops.delete("1005",key); //删除map中的key
        }
    }
    System.out.println("---------------");
    // 取出所有value
    List<Object> values = opsForHash.values("1005");
    for (Object value : values) {
        System.out.println(value);
    }

    // 删除
   stringRedisTemplate.delete("1005");
}

操作列表类型数据

// 操作list类型
@Test
public void test03() throws Exception {
    // 获取list操作对象
    ListOperations<String, String> opsForList = stringRedisTemplate.opsForList();

    // 存值
    //opsForList.leftPush("alist", "a");
    //opsForList.leftPush("alist", "b");
    opsForList.leftPushAll("alist", "a", "b");
    opsForList.rightPush("alist", "c");

    // 取值
    List<String> list = opsForList.range("alist", 0, -1);
    for (String s : list) {
        System.out.println(s);
    }
    System.out.println("--------------");
    // 获取list长度
    Long size = opsForList.size("alist");
    System.out.println(size);
    System.out.println("--------------");
    // 遍历删除
    for (Long i = 0l; i < size; i++) {
        // 弹出
        System.out.println(opsForList.rightPop("alist"));
    }

}

操作集合类型数据(扩展)

// 操作set类型
@Test
public void test04() throws Exception {
    // 获取set操作对象
    SetOperations<String, String> opsForSet = stringRedisTemplate.opsForSet();

    // 存值
    // opsForSet.add("lol", "a", "b", "c", "a");

    // 获取
    Set<String> lol = opsForSet.members("lol");
    for (String s : lol) {
        System.out.println(s);
    }

    // 删除
    opsForSet.remove("lol", "a");

}

操作有序集合类型数据(扩展)

// 操作zset类型
@Test
public void test05() throws Exception {
    // 获取 zset操作对象
    ZSetOperations<String, String> opsForZSet = stringRedisTemplate.opsForZSet();

    // 存值
    // opsForZSet.add("wangzhe", "安其拉", 66.6);
    // opsForZSet.add("wangzhe", "兰陵王", 68.6);
    // opsForZSet.add("wangzhe", "后羿", 79.6);

    // 修改
    // opsForZSet.add("wangzhe", "安其拉", 85.6);

    // 删除
    opsForZSet.remove("wangzhe", "兰陵王");

    // 取值
    Set<String> wangzhe = opsForZSet.reverseRange("wangzhe", 0, -1);
    for (String s : wangzhe) {
        System.out.println(s);
    }

}

通用操作(必须掌握)

// 通用操作
@Test
public void test06()throws Exception{
    // 查询所有key
    Set<String> keys = stringRedisTemplate.keys("*");
    for (String key : keys) {
        System.out.println(key);
    }
    // 判断某个key是否存在
    Boolean itheima = stringRedisTemplate.hasKey("1005");
    System.out.println(itheima);

    // 判断某个key的类型
    DataType type = stringRedisTemplate.type("1005");
    System.out.println(type.name());
}