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 常用命令

c 复制代码
//存入键值对
set key value

//获取键对应的值
get key
c 复制代码
//查看当前库的所有数据
keys *
c 复制代码
//判断key是否存在,存在返回1,不存在返回0
EXISTS key

//查看key对应的value的字符串长度
STRLEN key
c 复制代码
//追加value到key所对应的value之后
APPEND key value

//追加,key存在的话,拼接'+',返回总长度
 APPEND key , value
c 复制代码
//指定key对应的value的数据自增1,返回结果
incr key

//指定key对应的value的数据自减1,返回结果
decr key
c 复制代码
//设置key对应的value指定时间内过期
setex key timeout value 

//获取剩余时间 
ttl key

3.2 Hash(哈希)

3.2.1 特点

键值对存储、无序。

3.2.2 使用场景

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

3.2.3 常用命令

c 复制代码
//添加hash
hset key hashkey hashvalue

//获取hash中 hashkey对应的hashvalue
hget key hashkey  

//获取hash中所有的hashkey hashvalue
hgetall key 

//获取指定hash中的所有key
hkeys hashkey

//获取指定hash中的所有value
hvals hashvalue
c 复制代码
//获取指定hash的长度
hlen key 

//判断hashkey是否存在于指定的hash,存在返回1,不存在返回0
HEXISTS key hashkey

//根据hashkey 删除hash对象的键值对 
hdel  key hashkey  

3.3 List(列表)

3.3.1 特点

有序、可重复。

3.3.2 使用场景

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

3.3.3 常用命令

c 复制代码
//新增一个集合
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"

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

c 复制代码
//往列表的左边添加数据
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

3.4 Set(集合)

3.4.1 特点

无序、不重复。

3.4.2 使用场景

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

3.4.3 常用命令

c 复制代码
//往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"

3.5 ZSet(有序集合)

3.5.1 特点

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

3.5.2 使用场景

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

3.5.3 常用命令

c 复制代码
//添加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"
相关推荐
Karoku06613 分钟前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
fpcc1 小时前
redis6.0之后的多线程版本的问题
c++·redis
小技与小术1 小时前
数据库表设计范式
数据库·mysql
刘九灵1 小时前
Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构
redis·缓存
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer1 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员