初识Redis

认识NoSQL

在这里插入图片描述

认识Redis

安装Redis

启动Redis

Redis客户端

Redis命令

数据结构介绍

在这里插入图片描述

通用命令

操作命令

String

value字符串类型, 底层都是字节数组形式存储, 分为3类:

常见命令

Redis的key的格式(建议)

Hash

Hash类型, value是一个无序字典, 与java的HashMap类似

常见命令

  • HSET key field value: 添加或者修改hash类型key的field的值
  • HGET key field: 获取一个hash类型key的field的值
  • HMSET: 批量添加多个hash类型key的field的值
  • HMGET: 批量获取多个hash类型key的field的值
  • HGETALL: 获取一个hash类型的key中的所有的field和value
  • HKEYS: 获取一个hash类型的key中的所有的field
  • HVALS: 获取一个hash类型的key中的所有的value
  • HINCRBY: 让一个hash类型key的字段值自增并指定步长
  • HSETNX: 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

List

java的LinkedList类似, 可以看作是双向链表结构. 支持双向检索

常用语法

Set

java的HashSet类似

  • 无序
  • 元素不可重复
  • 查找
  • 支持交集, 并集, 差集等功能

常见命令

  • SADD key member ...: 向set中添加一个或多个元素
  • SREM key member ...: 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member: 判断一个元素是否存在于set中
  • SMEMBERS: 获取set中的所有元素
  • SINTER key1 key2 ...: 求key1与key2的交集
  • SDIFF key1 key2...: key1与key2的差集
  • SUNION key1 key2..: 求key1和key2的并集

SortedSet

是一个可排序的set集合, 与java中的TreeSet有些类似, 但底层数据结构差别很大.SortedSet中的每一个元素都带有一个score属性, 基于score属性对元素排序, 底层是一个跳表(SkipList)加Hash表.

用来实现排行榜的功能

常见命令

  • ZADD key score member: 添加一个或多个元素到sorted set,如果已经存在则更新score
  • ZREM key member: 删除sorted set中的一个指定元素
  • ZSCORE key member: 获取srted set中的指定元素的score
  • ZRANK key member: 获取sorted set 中的指定元素的排名
  • ZCARD key: 获取sorted set中的元素个数
  • ZCOUNT key min max: 统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member: 让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max: 按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max: 按照sore排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION: 求差集、交集、并集
  • 注意: 默认升序, 降序需要在命令的Z后面添加REV: ZREVRANK

Redis的Java客户端

客户端对比

Spring Data Redis 整合了 Jedis 和 lettuce
在这里插入图片描述

Jedis客户

Jedis快速入门

  1. 引入依赖
    <!-- Jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.7.0</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.7.0</version>
        <scope>test</scope>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.18</version>
        <scope>test</scope>
    </dependency>
    
  2. 使用
    import lombok.extern.slf4j.Slf4j;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import redis.clients.jedis.Jedis;
    
    import java.util.Map;
    
    @Slf4j
    public class JedisTest {
    
        private Jedis jedis;
    
        // 1. 建立连接
        @BeforeEach
        void setUp(){
            // 建立连接
            jedis = new Jedis("192.168.174.133", 6379);
            // 密码验证
            jedis.auth("123456");
            // 选择库, 默认0
            jedis.select(0);
        }
    
        // 4. 释放资源
        @AfterEach
        void tearDown(){
            // 释放资源
            if(jedis != null){
                jedis.close();
            }
        }
    
        // 2. 测试String
        @Test
        void testString(){
            // 插入数据, 方法名就是redis命令名
            String res = jedis.set("name", "zhangsan");
            System.out.println("result = " + res);
            // 获取数据
            String name = jedis.get("name");
            System.out.println("name = " + name);
        }
    
        // 3. 测试Hash
        @Test
        void testHash() {
            // 插入数据
            jedis.hset("user:1", "name", "tom");
            jedis.hset("user:1", "age", "20");
    
            // 获取数据
            Map<String, String> map = jedis.hgetAll("user:1");
            System.out.println(map);
        }
    }
    

Jedis连接池

  • 工具
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    public class JedisConnectionFactory {
    
        private static final JedisPool jedisPool;
    
        static {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大连接
            jedisPoolConfig.setMaxTotal(8);
            // 最大空闲连接
            jedisPoolConfig.setMaxIdle(8);
            // 最小空闲连接
            jedisPoolConfig.setMinIdle(0);
            // 设置最长等待时间, ms
            jedisPoolConfig.setMaxWaitMillis(200);
    
            jedisPool = new JedisPool(jedisPoolConfig, "192.168.174.133", 6379,
                    1000, "123456");
        }
    
        public static Jedis getJedis(){
            return jedisPool.getResource();
        }
    }
    
  • 使用
    ...
    public class JedisTest {
    
        private Jedis jedis;
    
        // 建立连接
        @BeforeEach
        void setUp(){
            // 建立连接
            // jedis = new Jedis("192.168.174.133", 6379);
            jedis = JedisConnectionFactory.getJedis();
            ...
        }
    
        ...
    }
    

SpringDataRedis客户端

SpringDataRedis概述

SpringData是Spring中数据操作模块,包含对各种数据库集成,其中对Redis的集成模块就叫做SpringDataRedis
官网地址: https://spring.io/projects/springdata-redis

SpringDataRedis提供了RedisTemplate工具
在这里插入图片描述

SpringDataRedis快速入门

  1. 引入依赖
    <!-- Redis依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 连接池依赖 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    
  2. 配置文件
    spring:
      data:
        redis:
          host: 192.168.174.133
          port: 6379
          password: 123456
          lettuce:
            pool:
              max-active: 8 # 最大连接
              max-idle: 8 # 最大空闲连接
              min-idle: 0 # 最小空闲连接
              max-wait: 100 # 设置最长等待时间, ms
    
  3. 使用
    @SpringBootTest
    class SpringdataredisDemoApplicationTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        void testString() {
            // 插入一条string类型数据
            redisTemplate.opsForValue().set("name", "李四");
            // 读取一条string类型数据
            Object name = redisTemplate.opsForValue().get("name");
            System.out.println("name = " + name);
        }
    
    }
    

RedisTemplate的RedisSerializer

RedisTemplate可以接收任意Object作为值写入Redis, 但是写入前会把Object序列化字节形式, 默认是采用JDK序列化

  • 可读性差
  • 内存占用较大

使用JSON序列化, 配置类如下:

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置Value序列
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return redisTemplate;
    }

}

StringRedisTemplate

RedisTemplate操作Hash类型

...

@SpringBootTest
class StringRedisTemplateTests {

	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	...

    @Test
    void testHash() {
        stringRedisTemplate.opsForHash().put("user:3", "name", "tom");
        stringRedisTemplate.opsForHash().put("user:3", "age", "21");

        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:3");
        System.out.println(entries);
    }
}

来源

黑马程序员. Redis入门到实战教程

Gitee地址

https://gitee.com/Y_cen/redis

原文地址:https://blog.csdn.net/Y_cen/article/details/134485348

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_7273.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注