Skip to content

Redis学习中 ​

一、下载 ​

Redis安装包分为 Windows 版和 Linux 版:

二、Redis服务启动与停止 ​

1、服务启动 ​

bash
redis-server.exe redis.windows.conf

提示

Redis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务

2、客户端连接 ​

bash
redis-cli.exe

提示

通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:

-h ip地址

-p 端口号

-a 密码(如果需要)

三、数据类型 ​

信息

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

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

1、字符串 ​

字符串(string):普通字符串,Redis中最简单的数据类型

常用命令

命令作用
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value 只有在 key 不存在时设置 key 的值

2、哈希 ​

哈希(hash):也叫散列,类似于Java中的HashMap结构

提示

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

常用命令

命令作用
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值

3、列表 ​

列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList

常用命令

命令作用
LPUSH key value1 [value2]将一个或多个值插入到列表头部(左边)
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素(右边)
LLEN key 获取列表长度

4、集合 ​

集合(set):无序集合,没有重复元素,类似于Java中的HashSet

常用命令

方法作用
SADD key member1 [member2]向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SREM key member1 [member2]删除集合中一个或多个成员

5、有序集合 ​

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数

常用命令

命令作用
ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员

6、通用命令 ​

命令作用
KEYS pattern查找所有符合给定模式( pattern)的 key
EXISTS key 检查给定 key 是否存在
TYPE key 返回 key 所储存的值的类型
DEL key 该命令用于在 key 存在时删除 key

四、Java中引入Redis ​

1、使用 ​

  • 导入Spring Data Redis 的maven坐标

    xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>3.2.5</version>
    </dependency>
  • 配置Redis数据源

    yml
    spring:
    	redis:
    		host: localhost
    		port: 6379
    		password: 
    		database: 0
  • 编写配置类,创建RedisTemplate对象

    java
    @Configuration
    @Slf4j
    public class RedisConfiguration {
    
        @Bean
        public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            log.info("开始创建redis模版类");
            RedisTemplate redisTemplate = new RedisTemplate();
    		//设置redis的连接工厂对象
            redisTemplate.setConnectionFactory(redisConnectionFactory);
    		//设置key的序列化器,默认为JdkSerializationRedisSerializer
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            return redisTemplate;
        }
    }
  • 通过RedisTemplate对象操作Redis

    java
    //字符串
    ValueOperations valueOperations = redisTemplate.opsForValue();
    //哈希
    HashOperations hashOperations = redisTemplate.opsForHash();
    //列表
    ListOperations listOperations = redisTemplate.opsForList();
    //集合
    SetOperations setOperations = redisTemplate.opsForSet();
    //有序集合
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();

2、操作string类型数据 ​

测试

java
@Test
public void TestString() {
    ValueOperations valueOperations = redisTemplate.opsForValue();
    
  	//set   
    //设置指定key的值
	valueOperations.set("city", "北京");
  	
    //get	
    //获取指定key的值
	String city = (String) valueOperations.get("city");
	System.out.println(city);
  
    //set key seconds value
    //设置指定key的值,并将 key 的过期时间设为 seconds 秒
	valueOperations.set("name", "孙悟空", 100, TimeUnit.SECONDS);
  
    //setnx key value
    //只有在 key 不存在时设置 key 的值
	valueOperations.setIfAbsent("address", "湖北");
	valueOperations.setIfAbsent("address", "湖南");//次操作不会覆盖前值
}

3、操作hash型数据 ​

测试

java
@Test
public void TestHash() {
    HashOperations hashOperations = redisTemplate.opsForHash();

    //hset key field value
    //将哈希表 key 中的字段 field 的值设为 value
    hashOperations.put("250", "name", "林冲");

    //hget key field
    //获取存储在哈希表中指定字段的值
    Object name = hashOperations.get("250", "name");
    System.out.println(name);

    //hkeys key
    //获取哈希表中所有字段
    Set keys = hashOperations.keys("250");
    System.out.println(keys);
    
    //hvals key
    //获取哈希表中所有值
    List values = hashOperations.values("250");
    System.out.println(values);

    //hdel key field
    //删除存储在哈希表中的指定字段
    hashOperations.delete("250", "name");
}

4、操作list型数据 ​

java
@Test
public void TestList(){
    ListOperations listOperations = redisTemplate.opsForList();
      
    //LPUSH key value1 [value2]
    //将一个或多个值插入到列表头部(左边)
    listOperations.leftPushAll("mylist","a","b","c");
      
    //LRANGE key start stop
    //获取列表指定范围内的元素
    List mylist = listOperations.range("mylist", 0, -1);
    System.out.println(mylist);
      
    //RPOP key
    //移除并获取列表最后一个元素(右边)
    listOperations.rightPop("mylist");
      
    //LLEN key
    //获取列表长度
    Long size = listOperations.size("mylist");
    System.out.println(size);
}

5、操作set型数据 ​

java
@Test
public void TestSet(){
    SetOperations setOperations = redisTemplate.opsForSet();
      
    //SADD key member1 [member2]
    //向集合添加一个或多个成员
    setOperations.add("set1","张飞","关羽","刘备","曹操","周瑜");
      
    //SMEMBERS key
    //返回集合中的所有成员
    Set set1 = setOperations.members("set1");
    System.out.println(set1);
      
    //SCARD key
    //获取集合的成员数
    Long size = setOperations.size("set1");
    System.out.println(size);
    
    setOperations.add("set2","刘备","曹操","诸葛亮","孙权");
      
    //SINTER key1 [key2]
    //返回给定所有集合的交集
    Set intersect = setOperations.intersect("set1", "set2");
    System.out.println(intersect);
      
    //SUNION key1 [key2]
    //返回所有给定集合的并集
    Set union = setOperations.union("set1", "set2");
    System.out.println(union);
     
    //SREM key member1 [member2]
    //删除集合中一个或多个成员
    setOperations.remove("set2","孙权");
}

6、操作zset型数据 ​

java
@Test
public  void TestZSet(){
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
      
    //ZADD key score1 member1 [score2 member2]
    //向有序集合添加一个或多个成员
    zSetOperations.add("key1","武汉",2);
    zSetOperations.add("key1","仙桃",5);
    zSetOperations.add("key1","黄石",1);
    zSetOperations.add("key1","荆州",8);
      
    //ZRANGE key start stop [WITHSCORES]
    //通过索引区间返回有序集合中指定区间内的成员
    Set key1 = zSetOperations.range("key1", 0, -1);
    System.out.println(key1);
      
    //ZINCRBY key increment member
    //有序集合中对指定成员的分数加上增量 increment
    zSetOperations.incrementScore("key1","仙桃",99);
    System.out.println(zSetOperations.range("key1", 0, -1));
      
    //ZREM key member [member ...]
    //移除有序集合中的一个或多个成员
    zSetOperations.remove("key1","荆州");
}

7、通用命令 ​

java
@Test
public void TestCommon() {
    //KEYS pattern
    //查找所有符合给定模式( pattern)的 key
    Set keys = redisTemplate.keys("*");
    System.out.println(keys);
    
    //EXISTS key
    //检查给定 key 是否存在
    Boolean key1IsExists = redisTemplate.hasKey("key1");
    System.out.println(key1IsExists);
    
    //TYPE key
    //返回 key 所储存的值的类型
    for (Object key : keys) {
        DataType type = redisTemplate.type(key);
        System.out.println(type.name());
    }
    
    //DEL key
    //该命令用于在 key 存在时删除 key
    redisTemplate.delete("key1");
}

上次更新::