Redis 学习笔记

软件安装

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

    直接到 GitHub 下载 zip 包,解压出来而后把内容拷贝到你的某个目录下就能够了。
    运行的时候须要把 cmd 路径切换到你的 Redis 所在的路径。若是以为麻烦的话,能够把 Redis 所在的路径设置为环境变量。node

启动 Redis

运行如下命令:git

$ redis-server

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

打开 Redis 控制台

$ redis-cli

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

配置 Redis

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

使用管理员权限打开该配置文件,便可进行配置:数据库

$ sudo vim /etc/redis/redis.conf

初级知识

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

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

设置键值对

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 链接,可有效减小数据库的链接数,提升数据库的效率。

常见问题

相关文章
相关标签/搜索