Fork me on GitHub

Redis 学习笔记

软件安装

  • Ubuntu 18.04(我本机) 下:
$ sudo apt-get update
$ sudo apt-get install redis-server
  • Windows 下:

    直接到 GitHub 下载 zip 包,解压出来然后把内容拷贝到你的某个目录下就可以了。
    运行的时候需要把 cmd 路径切换到你的 Redis 所在的路径。如果觉得麻烦的话,可以把 Redis 所在的路径设置为环境变量。

启动 Redis

运行以下命令:

$ redis-server

或者 Windows 下直接运行 redis-server.exe

打开 Redis 控制台

$ redis-cli

或者 Windows 下直接运行 redis-cli.exe

配置 Redis

我本机(Ubuntu 18.04)直接使用包管理器安装 redis,所以配置文件位于/etc/redis/redis.conf

使用管理员权限打开该配置文件,即可进行配置:

$ sudo vim /etc/redis/redis.conf

初级知识

学习网站 -> try.redis.io/

Redis 基于键值对的形式存储数据,通常被认为是一种 NoSQL 数据库。

设置键值对

SET KEY VALUE

比如:

SET name 'fido'

根据键获取值

GET KEY

比如:

GET name

让键的值自增 1

INCR KEY

比如:

SET age 18
INCR age

自增后 age 的值为 19

让键的值自减 1

DECR KEY

比如:

DECR age

自减后 age 的值为 18

为什么会有自增和自减操作呢?我们可以在自己的代码里面完成这些操作的啊:

x = GET age
x = x + 1
SET age x

这段代码不就完成了自增操作吗?

这样做确实可以,但是并不符合数据操作的原子性,如果多个客户端同时取出同一个数据,然后进行了更新:

  • 客户端 1 拿到了 age 为 18
  • 客户端 2 拿到了 age 为 18
  • 客户端 1 修改了 age 为 19
  • 客户端 2 修改了 age 为 19

这样就出现问题了,因为我们期望 age 的值变成 20,现在却只增加了 1。

这就是为什么 Redis 提供了这些原子性操作。

删除某个键值对

DEL KEY

比如

DEL age

之后 age 的值就不存在了。

如果不存在就创建键值对

SETNX KEY VALUE

表示如果 KEY 键没有对应的值存储在 Redis 中,则创建一个新的键值对进行存储。

存储具有过期时间的键值对

EXPIRE KEY TIME

EXPIRE 命令可以指定某个键值对的有效时长,单位为秒。在指定的时长过后,数据将不存在。

比如:

EXPIRE age 100

该命令表示 100 秒后 age 将被销毁。

使用 TTL 命令可以查看剩余有效时长:

TTL KEY

比如:

TTL age

如果输出为 -2,表示数据已经被销毁,不再存在。如果输出为 -1,表示数据永不过期。

List 数据结构

Redis 同样支持一些复杂点的数据结构,首先要讲的就是 list(列表),list 是一系列有序值的集合。比较重要的操作指令包括:LPUSHRPUSHLPOPRPOPLLENLRANGE

下面分别介绍这些指令的含义。

RPUSH

表示在列表的尾部插入一条数据:

RPUSH friends Tom

此时 friends 即为一个 list,里面只有一条数据即为 Tom。

RPUSH friends Jerry

此时 friends 仍然是一个 list,不过内部已有两条数据,分别为 Tom 和 Jerry。

RPOP

表示在列表的尾部删除一条数据

RPOP friends

这条命令会在 friends 的尾部删除一条数据,并且返回删除的数据。

所以 RPOP 的意思应为 Right POP;RPUSH 的意思应为 Right PUSH。由此可知 LPUSH、LPOP 的意思。

LLEN

获取某个 list 的长度。

LLEN friends

将返回对应 list 的长度。

LRANGE

返回某个 list 的子集,接受两个参数指定起始索引和截止索引(索引从 0 开始)。

LRANGE friends 0 -1

上面这条命令表示返回 friends 的所有元素,其中截止索引为 -1 表示所有。

输出结果大致如下:

1) "zzz"
2) "123"

Set 数据结构

Set 与 List 的区别在于 Set 里面的元素是无序且不重复的。

主要的操作命令有SADDSREMSISMEMBERSMEMBERSSUNION

SADD

SADD 命令会把指定的值添加到集合中:

SADD names 123

SREM

SREM 会把指定的值从集合中移出,意义为Set Remove

SREM names 123

SISMEMBER

SISMEMBER 会检测给出的值是否是给定集合的元素。

SISMEMBER names 123

返回值为 1 或者 0,1 代表是,0 代表否。

SMEMBERS

SMEMBERS 返回集合的所有元素。

SMEMBERS names

输出格式大致如下:

1) "123"

SUNION

SUNION 代表求出多个集合的并集。

SUNION names1 names2

返回结果是一个新的集合。

SINTER

该命令表示求两个集合的交集。

SINTER names1 names2

返回结果为一个新的集合。

SDIFF

该命令表示求两个集合的差集。

SDIFF name1 name2

返回结果是 name1 中具有但是 name2 中没有的元素所组成的集合,即为差集。

SUNIONSTORE

与 SUNION 类似,但是区别于 SUNION,因为 SUNION 只会求出两个集合的交集,然后返回结果;但是 SUNIONSTORE 不仅会求出交集,还会把结果保存在目标集合中。如果目标集合已经存在,则会覆盖掉已有的集合。

SADD name1 test1
SADD name1 test2
SADD name2 test3
SUNIONSTORE name name1 name2
SMEMBERS name

执行上述命令后,name1 和 name2 的交集会保存在 name 集合中。

Sorted Set(有序集合)数据结构

无序集合在实际应用中还是有一些掣肘,所以 Redis 1.2 引入了有序集合

有序集合与普通的集合类似,但是每一项都有一个相关联的数值,这个数值用于在集合中进行排序。

ZADD

ZADD 表示在一个有序集合中新增一项,ZADD 接受 3 个参数:

  • 参数 1 表示有序集合的名称
  • 参数 2 表示新增项的排序数值
  • 参数 3 表示新增项的值

比如:

ZADD hackers 1912 "Alan Turing"

ZRANGE

该命令返回有序集合的子集,与 LRANGE 类似。

ZRANGE names 0 -1

返回 names 的所有元素。

ZRANGEBYSCORE

该命令返回一个子集,子集中每一项的 score 都位于 min 和 max 之间。

ZRANGEBYSCORE names 100 200

散列数据结构

一个 Hash 可以在许多字段和字段的值之间构造映射关系,所以适合于表示对象。

HSET

该命令用于设置散列。

HSET person1 name "test"
HSET person1 age 18
HSET person1 gender "male"

HGETALL

该命令用于返回某个 HASH 的所有数据。

HGETALL person1

输出结果如下:

1) "name"
2) "test"
3) "age"
4) "18"
5) "gender"
6) "male"

HMSET

该命令含义为 hash multiple set,即一次设置多对映射关系。

HMSET person2 name "test1" age 18 gender "female"

HGET

该命令表示获取 HASH 中某一个字段的值

HGET person1 name

同样的 HASH 结构中也有许多的原子性操作命令。

HSET

设置 HASH 中某个字段的值。

HSET person1 name "Jerry"

HINCRBY

表示对 HASH 中的某个数值进行加操作。

HINCRBY person1 age 1

接受三个参数:

  • 参数 1 表示要操作的 HASH 结构
  • 参数 2 表示要操作的字段
  • 参数 3 表示要增加的值

要想进行减操作时,参数 3 改成负数即可。

HDEL

该命令表示删除 HASH 中的某一个属性。

HDEL person1 name

此时这个字段及其对应的值都会被删除掉。

更多 HASH 数据结构的操作命令可以参考:HASHES

Redis 事务

Redis 事务是一系列批量执行的 Redis 命令,区别于数据库事务,Redis 事务不存在回滚机制,在某条命令执行失败后不会取消事务,对于错误之前修改的数据也不会回滚。

Redis 事务主要依赖三条命令:MULTIEXECWATCHDISCARD

执行事务的步骤如下:

MULTI
SET name test1
SET name test2
GET name 
EXEC

如果想取消事务,键入DISCARD 命令:

MULTI
SET name test1
SET name test2
GET name 
DISCARD

WATCH 命令用于监控某个或某几个键,一旦键的值被修改,则事务取消。监控会持续到 EXEC 命令执行。

通过 WATCH 可以实现 CAS(check and set)机制,在某种程度上使操作具有原子性,防止了分布式(或多线程)同时修改数据时可能出现的错误。

Redis 单个命令的操作是原子性的,但是事务并不具有原子性,所以对于数据的操作要谨慎。

在 Node 中使用 Redis

在 Node 中使用 Redis,需要通过驱动进行连接,然后进行相应的操作。最常用的驱动当属:node-redis。该模块允许你按照指定的配置连接 Redis,然后进行数据操作。也有人对 node-redis 进行了进一步的封装:redis-connection,该模块在程序中可以维持一个公用的 Redis 连接,可有效减少数据库的连接数,提高数据库的效率。

常见问题

posted @ 2019-01-30 21:37  钟衷7  阅读(148)  评论(0编辑  收藏  举报