Redis入门基础笔记


Redis简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。可以用作:

  • 数据库
  • 缓存
  • 消息中间件

官网:https://redis.io

redis官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。

  • 关系型数据库:mysql、sqlServer、Oracle,适用于需要事务支持的情况,基于sql的结构化查询存储,处理复杂的关系。

  • 非关系型数据库:MongoDB,Cassandra,Redis

Redis应用场景

缓存

任务队列

消息队列

分布式锁

Redis下载与安装

Redis安装包分为Linux和Windows版本

Linux安装Redis
  1. 将Redis安装包上传到Linux

  2. 解压安装包(这里我安装到software文件夹)

    cd /software
    tar -zxvf redis-xxx.tar.gz -C /software
  3. 安装redis的依赖环境gcc,这里可以使用yum安装

    yum install gcc-c++
  1. 进入/software/redis,进行编译

    cd /software/redis
    
    # 编译
    make
  2. 进入redis的src目录,进行安装

    # 进入redis的src目录,此时路径为/software/redis/src
    cd /src
    # 安装
    make install
Windows安装Redis
  1. 下载对应的Windows版本:https://github.com/microsoftarchive/redis/releases
  2. Windows版本为免安装版本,下载后可直接使用

Redis服务启动与停止

以下主要基于虚拟机上Centos 7

启动与停止

在redis目录/software/redis/中,进入/src文件,执行redis-server启动redis服务,redis默认端口为6379

# 进入到redis目录下的src文件下
cd /software/redis/sec

# 启动redis-server
./redis-server
redis配置

redis根目录下,打开redis.conf文件

# 进入redis根目录
cd /software/redis

# 打开配置文件
vim redis.conf

修改redis.conf配置文件让redis在后台运行,将daemonize字段改成daemonize yes.然后使用修改后的配置文件启动redis

# 在redis根目录下/software/redis
src/redis-server ./redis.conf
添加redis启动密码

打开redis.conf配置文件,找到注释的requirepass打开,并在后面添加redis密码。配置好后kill -9 <redis进程pid>,重新启动redis服务

# 杀死进程后重新启动
src/redis-server ./redis.conf

# 使用密码登录
src/redis-cli -h root -p 6379 -a 
远程连接Redis

修改redis.conf配置文件,注释掉bind 127.0.0.1。若服务器默认没有开启6379端口,先开启6379端口

# 打开6379端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent

# 重启防火墙使其生效
firewall-cmd --reload

注:防火墙相关命令

# 查看防火墙状态
systemctl status firewalld

# 暂时关闭防火墙
systemctl stop firewalld

# 开启防火墙
systemctl start firewalld

# 开放指定端口
firewall-cmd --zone=public --add-port=<端口号>/tcp --permanent

# 开放后刷新使防火墙生效
firewall-cmd --reload

Redis数据类型

介绍

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

value常见类型: 说明
字符串 String string普通字符串
哈希 hash hash适合存储对象
列表 list list按照插入顺序排序,可以存储重复元素
集合 set set无序集合,没有重复元素
有序集合 sorted set sorted set有序集合,没有重复元素

更多命令可以参考Redis中文官网:https://www.redis.net.cn/order/

Redis常用命令

字符串String操作命令
Redis中字符串类型常用命令: 说明
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将key的值过期时间设置为seconds秒
SETNX key value 只有key不存在时设置key的值
哈希hash操作命令

Redis Hash是一个String类型的FieldValue的映射表,Hash特别适合用于存储对象

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

Redis列表是简单的字符串列表,按照插入顺序排序

常用命令: 说明
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
BRPOP key1 [key2] timeout 移出并获取列表的最后一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
集合set操作命令

Redis setString类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

常用命令: 说明
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SREM key member1 [member2] 移除集合中一个或多个成员
有序集合Sorted Set操作命令

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

常用命令: 说明
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZREM key member [member …] 移除有序集合中的一个或多个成员
通用命令
命令: 说明
KEYs pattern 查找所有符合给定模式(pattern)的key
EXISTs key 检查给定key是否存在
TYPE key 返回key所储存的值的类型
TTL key 返回给定key的剩余生存时间(TTL, time to live),以秒为单位
DEL key 该命令用于在key存在是删除key

在Java中操作Redis

介绍

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

  • Jedis
  • Lettuce
  • Redisson

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

Jedis

Jedis的maven坐标

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.4.0-rc1</version>
</dependency>

使用Jedis操作Redis的步骤:

  1. 获取连接
  2. 执行操作
  3. 关闭连接

测试代码

public class JedisTest {

    @Test
    public void testRedis() {
        //1. 获取连接
        Jedis jedis = new Jedis("localhost", 6379);

        //2. 执行具体操作
        jedis.set("username", "user");
        String value = jedis.get("username");
        System.out.println(value);

        jedis.hset("myhash", "addr", "shanghai");
        String hValue = jedis.hget("myhash", "addr");
        System.out.println(hValue);

        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

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

}

Spring Data Redis

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

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作
在项目中使用
  1. maven中导入spring-boot-starter-data-redis
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.0.0</version>
</dependency>
  1. application.yml中配置redis相关信息

    spring:
        redis:
            host: localhost
            port: 6379
            password: root
            database: 0
            jedis:
                #Redis连接池配置
                pool:
                    max-active: 8 #最大连接数
                    max-wait: 1ms #连接池最大阻塞等待时长
                    max-idle: 4 #连接池最大空闲连接
                    min-idle: 0 #连接池最小空闲连接
  2. 创建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;
        }
    }

文章作者: youzg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 youzg !
评论
  目录