Redis学习笔记系列文章共六篇:
- Redis学习笔记:快速入门
- Redis学习笔记:核心概念
- Redis学习笔记:性能优化
- Redis学习笔记:分布式方案
- Redis学习笔记:springboot实战(附封装完成代码)
- Redis学习笔记:常见面试题及答案
写这个系列文章一是为了查漏补缺,二是帮助更多小伙伴快速掌握Redis核心知识,本文是第一篇,现在开始吧。
什么是Redis
Redis 是一种非常快速的非关系型数据库,可以存储从key到五种不同类型value的映射。Redis 支持磁盘上的内存中持久存储、复制以扩展读取性能,以及客户端分片用来扩展写入性能。
Redis和其他数据库的对比
名称 | 类型 | 数据存储选项 | 查询类型 | 附加的功能 |
---|---|---|---|---|
Redis | 非关系型数据库 | 字符串、列表、集合、哈希、排序集合 | 用于常见访问模式的每种数据类型的命令,具有批量操作和部分事务支持 | 发布/订阅、主/从复制、磁盘持久化、脚本(存储过程) |
MySQL | 关系型数据库 | 行表数据库、表视图、空间和第三方扩展 | SELECT、INSERT、UPDATE、DELETE、函数、存储 过程 | ACID 兼容(使用 InnoDB),主/从和主/主复制 |
PostgreSQL | 关系型数据库 | 行表数据库、表 视图、空间和第三方扩展、可定制类型 | SELECT、INSERT、UPDATE、DELETE、内置函数、自定义存储过程 | ACID 兼容,主/从复制,多主复制(第三方) |
MongoDB | 非关系文档存储 | 无模式 BSON 文档表的数据库 | 用于创建、读取、更新、删除、条件查询 等的命令 | 支持map-reduce操作、主/从复制、分片、空间索引 |
Redis特点和优点
特点
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优点
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis数据结构
字符串(String)
上面的图片是一个字符串的例子,value:world对应 key:hello。
常用操作:
指令 | 描述 |
---|---|
GET | 获取存储在指定key上的数据 |
SET | 存储value在指定key上 |
DEL | 删除存储在指定key上的值(适用于所有类型) |
示例:
redis 127.0.0.1:6379> set hello world
OK
redis 127.0.0.1:6379> get hello
"world"
redis 127.0.0.1:6379> del hello
(integer) 1
redis 127.0.0.1:6379> get hello
(nil)
列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常用操作:
指令 | 描述 |
---|---|
RPUSH | 在列表中添加一个或多个值 |
LRANGE | 获取列表指定范围内的元素 |
LINDEX | 通过索引获取列表中的元素 |
LPOP | 移出并获取列表的第一个元素 |
示例:
redis 127.0.0.1:6379> rpush list-key item
(integer) 1
redis 127.0.0.1:6379> rpush list-key item2
(integer) 2
redis 127.0.0.1:6379> rpush list-key item
(integer) 3
redis 127.0.0.1:6379> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
redis 127.0.0.1:6379> lpop list-key
"item"
redis 127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用操作:
指令 | 描述 |
---|---|
SADD | 向集合添加一个或多个成员 |
SMEMBERS | 返回集合中的所有成员 |
SISMEMBER | 判断 member 元素是否是集合 key 的成员 |
SREM | 移除集合中一个或多个成员 |
示例:
redis 127.0.0.1:6379> sadd set-key item
(integer) 1
redis 127.0.0.1:6379> sadd set-key item2
(integer) 1
redis 127.0.0.1:6379> sadd set-key item3
(integer) 1
redis 127.0.0.1:6379> sadd set-key item
(integer) 0
redis 127.0.0.1:6379> smembers set-key
1) "item"
2) "item2"
3) "item3"
redis 127.0.0.1:6379> sismember set-key item4
(integer) 0
redis 127.0.0.1:6379> sismember set-key item
(integer) 1
redis 127.0.0.1:6379> srem set-key item2
(integer) 1
redis 127.0.0.1:6379> srem set-key item2
(integer) 0
redis 127.0.0.1:6379> smembers set-key
1) "item"
2) "item3"
哈希(Hash)
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
常用操作:
指令 | 描述 |
---|---|
HSET | 将哈希表 key 中的字段 field 的值设为 value 。 |
HGET | 获取存储在哈希表中指定字段的值。 |
HGETALL | 获取在哈希表中指定 key 的所有字段和值 |
HDEL | 删除一个或多个哈希表字段,如果存在 |
示例:
redis 127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1
redis 127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
redis 127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 0
redis 127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
redis 127.0.0.1:6379> hdel hash-key sub-key2
(integer) 1
redis 127.0.0.1:6379> hdel hash-key sub-key2
(integer) 0
redis 127.0.0.1:6379> hget hash-key sub-key1
"value1"
redis 127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
有序集合(sorted set)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用操作:
指令 | 描述 |
---|---|
ZADD | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZRANGE | 通过索引区间返回有序集合指定区间内的成员 |
ZRANGEBYSCORE | 通过分数返回有序集合指定区间内的成员 |
ZREM | 移除有序集合中的一个或多个成员 |
示例:
redis 127.0.0.1:6379> zadd zset-key 728 member1
(integer) 1
redis 127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
redis 127.0.0.1:6379> zadd zset-key 982 member0
(integer) 0
redis 127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
redis 127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
redis 127.0.0.1:6379> zrem zset-key member1
(integer) 1
redis 127.0.0.1:6379> zrem zset-key member1
(integer) 0
redis 127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
常见应用
- 登录token,cookie缓存
- 购物车
- 网页缓存
- json数据缓存