博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 学习笔记
阅读量:5739 次
发布时间:2019-06-18

本文共 4517 字,大约阅读时间需要 15 分钟。

软件安装

  • 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 是一系列有序值的集合。比较重要的操作指令包括: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 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 事务主要依赖三条命令:MULTIEXECWATCHDISCARD

执行事务的步骤如下:

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 连接,可有效减少数据库的连接数,提高数据库的效率。

常见问题

转载地址:http://ftfzx.baihongyu.com/

你可能感兴趣的文章
POJ 2236 Wireless Network (并查集)
查看>>
python分类
查看>>
GitBlit (1)-- 在linux 安装 GitBlit 并运行
查看>>
Windows与Linux之间的文件自动同步
查看>>
程序是如何执行的(一)a=a+1
查看>>
go : 结构
查看>>
18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
理解WebKit和Chromium(电子书)
查看>>
爱——无题
查看>>
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>
【http】post和get请求的区别
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
linux下使用过的命令总结(未整理完)
查看>>