We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
$ sudo apt-get update $ sudo apt-get install redis-server
Windows 下:
直接到 GitHub 下载 zip 包,解压出来然后把内容拷贝到你的某个目录下就可以了。 运行的时候需要把 cmd 路径切换到你的 Redis 所在的路径。如果觉得麻烦的话,可以把 Redis 所在的路径设置为环境变量。
zip
运行以下命令:
$ redis-server
或者 Windows 下直接运行 redis-server.exe。
redis-server.exe
$ redis-cli
或者 Windows 下直接运行 redis-cli.exe。
redis-cli.exe
我本机(Ubuntu 18.04)直接使用包管理器安装 redis,所以配置文件位于/etc/redis/redis.conf。
/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
INCR KEY
SET age 18 INCR age
自增后 age 的值为 19
DECR KEY
DECR age
自减后 age 的值为 18
**为什么会有自增和自减操作呢?**我们可以在自己的代码里面完成这些操作的啊:
x = GET age x = x + 1 SET age x
这段代码不就完成了自增操作吗?
这样做确实可以,但是并不符合数据操作的原子性,如果多个客户端同时取出同一个数据,然后进行了更新:
这样就出现问题了,因为我们期望 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
TTL KEY
TTL age
如果输出为 -2,表示数据已经被销毁,不再存在。如果输出为 -1,表示数据永不过期。
Redis 同样支持一些复杂点的数据结构,首先要讲的就是 list(列表),list 是一系列有序值的集合。比较重要的操作指令包括:LPUSH、RPUSH、LPOP、RPOP、LLEN 和 LRANGE。
LPUSH
RPUSH
LPOP
RPOP
LLEN
LRANGE
下面分别介绍这些指令的含义。
表示在列表的尾部插入一条数据:
RPUSH friends Tom
此时 friends 即为一个 list,里面只有一条数据即为 Tom。
RPUSH friends Jerry
此时 friends 仍然是一个 list,不过内部已有两条数据,分别为 Tom 和 Jerry。
表示在列表的尾部删除一条数据
RPOP friends
这条命令会在 friends 的尾部删除一条数据,并且返回删除的数据。
所以 RPOP 的意思应为 Right POP;RPUSH 的意思应为 Right PUSH。由此可知 LPUSH、LPOP 的意思。
获取某个 list 的长度。
LLEN friends
将返回对应 list 的长度。
返回某个 list 的子集,接受两个参数指定起始索引和截止索引(索引从 0 开始)。
LRANGE friends 0 -1
上面这条命令表示返回 friends 的所有元素,其中截止索引为 -1 表示所有。
输出结果大致如下:
1) "zzz" 2) "123"
Set 与 List 的区别在于 Set 里面的元素是无序且不重复的。
主要的操作命令有SADD、SREM、SISMEMBER、SMEMBERS 和 SUNION。
SADD
SREM
SISMEMBER
SMEMBERS
SUNION
SADD 命令会把指定的值添加到集合中:
SADD names 123
SREM 会把指定的值从集合中移出,意义为Set Remove。
Set Remove
SREM names 123
SISMEMBER 会检测给出的值是否是给定集合的元素。
SISMEMBER names 123
返回值为 1 或者 0,1 代表是,0 代表否。
SMEMBERS 返回集合的所有元素。
SMEMBERS names
输出格式大致如下:
1) "123"
SUNION 代表求出多个集合的并集。
SUNION names1 names2
返回结果是一个新的集合。
该命令表示求两个集合的交集。
SINTER names1 names2
返回结果为一个新的集合。
该命令表示求两个集合的差集。
SDIFF name1 name2
返回结果是 name1 中具有但是 name2 中没有的元素所组成的集合,即为差集。
与 SUNION 类似,但是区别于 SUNION,因为 SUNION 只会求出两个集合的交集,然后返回结果;但是 SUNIONSTORE 不仅会求出交集,还会把结果保存在目标集合中。如果目标集合已经存在,则会覆盖掉已有的集合。
SADD name1 test1 SADD name1 test2 SADD name2 test3 SUNIONSTORE name name1 name2 SMEMBERS name
执行上述命令后,name1 和 name2 的交集会保存在 name 集合中。
无序集合在实际应用中还是有一些掣肘,所以 Redis 1.2 引入了有序集合。
有序集合与普通的集合类似,但是每一项都有一个相关联的数值,这个数值用于在集合中进行排序。
ZADD 表示在一个有序集合中新增一项,ZADD 接受 3 个参数:
ZADD hackers 1912 "Alan Turing"
该命令返回有序集合的子集,与 LRANGE 类似。
ZRANGE names 0 -1
返回 names 的所有元素。
该命令返回一个子集,子集中每一项的 score 都位于 min 和 max 之间。
ZRANGEBYSCORE names 100 200
一个 Hash 可以在许多字段和字段的值之间构造映射关系,所以适合于表示对象。
该命令用于设置散列。
HSET person1 name "test" HSET person1 age 18 HSET person1 gender "male"
该命令用于返回某个 HASH 的所有数据。
HGETALL person1
输出结果如下:
1) "name" 2) "test" 3) "age" 4) "18" 5) "gender" 6) "male"
该命令含义为 hash multiple set,即一次设置多对映射关系。
hash multiple set
HMSET person2 name "test1" age 18 gender "female"
该命令表示获取 HASH 中某一个字段的值
HGET person1 name
同样的 HASH 结构中也有许多的原子性操作命令。
设置 HASH 中某个字段的值。
HSET person1 name "Jerry"
表示对 HASH 中的某个数值进行加操作。
HINCRBY person1 age 1
接受三个参数:
要想进行减操作时,参数 3 改成负数即可。
该命令表示删除 HASH 中的某一个属性。
HDEL person1 name
此时这个字段及其对应的值都会被删除掉。
更多 HASH 数据结构的操作命令可以参考:HASHES
Redis 事务是一系列批量执行的 Redis 命令,区别于数据库事务,Redis 事务不存在回滚机制,在某条命令执行失败后不会取消事务,对于错误之前修改的数据也不会回滚。
Redis 事务主要依赖三条命令:MULTI、EXEC, WATCH 和 DISCARD。
MULTI
EXEC
WATCH
DISCARD
执行事务的步骤如下:
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。该模块允许你按照指定的配置连接 Redis,然后进行数据操作。也有人对 node-redis 进行了进一步的封装:redis-connection,该模块在程序中可以维持一个公用的 Redis 连接,可有效减少数据库的连接数,提高数据库的效率。
node-redis
The text was updated successfully, but these errors were encountered:
No branches or pull requests
软件安装
Windows 下:
直接到 GitHub 下载
zip
包,解压出来然后把内容拷贝到你的某个目录下就可以了。运行的时候需要把 cmd 路径切换到你的 Redis 所在的路径。如果觉得麻烦的话,可以把 Redis 所在的路径设置为环境变量。
启动 Redis
运行以下命令:
或者 Windows 下直接运行
redis-server.exe
。打开 Redis 控制台
或者 Windows 下直接运行
redis-cli.exe
。配置 Redis
我本机(Ubuntu 18.04)直接使用包管理器安装 redis,所以配置文件位于
/etc/redis/redis.conf
。使用管理员权限打开该配置文件,即可进行配置:
初级知识
Redis 基于键值对的形式存储数据,通常被认为是一种 NoSQL 数据库。
设置键值对
比如:
根据键获取值
比如:
让键的值自增 1
比如:
自增后 age 的值为 19
让键的值自减 1
比如:
自减后 age 的值为 18
**为什么会有自增和自减操作呢?**我们可以在自己的代码里面完成这些操作的啊:
这段代码不就完成了自增操作吗?
这样做确实可以,但是并不符合数据操作的原子性,如果多个客户端同时取出同一个数据,然后进行了更新:
这样就出现问题了,因为我们期望 age 的值变成 20,现在却只增加了 1。
这就是为什么 Redis 提供了这些原子性操作。
删除某个键值对
比如
之后 age 的值就不存在了。
如果不存在就创建键值对
表示如果 KEY 键没有对应的值存储在 Redis 中,则创建一个新的键值对进行存储。
存储具有过期时间的键值对
EXPIRE 命令可以指定某个键值对的有效时长,单位为秒。在指定的时长过后,数据将不存在。
比如:
该命令表示 100 秒后 age 将被销毁。
使用
TTL
命令可以查看剩余有效时长:比如:
如果输出为 -2,表示数据已经被销毁,不再存在。如果输出为 -1,表示数据永不过期。
List 数据结构
Redis 同样支持一些复杂点的数据结构,首先要讲的就是 list(列表),list 是一系列有序值的集合。比较重要的操作指令包括:
LPUSH
、RPUSH
、LPOP
、RPOP
、LLEN
和LRANGE
。下面分别介绍这些指令的含义。
RPUSH
表示在列表的尾部插入一条数据:
此时 friends 即为一个 list,里面只有一条数据即为 Tom。
此时 friends 仍然是一个 list,不过内部已有两条数据,分别为 Tom 和 Jerry。
RPOP
表示在列表的尾部删除一条数据
这条命令会在 friends 的尾部删除一条数据,并且返回删除的数据。
所以 RPOP 的意思应为 Right POP;RPUSH 的意思应为 Right PUSH。由此可知 LPUSH、LPOP 的意思。
LLEN
获取某个 list 的长度。
将返回对应 list 的长度。
LRANGE
返回某个 list 的子集,接受两个参数指定起始索引和截止索引(索引从 0 开始)。
上面这条命令表示返回 friends 的所有元素,其中截止索引为 -1 表示所有。
输出结果大致如下:
Set 数据结构
Set 与 List 的区别在于 Set 里面的元素是无序且不重复的。
主要的操作命令有
SADD
、SREM
、SISMEMBER
、SMEMBERS
和SUNION
。SADD
SADD 命令会把指定的值添加到集合中:
SREM
SREM 会把指定的值从集合中移出,意义为
Set Remove
。SISMEMBER
SISMEMBER 会检测给出的值是否是给定集合的元素。
返回值为 1 或者 0,1 代表是,0 代表否。
SMEMBERS
SMEMBERS 返回集合的所有元素。
输出格式大致如下:
SUNION
SUNION 代表求出多个集合的并集。
返回结果是一个新的集合。
SINTER
该命令表示求两个集合的交集。
返回结果为一个新的集合。
SDIFF
该命令表示求两个集合的差集。
返回结果是 name1 中具有但是 name2 中没有的元素所组成的集合,即为差集。
SUNIONSTORE
与 SUNION 类似,但是区别于 SUNION,因为 SUNION 只会求出两个集合的交集,然后返回结果;但是 SUNIONSTORE 不仅会求出交集,还会把结果保存在目标集合中。如果目标集合已经存在,则会覆盖掉已有的集合。
执行上述命令后,name1 和 name2 的交集会保存在 name 集合中。
Sorted Set(有序集合)数据结构
无序集合在实际应用中还是有一些掣肘,所以 Redis 1.2 引入了有序集合。
有序集合与普通的集合类似,但是每一项都有一个相关联的数值,这个数值用于在集合中进行排序。
ZADD
ZADD 表示在一个有序集合中新增一项,ZADD 接受 3 个参数:
比如:
ZRANGE
该命令返回有序集合的子集,与 LRANGE 类似。
返回 names 的所有元素。
ZRANGEBYSCORE
该命令返回一个子集,子集中每一项的 score 都位于 min 和 max 之间。
散列数据结构
一个 Hash 可以在许多字段和字段的值之间构造映射关系,所以适合于表示对象。
HSET
该命令用于设置散列。
HGETALL
该命令用于返回某个 HASH 的所有数据。
输出结果如下:
HMSET
该命令含义为
hash multiple set
,即一次设置多对映射关系。HGET
该命令表示获取 HASH 中某一个字段的值
同样的 HASH 结构中也有许多的原子性操作命令。
HSET
设置 HASH 中某个字段的值。
HINCRBY
表示对 HASH 中的某个数值进行加操作。
接受三个参数:
要想进行减操作时,参数 3 改成负数即可。
HDEL
该命令表示删除 HASH 中的某一个属性。
此时这个字段及其对应的值都会被删除掉。
更多 HASH 数据结构的操作命令可以参考:HASHES
Redis 事务
Redis 事务是一系列批量执行的 Redis 命令,区别于数据库事务,Redis 事务不存在回滚机制,在某条命令执行失败后不会取消事务,对于错误之前修改的数据也不会回滚。
Redis 事务主要依赖三条命令:
MULTI
、EXEC
,WATCH
和DISCARD
。执行事务的步骤如下:
如果想取消事务,键入
DISCARD
命令:WATCH
命令用于监控某个或某几个键,一旦键的值被修改,则事务取消。监控会持续到EXEC
命令执行。通过
WATCH
可以实现 CAS(check and set)机制,在某种程度上使操作具有原子性,防止了分布式(或多线程)同时修改数据时可能出现的错误。Redis 单个命令的操作是原子性的,但是事务并不具有原子性,所以对于数据的操作要谨慎。
在 Node 中使用 Redis
在 Node 中使用 Redis,需要通过驱动进行连接,然后进行相应的操作。最常用的驱动当属:node-redis。该模块允许你按照指定的配置连接 Redis,然后进行数据操作。也有人对
node-redis
进行了进一步的封装:redis-connection,该模块在程序中可以维持一个公用的 Redis 连接,可有效减少数据库的连接数,提高数据库的效率。常见问题
The text was updated successfully, but these errors were encountered: