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"