软件安装
- Ubuntu 18.04(我本机) 下:
$ sudo apt-get update$ sudo apt-get install redis-server复制代码
-
Windows 下:
直接到 下载
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复制代码
初级知识
学习网站 ->
Redis 基于键值对的形式存储数据,通常被认为是一种 NoSQL 数据库。
设置键值对
SET KEY VALUE复制代码
比如:
SET name 'fido'复制代码
根据键获取值
GET KEY复制代码
比如:
GET name复制代码
让键的值自增 1
INCR KEY复制代码
比如:
SET age 18INCR age复制代码
自增后 age 的值为 19
让键的值自减 1
DECR KEY复制代码
比如:
DECR age复制代码
自减后 age 的值为 18
**为什么会有自增和自减操作呢?**我们可以在自己的代码里面完成这些操作的啊:
x = GET agex = x + 1SET 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 是一系列有序值的集合。比较重要的操作指令包括:LPUSH
、RPUSH
、LPOP
、RPOP
、LLEN
和 LRANGE
。
下面分别介绍这些指令的含义。
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 里面的元素是无序且不重复的。
主要的操作命令有SADD
、SREM
、SISMEMBER
、SMEMBERS
和 SUNION
。
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 test1SADD name1 test2SADD name2 test3SUNIONSTORE name name1 name2SMEMBERS 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 18HSET 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 数据结构的操作命令可以参考:
Redis 事务
Redis 事务是一系列批量执行的 Redis 命令,区别于数据库事务,Redis 事务不存在回滚机制,在某条命令执行失败后不会取消事务,对于错误之前修改的数据也不会回滚。
Redis 事务主要依赖三条命令:MULTI
、EXEC
, WATCH
和 DISCARD
。
执行事务的步骤如下:
MULTISET name test1SET name test2GET name EXEC复制代码
如果想取消事务,键入DISCARD
命令:
MULTISET name test1SET name test2GET name DISCARD复制代码
WATCH
命令用于监控某个或某几个键,一旦键的值被修改,则事务取消。监控会持续到 EXEC
命令执行。
通过 WATCH
可以实现 CAS(check and set)机制,在某种程度上使操作具有原子性,防止了分布式(或多线程)同时修改数据时可能出现的错误。
Redis 单个命令的操作是原子性的,但是事务并不具有原子性,所以对于数据的操作要谨慎。
在 Node 中使用 Redis
在 Node 中使用 Redis,需要通过驱动进行连接,然后进行相应的操作。最常用的驱动当属:。该模块允许你按照指定的配置连接 Redis,然后进行数据操作。也有人对 node-redis
进行了进一步的封装:,该模块在程序中可以维持一个公用的 Redis 连接,可有效减少数据库的连接数,提高数据库的效率。