综述
什么是Redis
Redis官网------<Redis.io>
Redis, 作为一个高性能的键值对数据库,主要应用于以下场景:
-
缓存系统:由于其高速读写能力,Redis 非常适合用作缓存系统,减少数据库负载。
-
会话存储(Session Store):Redis 可以存储用户会话信息,常用于网站登录系统。
-
消息队列系统:利用其发布/订阅模式,Redis 可作为消息队列使用,用于异步处理任务。
-
实时分析:Redis 的速度使其成为实时数据处理的理想选择,如计数器、实时统计等。
-
排行榜系统:使用 Redis 的排序集合,可以高效实现排行榜功能。
-
地理空间数据存储:Redis 提供地理空间相关的数据结构,可以用于地理位置相关功能。
-
持久化存储:虽然 Redis 是内存数据库,但它支持数据持久化,可用于需要快速读写且偶尔需要持久化的场景。
这些应用场景展示了 Redis 的灵活性和高性能,使其成为现代Web应用中不可或缺的一部分。
Redis数据结构的实际应用场景
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | - |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1. 最新消息排行等功能(比如朋友圈的时间线) 2. 消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1. 添加、删除,查找的复杂度都是O(1) 2. 为集合提供了求交集、并集、差集等操作 | 1. 共同好友 2. 利用唯一性,统计访问网站的所有独立ip 3. 好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1. 排行榜 2.带权重的消息队列 |
安装 & 配置
Redis在Ubuntu安装
- 更新包列表:
在安装新软件之前,最好更新系统的包列表。打开终端并输入以下命令:
bash
sudo apt update
- 安装Redis:
使用apt
包管理器安装Redis。在终端输入以下命令:
bash
sudo apt install redis-server
- 验证Redis安装:
安装完成后,可以通过检查Redis服务的状态来验证是否安装成功。输入以下命令:
bash
sudo systemctl status redis-server
如果Redis服务正在运行,你将看到状态为"active (running)"。
- 配置Redis(可选):
如果需要对Redis进行配置,可以编辑其配置文件。默认情况下,Redis配置文件位于/etc/redis/redis.conf
。使用你喜欢的文本编辑器打开它,例如:
bash
sudo nano /etc/redis/redis.conf
在这里,你可以根据需要更改各种设置,例如内存使用限制、持久化选项等。
- 启动Redis服务:
如果Redis服务没有自动启动,你可以使用以下命令手动启动它:
bash
sudo systemctl start redis-server
要使Redis在系统启动时自动启动,可以使用以下命令:
bash
sudo systemctl enable redis-server
- 测试Redis:
安装完成后,你可以测试Redis是否正常工作。在终端输入redis-cli
,然后在Redis提示符下输入ping
,如果一切正常,你将收到PONG
的回应。
如果要配置外网访问,执行
sudo ufw allow 6378
并配置相应的端口映射 / 端口开放 / 内网穿透即可。
RedisInsight的安装(可选)
数据库连接工具有很多种,比如Jetbrain
的DataGrip
,Mysql
官方的MysqlWorkbanch
,如果你想的话,也可以直接使用redis-cli
进行操作,但是如果你想要官方 的使用体验,可以安装RedisInsight
-
安装好后界面如图:
-
添加数据库连接:(如果你是部署和连接都在Ubuntu上,那么设置都不需要动)
-
界面如图:
-
点击左侧
WorkBench
-
准备完成。
--raw参数
如果你想继续使用Redis
原生的命令行工具,直接在终端上输入redis-cli
即可启动redis
客户端。
bash
redis-cli --raw
--raw
------代表以原始形式来显示内容,Redis的字符串都是以二进制方式存储的,输入中文的话只会输出一堆16进制的代码。使用raw参数可以让客户端自动解码。
Redis基础语法 ## Redis基本增删查改 ### SET 增加和修改 Redis中的数据都是以Key-Value键值对的形式存储的,使用`SET`命令来设置一个Key-Value键值对: ```SQL SET name gulugulu1103 ``` 返回`OK`: ```SQL 127.0.0.1:6379> SET name gulugulu1103 OK ```
GET 查找
使用GET命令+Key。
注意:Redis大小写敏感。
SQL
GET name
返回相应的Value:
BASH
"gulugulu1103"
如果
GET
命令后面的Key未定义,则会返回(nil)
DEL 删除
使用DEL
命令+Key
SQL
DEL name
若删除成功,则会返回(interger) 1
若删除失败,则会返回(interger) 0
删除失败的原因基本上是两种:
- Key不存在
- Key被占用
EXISTS 判断是否存在Key
SQL
EXISTS name
若存在,返回(interger) 1
若不存在,返回(interger) 0
SETNX 不替换的设置
SQL
SETNX name gulugulu1104
若成功替换,则返回(interger) 1
若失败替换,则返回(interger) 0
KEYS 查询库中有哪些Key
使用KEYS
+ pattern
进行查询
SQL
EXISTS *
若没有Key,则返回(empty array)
若有Key,则按列表模式返回所有Key的字符串。
BASH
127.0.0.1:6379> KEYS *
1) "name2"
2) "name1"
3) "name"
FLUSHALL
删除所有Key**(谨慎使用)**
若删除成功,则返回OK
Redis数据结构
以下不提供具体实例,只提供语法。小写字母均代表抽象定义,如
key
代表键,value
代表值。下列语法中,[]代表可选参数,...代表可重复
列表(List)
到这里可能有点没反应过来,其实类比编程语言,我们可以把key看成是变量名,把value看成是变量的值,这样就很好理解使用Key-Value Pair去存储Redis中的数据了。
LPUSH & RPUSH 在列表首位添加
SQL
LPUSH key value [value ...]
RPUSH key value [value ...]
--> (interger) 列表长度
LRANGE & RRANGE 查询列表内容
SQL
LRANGE key start stop
RRANGE key start stop
start <-- 0 表示第一个元素
stop <-- -1 表示最后一个元素
若start > stop,--> (empty list or set)
LPOP & RPOP 删除元素
SQL
LPOP key [count]
RPOP key [count]
[count] <-- 默认为1
若count > size,则全部删除
若count == 1,--> 被删元素
若count > 1,--> 被删子列表
LTRIM 仅保留范围内元素
SQL
LTRIM key start stop
--> "OK"
LLEN 查看列表长度
SQL
LLEN key
--> (interger) 数组长度
若key不存在,--> (interger) 0
集合 (Set)
在Redis中,集合(Set)是由字符串类型元素组成的无序集合。集合是通过哈希表实现的,这意味着添加、删除和查找元素的复杂度都是O(1)。
Tips:集合(Set)相关的命令都是以S开头的。
SADD 添加元素
SQL
SADD key member [member ...]
--> (interger) 1 表示成功
--> (interger) 0 表示失败,可能已经包含该元素
SMEMBERS 查看元素
SQL
SMEMBERS key
--> 返回该集合中的列表
SISMEMBERS 判断是否在集合中
SQL
SISMEMBERS key member
--> (interger) 1 表示存在
--> (interger) 0 表示不存在
SREM 删除元素
SQL
SREM key member [member ...]
--> (interger) 1 表示删除成功
--> (interger) 0 表示删除失败,可能是key值不存在或value不存在
集合运算(进阶)
SUNION - 合并集合
SQL
SUNION key [key ...]
--> 返回一个集合的并集。不同集合之间的元素互不相同。
SINTER - 交集运算
SQL
SINTER key [key ...]
--> 返回一个集合的交集。只包含同时存在于所有给定集合中的元素。
SDIFF - 差集运算
SQL
SDIFF key [key ...]
--> 返回一个集合与其他集合的差集。仅包含存在于第一个集合中,但不在其他给定集合中的元素。
SUNIONSTORE - 合并集合并存储
SQL
SUNIONSTORE destination key [key ...]
--> 此命令等同于SUNION,但它将结果存储在destination集合中,而不是简单地返回结果集。
SINTERSTORE - 交集运算并存储
SQL
SINTERSTORE destination key [key ...]
--> 此命令等同于SINTER,但它将结果存储在destination集合中。
SDIFFSTORE - 差集运算并存储
SQL
SDIFFSTORE destination key [key ...]
--> 此命令等同于SDIFF,但它将结果存储在destination集合中。
有序集合 (Sorted Set)
在Redis中,有序集合(Sorted Set)是集合的一种变体,每个元素都会关联一个双精度浮点数分数。Redis正是通过分数来为集合中的元素进行从小到大的排序。有序集合的元素是唯一的,但分数(score)可以重复。
Tips:有序集合(Sorted Set)相关的命令都是以Z开头的。
ZADD 添加或更新元素
SQL
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
NX
:只有当成员不存在于有序集合中时,才会添加该成员。
XX
:只有当成员已经存在于有序集合中时,才会更新该成员的分数。
CH
:修改返回值的行为。如果指定了此选项,命令会返回被添加或被更新的成员的数量。如果没有指定CH,则只返回被添加的新成员的数量。
INCR
:用于将分数增加到已有成员的分数上,而不是替换它。如果使用了这个选项,只能指定一个成员及其分数。这个选项实质上将ZADD命令的行为变为一个增量更新,类似于INCRBY命令。
--> (interger) 返回被成功添加或更新的元素的数量。
ZRANGE 查看元素
SQL
ZRANGE key start stop [WITHSCORES]
--> 按分数值递增(从小到大)顺序返回有序集合中指定区间内的成员。
若指定了WITHSCORES选项,-->
bash
member
score
member
score
...
ZSCORE 获取成员分数
SQL
ZSCORE key member
--> 成员的分数值。
若成员不存在于有序集合中,--> (nil)
ZRANK 查看成员排名(升序)
SQL
ZRANK key member
--> 从小到大的索引
ZREVRANK 查看成员排名(降序)
SQL
ZREVRANK key member
--> 从大到小的索引
ZINCRBY增加成员分数
SQL
ZINCRBY key increment member
--> 该成员增加后的分数
若成员不存在,--> "-1"
ZREM 删除成员
SQL
ZREM key member [member ...]
--> (interger) 返回被成功删除的元素的数量。
有序集合运算(进阶)
ZUNIONSTORE - 合并多个有序集合
SQL
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
--> 计算给定的一个或多个有序集的并集,并将该并集(结果集)存储在destination中。
ZINTERSTORE - 有序集合交集
SQL
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
--> 计算给定的一个或多个有序集的交集,并将该交集(结果集)存储在destination中。
哈希 (Hash)
在 Redis 中,哈希是一种存储键值对的数据结构,用于存储对象。每个哈希可以存储多个字段(field)和对应的值(value),非常适合于存储和处理对象属性。哈希中的字段是唯一的,但值可以重复。
Tips:哈希(Hash)相关的命令都是以H开头的。
HSET 添加或更新字段
SQL
HSET key field value [field value ...]
- 如果字段已存在于哈希key中,值会被更新。
- 如果字段不存在,则字段会被创建并设置值。
--> (integer) 返回新增字段的数量。
HGET 获取字段的值
SQL
HGET key field
--> 返回哈希表中指定字段的值。
如果字段不存在,--> (nil)
HMSET 设置多个字段的值
SQL
HMSET key field1 value1 [field2 value2 ...]
--> 同时设置一个或多个字段的值。
--> 返回 OK。
HMGET 获取多个字段的值
SQL
HMGET key field1 [field2 ...]
--> 返回哈希表中一个或多个指定字段的值。
HDEL 删除字段
SQL
HDEL key field [field ...]
--> 删除一个或多个字段。
--> (integer) 返回被成功删除的字段数量。
HEXISTS 检查字段是否存在
SQL
HEXISTS key field
--> 检查字段是否存在于哈希表中。
--> (integer) 1 表示存在,0 表示不存在。
HLEN 获取字段数量
SQL
HLEN key
--> 返回哈希表中字段的数量。
HKEYS 获取所有字段名
SQL
HKEYS key
--> 返回哈希表中所有字段的名称。
HVALS 获取所有字段值
SQL
HVALS key
--> 返回哈希表中所有字段的值。
HGETALL 获取所有字段和值
SQL
HGETALL key
--> 返回哈希表中的所有字段和值。