• Redis基础


    1 Redis概述

    Redis英文官网:https://redis.io/
    Redis中文官网:http://www.redis.cn/

    1.1 诞生

    Redis最初是由Salvatore Sanfilippo开发的,现在由Redis Labs公司维护和支持。Redis使用ANSI C编写,可以运行在各种操作系统上,包括Linux、Windows、Mac OS X等。

    1.2 简介

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

    Redis是一个开源的内存数据结构存储系统,它支持多种数据结构,如字符串、哈希表、列表、集合等。Redis的主要特点是速度快、灵活性高、可扩展性好、并且支持持久化。

    1.3 主要应用场景

    • 缓存:Redis最常见的用途是作为缓存层。由于Redis将数据存储在内存中,读取速度非常快,可以显著降低数据库的负载压力。通过将经常访问的数据缓存到Redis中,可以提高应用程序的响应速度和性能。

    • 分布式锁:Redis提供了原子性操作和分布式锁的支持,可以实现分布式环境下的互斥访问控制。通过使用Redis的SETNX(set if not exists)命令,可以实现简单有效的分布式锁,避免多个进程或线程同时修改共享资源。

    • 计数器和排行榜:Redis支持对数据进行原子性的增减操作,可以用于实现计数器功能。例如,可以用Redis来记录网站的访问次数、用户的点赞数等。此外,Redis还可以根据分数对数据进行排序,用于构建排行榜功能。

    • 发布/订阅:Redis支持发布/订阅模式,可以实现消息的发布和订阅机制。通过使用PUBLISH命令发布消息,以及使用SUBSCRIBE和PSUBSCRIBE命令订阅消息,可以实现实时的消息传递和广播功能。

    • 数据持久化:Redis提供了两种数据持久化方式,分别是快照(snapshotting)和AOF(Append-Only File)。快照方式可以定期将内存中的数据保存到磁盘上,以防止服务器故障时数据丢失。AOF方式则将每个写操作追加到文件中,以实现更高的数据持久性和灵活的恢复机制。

    • 分布式缓存:Redis支持数据的分片和集群,可以构建分布式缓存系统。通过将数据分布在多个Redis节点上,可以扩展缓存容量和吞吐量,提高系统的可用性和性能。

    • 国内:

      • 淘宝
      • 新浪微博
      • 腾讯微博
    • 国外:

      • github

    1.4 优势

    • 高性能:Redis 将数据存储在内存中,因此具有非常快速的读写操作。它使用了基于内存的数据结构和异步方式的 I/O 操作,使得 Redis 能够实现每秒数十万次的读写操作。
    • 数据结构丰富:Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,每种数据结构都有丰富的操作命令。这使得 Redis 不仅仅是一个简单的键值存储系统,还可以用于解决更复杂的问题。
    • 持久化支持:Redis 提供了两种持久化方式,分别是快照(snapshotting)和日志(append-only file)。快照可以在指定时间间隔内将内存中的数据保存到磁盘上,而日志则可以将每次写操作追加到文件中,以便在重启时重新执行这些操作。这样可以确保即使出现故障或断电,数据也不会丢失。
    • 高可用性:Redis 支持主从复制和哨兵机制。通过主从复制,可以将主节点的数据复制到多个从节点上,实现数据的备份和读写分离。而哨兵机制可以监控 Redis 实例的状态,并在主节点故障时自动将一个从节点切换为新的主节点,保证系统的高可用性。
    • 分布式支持:Redis Cluster 是 Redis 提供的分布式解决方案,它可以将数据分散存储在多个节点上,实现数据的水平扩展和负载均衡。Redis Cluster 使用哈希槽(hash slot)来划分数据,每个节点负责一部分哈希槽,从而实现数据的分片存储和并行处理。
    • 应用场景广泛:由于 Redis 具有高性能、丰富的数据结构和灵活的特性,它在很多场景下都可以发挥作用。例如,缓存系统、消息队列、计数器、排行榜、实时数据分析等都是 Redis 的常见应用场景。

    2 Redis的下载与安装

    2.1 下载

    下载官网:Redis版本下载官网

    选择下载版本:

    2.2 安装

    将下载的压缩包解压至自己的安装目录下即可完成安装

    2.3 启动


    注意:该窗口启动成功后,若后续需使用Redis,则该窗口不可关闭


    在该窗口下输入Redis命令进行操作

    Redis在线命令测试器:http://try.redis.io
    Redis命令大全:http://www.redis.cn/commands.html

    3 Redis的五大数据类型

    3.1 String(字符串)

    3.1.1 特点

    存储单个值

    3.1.2 使用场景

    适用于存储单个值的场景,如缓存、计数器、分布式锁等。

    3.1.3 常用命令

    //存入键值对
    set key value
    
    //获取键对应的值
    get key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //查看当前库的所有数据
    keys *
    
    • 1
    • 2

    //判断key是否存在,存在返回1,不存在返回0
    EXISTS key
    
    //查看key对应的value的字符串长度
    STRLEN key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //追加value到key所对应的value之后
    APPEND key value
    
    //追加,key存在的话,拼接‘+’,返回总长度
     APPEND key , value
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //指定key对应的value的数据自增1,返回结果
    incr key
    
    //指定key对应的value的数据自减1,返回结果
    decr key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //设置key对应的value指定时间内过期
    setex key timeout value 
    
    //获取剩余时间 
    ttl key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 Hash(哈希)

    3.2.1 特点

    键值对存储、无序。

    3.2.2 使用场景

    适用于存储对象或实体的属性信息,以及需要按照键进行快速查找的场景。常见的应用包括缓存对象、存储用户信息、存储配置信息等。

    3.2.3 常用命令

    //添加hash
    hset key hashkey hashvalue
    
    //获取hash中 hashkey对应的hashvalue
    hget key hashkey  
    
    //获取hash中所有的hashkey hashvalue
    hgetall key 
    
    //获取指定hash中的所有key
    hkeys hashkey
    
    //获取指定hash中的所有value
    hvals hashvalue
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    //获取指定hash的长度
    hlen key 
    
    //判断hashkey是否存在于指定的hash,存在返回1,不存在返回0
    HEXISTS key hashkey
    
    //根据hashkey 删除hash对象的键值对 
    hdel  key hashkey  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.3 List(列表)

    3.3.1 特点

    有序、可重复。

    3.3.2 使用场景

    适用于需要保持元素顺序、允许重复元素的场景。常见的应用包括消息队列、任务队列、记录操作日志等。

    3.3.3 常用命令

    //新增一个集合
    127.0.0.1:6379> lpush list v1
    (integer) 1
    127.0.0.1:6379> lpush list v2
    (integer) 2
    127.0.0.1:6379> lpush list v3
    (integer) 3
    
    //查询list的所有元素值
    127.0.0.1:6379> lrange list 0 -1
    1) "v3"
    2) "v2"
    3) "v1"
    
    //批量添加集合元素
    127.0.0.1:6379> lpush list1 v1 v2 v3 v4 v5
    (integer) 5
    
    127.0.0.1:6379> lrange list1 0 -1
    1) "v5"
    2) "v4"
    3) "v3"
    4) "v2"
    5) "v1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注意:list集合元素在添加时,先添加后显示,后添加先显示

    //往列表的左边添加数据
    127.0.0.1:6379> lpush list v4
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "v4"
    2) "v3"
    3) "v2"
    4) "v1"
    
    //往列表的右边添加数据 
    127.0.0.1:6379> rpush list v0
    (integer) 5
    127.0.0.1:6379> lrange list 0 -1
    1) "v4"
    2) "v3"
    3) "v2"
    4) "v1"
    5) "v0"
    
    //弹出最左边的元素 
    127.0.0.1:6379> lpop list
    "v4"
    
    //弹出最右边的元素
    127.0.0.1:6379> rpop list
    "v0"
    127.0.0.1:6379> lrange list 0 -1
    1) "v3"
    2) "v2"
    3) "v1"
    
    //获取列表的长度
    127.0.0.1:6379> llen list
    (integer) 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    3.4 Set(集合)

    3.4.1 特点

    无序、不重复。

    3.4.2 使用场景

    适用于需要存储唯一元素且不关心元素顺序的场景。常见的应用包括关注列表、粉丝列表、标签系统等。

    3.4.3 常用命令

    //往set集合中添加元素
    127.0.0.1:6379> sadd names zhangsan lisi wangwu zhaoliu
    (integer) 4
    
    //列出集合中的元素
    127.0.0.1:6379> smembers names
    1) "zhaoliu"
    2) "lisi"
    3) "wangwu"
    4) "zhangsan"
    
    //判断某个值在不在set中
    127.0.0.1:6379> sismember names zhangsan
    (integer) 1
    //查看集合的长度
    127.0.0.1:6379> scard names
    (integer) 4
    
    //删除set集合中指定元素 
    127.0.0.1:6379> srem names zhangsan
    (integer) 1
    127.0.0.1:6379> smembers names
    1) "zhaoliu"
    2) "lisi"
    3) "wangwu"
    
    //随机弹出集合中的元素
    127.0.0.1:6379> spop names 1
    1) "wangwu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3.5 ZSet(有序集合)

    3.5.1 特点

    有序、不重复,每个元素都关联一个分数(score)。

    3.5.2 使用场景

    适用于需要按照分数进行排序和范围查找的场景,如排行榜、计分系统等。

    3.5.3 常用命令

    //添加zset值
    127.0.0.1:6379> zadd c 20 java
    (integer) 1
    127.0.0.1:6379> zadd c 39 html
    (integer) 1
    127.0.0.1:6379> zadd c 59 css
    (integer) 1
    
    //查询zset中的值(根据score倒序)
    127.0.0.1:6379> zrevrange c 0 -1
    1) "css"
    2) "html"
    3) "java"
    
    //查询zset中的值(根据score正序)
    127.0.0.1:6379> zrange c 0 -1
    1) "java"
    2) "html"
    3) "css"
    
    //查询zset长度
    127.0.0.1:6379> zcard c
    (integer) 3
    
    //删除指定值
    127.0.0.1:6379> zrem c java
    (integer) 1
    127.0.0.1:6379> zrange c 0 -1
    1) "html"
    2) "css"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    2022年都在说软件测试饱和了?都在担心面试不上。
    11.9树的表示方法(孩子,父亲,孩子兄弟),树、森林的遍历,一些操作,决策树,前缀树
    django的csrf跨站请求伪造
    这个 人工智能学习路径靠谱吗?
    python3多进程和多线程使用场景如何区分
    『力扣刷题本』:链表分割
    Masked Autoencoders Are Scalable Vision Learners
    Vagrant+VirtualBox快速搭建Linux环境
    练习:注册页面
    pnpm 的 workspace 实现 monorepo 工程
  • 原文地址:https://blog.csdn.net/qq_58216564/article/details/134082607