Redis简单入门

Redis是一个高性能的内存数据结构存储系统,可用作数据库、缓存和消息中间件。本文介绍了Redis的安装、数据类型(如String、Hash、List、Set、SortedSet)、常用命令以及在Java中使用Redis的方式,包括Jedis和SpringDataRedis的操作示例。
摘要由CSDN通过智能技术生成

Redis入门

Redis简介:

Redis是一个开源的内存中的数据结构存储系统,它可以作用:数据库、缓存、和消息中间件。

官网:Redis

Redis是用c语言进行开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询的次数)。它储存的value类型比较丰富,也称为结构化的NoSql数据库。

NoSql,不仅仅是sql,泛指非关系型数据库。NoSql数据库并不是取代关系型数据库,而是关系型数据库的补充。

  • 关系型数据库
    • MySql
    • Oracle
    • DB2
    • SSQLServer
  • 非关系型数据库
    • Redis
    • Mongo db
    • MemCached

Redis的应用场景

  1. 缓存
  2. 任务队列
  3. 消息队列
  4. 分布式锁

资源和安装包:

  • Windoes版安装包:
    • 链接:https://pan.baidu.com/s/1WRnqBAAAuo-PVtlnE6EXcw?pwd=shiy
      提取码:shiy
  • Linux版安装包:
    • 链接:https://pan.baidu.com/s/1ixgypshRSDGQr0T-Yt878Q?pwd=k39r
      提取码:k39r

在Linux中安装Redis的步骤

  1. 将Redis安装包上传到Linx系统中
  2. 解压安装包,命令: tar -zxvf redis安装包 -C /usr/local
  3. 安装Redis的依赖环境gcc,命令:yum install gcc-c++
  4. 进入/usr/local/redis安装包,进行编译, 命令:make
  5. 进入redis的src目录,进行安装,命令:make install

Windows版本安装Rdis

Windows版本直接解压就行了,然后解压目录如下:

image-20230627113347094

Redis服务启动与停止

linux中redis服务启动,我们先进入src目录下可以使用redis-server,默认端口号为6379

image-20230627114044538

Ctr+ c停止Redis服务

Windws系统中启动Redis,直接双击redis-server.exe即可启动Redis服务,redis服务端口号为6379

image-20230627115338572

Ctr+ c停止Redis服务

Redis数据类型

介绍

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5中常用的数据类型:

  • 字符串 String
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set

Redis5种常用的数据类型

image-20230628134652366

Redis常用命令

Redis字符串类型常用命令

  • set key value 设置指定key的值
  • get key 获取指定key的值
  • setex key seconds value 设置指定key的值,并将key的过期时间设置为seconds秒
  • setnx key value 只有在key不存在时设置key的值

更多命令大家可以参考Redis中文网:Redis 命令_redis教程

哈希hash操作命令

redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,常用命令:

  • hset key field value 将哈希表key中的字段field的值设置为value
  • hget key field 获取存储在哈希表中指定字段的值
  • hdel key field 输出存储在哈希表中的指定字段
  • hkeys key 获取哈希表中的所有字段
  • hvals key 获取哈希表中所有值
  • hgetall key 获取在哈希表中指定key的所有字段和值

image-20230628144332084

列表list操作命令

redis列表是简单的字符串列表,安装插入顺序排序,常用的命令:

  • loush key value1 [value2] 将一个或者多个值插入到列表头部

  • lrange key start stop 获取列表指定范围内的元素

  • rpop key 移除并获取列表最后一个元素

  • llen key 获取列表长度

  • brpop key1 [key2] timeout 移除并获取列表的最后一个元素,如果列表没有元素和阻塞列表直到等待超时或发现可弹出元素为止

    image-20230628145302478

集合set操作命令

redis set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令

  • sadd key member1 [member2] 向集合添加一个或多个员工
  • smembers key 返回集合中的所有员工
  • scard key 获取集合的成员数
  • sinter key1 [key2] 返回给定所有集合的交集
  • sunion key1 [key2] 返回所有给定集合的并集
  • sdiff key1 [key2] 返回给定所有集合的差集
  • srem key member1 [member2] 移除集合中一个或多个成员

image-20230628150228824

有序集合 sorted set 操作命令

redis sorted set 有序集合是string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行重大到小排序的,但分数可以重复。

常用命令:

  • zadd key score1 member1 [score2 member2 ] 向有序集合增加一个或者多个成员,或者更新已存在成员的分数
  • zrange key start stop [EITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • zincrby key increment member 有序集合中对指定成员的分数加上增量increment
  • zrem key member [member…] 移除有序集合中的一个或者多个成员

image-20230628151449813

通用命令

  • keys * 查找所有的key值
  • exists key 检查给定key是否存在
  • type key 返回key所储存的值的类型
  • ttl key 返回给定key 的剩余时间 (TLL,time to live),以秒为单位
  • del key 该命令用于在key 存在时删除key

在Java中操作Redis

介绍:

Redis的Java客户端很多,官方推荐有三种

  • jedis
  • Lettuce
  • Redisson

spring对Redis客户端进行了整合,提供了spring Data Redis,在spring Boot项目中还提供了对应的starter,即:spring-boot-starter-data-redis

jedis

jedis的maven坐标

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
</dependency>

使用jedis操作redis的步骤

  1. 获取链接

    //1、获取连接
    Jedis jedis = new Jedis("localhost",6379);
    
  2. 执行操作

    //2、执行具体操作
    jedis.set("username", "xiaoming");
    
  3. 关闭连接

    //3、关闭连接
    jedis.close();
    

spring Data Redis

在spring boot项目中,可以使用spring Data Redis来简化Redis操作,maven坐标:

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

spring Data Redis 中提供了一共高度封装的类:RedisTemplate,针对jedis客户端中大量api进入了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单k-v操作
  • SetOperations:set类型的数据操作
  • ZSetOperations:zset类型的数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

yml的配置文件

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

测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringDataRedisDemoApplicationTests {

   @Autowired
   private RedisTemplate redisTemplate;
   

}

我们执行下面操作

@Test
public void testString(){
    redisTemplate.opsForValue().set("city","bj");

}

当我们执行操作时可以看到我们的key已经帮我们自动序列化了

image-20230701213849895

如果我们需要key的值跟我们写的一致需要进行下面的配置config

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置类
 */

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

}

根据不同类型进行操作

package com.anle.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作String类型数据
     */
    @Test
    public void testString(){
        //插入值
        redisTemplate.opsForValue().set("city123","bj");
        //取值
        String value = (String) redisTemplate.opsForValue().get("city123");
        System.out.println(value);

        redisTemplate.opsForValue().set("key1","value1",10l,TimeUnit.SECONDS);

        //修改值
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "nj");
        System.out.println(aBoolean);

    }

    /**
     * 操作Hash类型数据
     */
    @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();

        //存值
        hashOperations.put("002","name","zhansang");
        hashOperations.put("002","age","20");
        hashOperations.put("002","address","shanghai");

        //取值
        String age = (String) hashOperations.get("002","age");
        System.out.println(age);

        //获得hash结构中的所有字段
        Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }

        //获取hash结构中所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /**
     * 操作List类型数据
     */
    @Test
    public void testList(){
        ListOperations listOperations = redisTemplate.opsForList();

        //存值
        listOperations.leftPush("mylist","a");
        listOperations.leftPushAll("mylist","b","c","d");

        //取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String value : mylist) {
            System.out.println(value);
        }

        //获取列表长度llen
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String element = (String) listOperations.rightPop("mylist");
            System.out.println(element);
        }

    }

    /**
     * 操作Set类型数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();

        //存值
        setOperations.add("myset","a","b","c","d","a");

        //取值
        Set<String> myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

        //删除成员
        setOperations.remove("myset","a","b");
        //取值
         myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }
    }

    /**
     * 操作ZSet类型数据
     */
    @Test
    public void testZSet(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //存值
        zSetOperations.add("myZSet","a",10.0);
        zSetOperations.add("myZSet","b",15.0);
        zSetOperations.add("myZSet","c",20.0);
        zSetOperations.add("myZSet","d",25.0);

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

        //修改分数
        zSetOperations.incrementScore("myZSet","b",20.0);

        myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }

        //删除成员
        zSetOperations.remove("myZSet","a","b");

        myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }
    }

    /**
     * 通用操作,针对不同数据类型都可以操作
     *
     */
    @Test
    public void testCommon(){
        //获取redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key );
        }

        //判断某个key是否存在
        Boolean anle = redisTemplate.hasKey("anle");
        System.out.println(anle);

        //删除指定key
        redisTemplate.delete("myZSet");
        keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key );
        }

        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("myset");
        System.out.println(dataType.name());
    }
}

s) {
System.out.println(key );
}

    //判断某个key是否存在
    Boolean anle = redisTemplate.hasKey("anle");
    System.out.println(anle);

    //删除指定key
    redisTemplate.delete("myZSet");
    keys = redisTemplate.keys("*");
    for (String key : keys) {
        System.out.println(key );
    }

    //获取指定key对应的value的数据类型
    DataType dataType = redisTemplate.type("myset");
    System.out.println(dataType.name());
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值