Redis学习笔记:快速入门

288 阅读6分钟

Redis学习笔记系列文章共六篇:

  1. Redis学习笔记:快速入门
  2. Redis学习笔记:核心概念
  3. Redis学习笔记:性能优化
  4. Redis学习笔记:分布式方案
  5. Redis学习笔记:springboot实战(附封装完成代码)
  6. 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)

image.png

上面的图片是一个字符串的例子,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)

image.png

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)

image.png

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)

image.png

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)

image.png

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数据缓存