Redis之二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis之二相关的知识,希望对你有一定的参考价值。

第1章 Redis开发,管理实战:

1.1 基本数据类型:

类型

说明

String  字符串

Redis 字符串数据类型的相关命令用于管理 redis 字符串值

Hash  哈希

Redis hash 是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

List  列表

Redis列表是简单的字符串列表,按照插入顺序排序。

你可以添加一个元素到列表的头部(左边)或者尾部(右边)

 

一个列表最多可以包含 232 -   1 个元素 (4294967295, 每个列表超过40亿个元素)

Set   集合

Redis  Set  String 类型的无序集合。

集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Sorted set  有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

1.2 全局key操作:

命令

含义

KEYS *

查看KEY支持通配符

DEL

删除给定的一个或多个key

EXISTS

检查是否存在

RENAME

变更KEY

SORT

键值排序,有非数字时报错

TYPE

返回键所存储值的类型

DUMP RESTORE

序例化与反序列化

EXPIRE\ PEXPIRE

以秒\毫秒设定生存时间

TTL\ PTTL

以秒\毫秒为单位返回生存时间

PERSIST

取消生存实现设置

RANDOMKEY

返回数据库中的任意键

1.3 string字符串:

redis最基本的类型,一个key对应一个value,一个键最大能存储512MB

命令

描述

SET key value

设置指定 key 的值

GET key

获取指定 key 的值。

GETRANGE key   start end

返回 key 中字符串值的子字符

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)

GETBIT key   offset key

所储存的字符串值,获取指定偏移量上的位(bit)

MGET key1   [key2..]

获取所有(一个或多个)给定 key 的值。

SETBIT key   offset value

 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)

SETEX key   seconds value

将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)

SETNX key value

只有在 key 不存在时设置 key 的值。

SETRANGE key   offset value

 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。

STRLEN key

返回 key 所储存的字符串值的长度。

MSET key value   [key value ...]

同时设置一个或多个 key-value 对。

MSETNX key value   [key value ...]

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

PSETEX key   milliseconds value

这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间

而不是像 SETEX 命令那样,以秒为单位。

INCR key

 key 中储存的数字值增一。

INCRBY key   increment

 key 所储存的值加上给定的增量值(increment 

INCRBYFLOAT key   increment

 key 所储存的值加上给定的浮点增量值(increment 

DECR key

 key 中储存的数字值减一。

DECRBY key   decrementkey

所储存的值减去给定的减量值(decrement 

APPEND key value

如果 key 已经存在并且是一个字符串, APPEND 命令将 指定value 追加到改 key 原来的值(value)的末尾。

应用场景:常规计数,微博数,粉丝数

1.4 hash类型

我们可以将redis中的hashes类型看成具有string key string valuemap容器

所以该类型非常适合于存储对象的信息,username,passwordage,如果hash中包含很少的字段,那么该而理性的数据也将仅占用很少的磁盘空间,每一个hash可以存储995701749个键值对

命令

描述

HDEL key field1   [field2]

删除一个或多个哈希表字段

HEXISTS key   field

查看哈希表 key 中,指定的字段是否存在。

HGET key field

获取存储在哈希表中指定字段的值。

HGETALL key

获取在哈希表中指定 key 的所有字段和值

HINCRBY key   field increment

为哈希表 key 中的指定字段的整数值加上增量 increment 

HINCRBYFLOAT key   field increment

 为哈希表 key 中的指定字段的浮点数值加上增量 increment 

HKEYS key

获取所有哈希表中的字段

HLEN key

获取哈希表中字段的数量

HMGET key field1   [field2]

获取所有给定字段的值

HMSET key field1   value1 [field2 value2 ]

同时将多个 field-value (-)对设置到哈希表 key 中。

HSET key field   value

将哈希表 key 中的字段 field 的值设为 value 

HSETNX key field   value

只有在字段 field 不存在时,设置哈希表字段的值。

HVALS key

获取哈希表中所有值

HSCAN key cursor   [MATCH pattern] [COUNT count]

迭代哈希表中的键值对。

应用场景:存储部分变更的数据,如用户信息

1.5 list类型:

list类型是按照插入顺序排序的字符串链表,和数据结构中的普通链表一样,我们可以在其头部和尾部添加新的元素

在插入时,如果该键并不存在,redis将为该键创建一个新的链表,与此相反,如果链表欧中所有的元素均被移除,那么该键也将会被从数据库中删除list中可以包含的最大元素数量是4294967295

 

命令

描述

BLPOP key1 [key2   ] timeout

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOP key1 [key2   ] timeout

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。



BRPOPLPUSH   source destination timeout

从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

LINDEX key index

通过索引获取列表中的元素

LINSERT key   BEFORE|AFTER pivot value

在列表的元素前或者后插入元素

LLEN key

获取列表长度

LPOP key

移出并获取列表的第一个元素

LPUSH key value1   [value2]

将一个或多个值插入到列表头部

LPUSHX key value

将一个值插入到已存在的列表头部

LRANGE key start   stop

获取列表指定范围内的元素

LREM key count   value

移除列表元素

LSET key index   value

通过索引设置列表元素的值

LTRIM key start   stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

RPOP key

移除并获取列表最后一个元素

RPOPLPUSH source   destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

RPUSH key value1   [value2]

在列表中添加一个或多个值

RPUSHX key value

为已存在的列表添加值

应用场景:消息队列,比如新浪微博

1.6 set集合类型:

set类型是为没有排序的字符集合,set可包含的最大元素数量是4294967295,如果多次添加相同元素,set中将仅保留该元素一份拷贝

命令

描述

SADD key member1   [member2]

向集合添加一个或多个成员

SCARD key

获取集合的成员数

SDIFF key1   [key2]

返回给定所有集合的差集

SDIFFSTORE   destination key1 [key2]

返回给定所有集合的差集并存储在 destination 

SINTER key1   [key2]

返回给定所有集合的交集

SINTERSTORE destination   key1 [key2]

返回给定所有集合的交集并存储在 destination 

SISMEMBER key   member

判断 member 元素是否是集合 key 的成员

SMEMBERS key

返回集合中的所有成员

SMOVE source   destination member

 member 元素从 source 集合移动到 destination 集合

SPOP key

移除并返回集合中的一个随机元素

SRANDMEMBER key   [count]

返回集合中一个或多个随机数

SREM key member1   [member2]

移除集合中一个或多个成员

SUNION key1   [key2]

返回所有给定集合的并集

SUNIONSTORE   destination key1 [key2]

所有给定集合的并集存储在 destination 集合中

SSCAN key cursor   [MATCH pattern] [COUNT count]

迭代集合中的元素

sorted set有序集合:

sorted-sets中的每一个成员都有一个分数与之关联,redis正是通过分数来为集合中的成员进行从小到大的排序,成员是唯一的,但是分数却是可以重复的

命令

描述

ZADD key score1   member1 [score2 member2]

向有序集合添加一个或多个成员,或者更新已存在成员的分数

ZCARD key

获取有序集合的成员数

ZCOUNT key min   max

计算在有序集合中指定区间分数的成员数

ZINCRBY key   increment member

有序集合中对指定成员的分数加上增量 increment

ZINTERSTORE   destination numkeys key [key ...]

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 

ZLEXCOUNT key   min max

在有序集合中计算指定字典区间内成员数量

ZRANGE key start   stop [WITHSCORES]

通过索引区间返回有序集合成指定区间内的成员

ZRANGEBYLEX key   min max [LIMIT offset count]

通过字典区间返回有序集合的成员

ZRANGEBYSCORE   key min max [WITHSCORES] [LIMIT]

通过分数返回有序集合指定区间内的成员

ZRANK key member

返回有序集合中指定成员的索引

ZREM key member   [member ...]

移除有序集合中的一个或多个成员

ZREMRANGEBYLEX   key min max

移除有序集合中给定的字典区间的所有成员

ZREMRANGEBYRANK   key start stop

移除有序集合中给定的排名区间的所有成员

ZREMRANGEBYSCORE   key min max

移除有序集合中给定的分数区间的所有成员

ZREVRANGE key   start stop [WITHSCORES]

返回有序集中指定区间内的成员,通过索引,分数从高到底

ZREVRANGEBYSCORE   key max min [WITHSCORES]

返回有序集中指定分数区间内的成员,分数从高到低排序

ZREVRANK key   member

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

ZSCORE key   member

返回有序集中,成员的分数值

ZUNIONSTORE   destination numkeys key [key ...]

计算给定的一个或多个有序集的并集,并存储在新的 key 

ZSCAN key cursor   [MATCH pattern] [COUNT count]

迭代有序集合中的元素(包括元素成员和元素分值)

应用场景:排行榜应用,top n 操作这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按定的次数排序,这时候就需要我们的sorted set 出马了,将你要的排序的值设置成sorted set score,将具体的数据设置成相应的alue,每次只需要执行一条ZADD命令即可

第2章 消息模式:

2.1 redis发布消息有两种模式:

1.      队列模式

2.      发布订阅模式

a)        任务队列:就是传递消息的队列,与任务队列进行交互的实体有两类,一类是生产者,另一类是消费者,生产者将需要处理的任务放在任务队里中,而消费者不断的从任务独立中读入任务消息并执行

任务队列的好处:松耦合,生产者和消费者只需按照约定的任务描述格式,进行编写代码

易于扩展,多消费者模式下,消费者可以分布在多个不通过额服务器中,由此降低单台服务器的负载

2.2 Redis发布订阅:

? Subscriber:收音机,可以收到多个频道,并以队列方式显示

? Publisher:电台,可以往不同的FM频道中发消息

? Channel:不同频率的FM频道

pub/sub的机制来看,他更像是一个广播系统,多个sub可以订阅多个channel,多个pub可以往多个channel中发布消息

2.3 发布订阅模型:

一个pub,多个sub模型 : 主要应用为通知,公告

技术分享图片

多个pub,一个sub模型:

可以将pub做成独立的http接口,个应用程序作为pubchannel中发送消息,sub端收到消息后执行相应的业务逻辑,比如写数据库,显示等,主要应用 : 排行榜,投票,计数

技术分享图片

多个pub,多个sub模型:

就是可以向不同的channel中发送消息,由不同的sub接受,主要应用 : 群聊,聊天

1.1 实践发布订阅:

发布订阅命令:

命令

描述

PUBLISH channel   msg

将信息 message 发送到指定的频道 channel

SUBSCRIBE   channel [channel ...]

订阅频道,可以同时订阅多个频道

UNSUBSCRIBE [channel   ...]

取消订阅指定的频道如果不指定频道,则会取消订阅所有频道

PSUBSCRIBE   pattern [pattern ...]

订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news  it.blog  it.tweets 等等) news.* 匹配所有以 news. 开头的频道( news.it news.global.today 等等),诸如此类

PUNSUBSCRIBE   [pattern [pattern ...]]

退订指定的规则如果没有参数则会退订所有规则

PUBSUB   subcommand [argument [argument ...]]

查看订阅与发布系统状态

1.2 模拟发布订阅:

127.0.0.1:6381> SUBSCRIBE fm

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "fm"

3) (integer) 1

 

 

127.0.0.1:6381> PUBLISH fm hello

(integer) 1

 

 

1) "message"

2) "fm"

3) "hello"

技术分享图片

1.1.1 消息队里系统对比:

客户端在执行订阅命令之后进入了订阅状态,只能接收 SUBSCRIBE PSUBSCRIBE UNSUBSCRIBE PUNSUBSCRIBE 四个命令。

开启的订阅客户端,无法收到该频道之前的消息,因为 Redis 不会对发布的消息进行持久化。

和很多专业的消息队列系统(例如KafkaRocketMQ)相比,Redis的发布订阅略显粗糙,例如无法实现消息堆积和回溯。但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。

第1章 Redis事务管理:

redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处

关系型数据库事务执行失败后面的sqsl语句不在执行,redis中的一条命令执行失败,其余的命令照常执行,redis中开启一个事务使用multi,相当于begin,exec用来提交事务,discard用来取消队列

1.1 mysqlredis对比:


MySQL

Redis

开启

start transaction/begin

multi

语句

普通SQL

普通命令

失败

rollback 回滚

discard 取消(不叫回滚,是队列里面的命令不执行,队列里面的任务根本就没有执行。而不是执行了也可以撤回来)

成功

commit

exec

1.2 redis事务命令:

命令

描述

DISCARD

取消事务,放弃执行事务块内的所有命令。

EXEC

执行所有事务块内的命令。

MULTI

标记一个事务块的开始。

UNWATCH

取消 WATCH 命令对所有 key 的监视。

WATCH key [key   ...]

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动

那么事务将被打断。

1.3 事务执行举例:

127.0.0.1:6381> multi

OK

127.0.0.1:6381> set jiang 7

QUEUED

127.0.0.1:6381> exec

1) (empty list or set)

2) OK

127.0.0.1:6381> get jiang

"7"

1.3.1 redis事务中的锁机制:

举例:我正在买票 Ticket -1 , money -100 

而票只有1如果在我multi之后,exec之前票被别人买了,即ticket变成0了。

我该如何观察这种情景,并不再提交:

悲观的想法:

世界充满危险,肯定有人和我抢 ticket上锁只有我能操作. [悲观锁]

乐观的想法:

没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]

Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

1.4 Redis服务管理命令:

命令

描述

BGREWRITEAOF

异步执行一个 AOFAppendOnly File 文件重写操作

BGSAVE

在后台异步保存当前数据库的数据到磁盘

CLIENT KILL   [ip:port] [ID client-id]

关闭客户端连接

CLIENT LIST

获取连接到服务器的客户端连接列表

CLIENT GETNAME

获取连接的名称

CLIENT PAUSE   timeout

在指定时间内终止运行来自客户端的命令

CLIENT SETNAME   connection-name

设置当前连接的名称

CLUSTER SLOTS

获取集群节点的映射数组

COMMAND

获取 Redis 命令详情数组

COMMAND COUNT

获取 Redis 命令总数

COMMAND GETKEYS

获取给定命令的所有键

TIME

返回当前服务器时间

COMMAND INFO   command-name [command-name ...]

获取指定 Redis 命令描述的数组

CONFIG GET   parameter

获取指定配置参数的值

CONFIG REWRITE

对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写

CONFIG SET   parameter value

修改 redis 配置参数,无需重启

CONFIG RESETSTAT

重置 INFO 命令中的某些统计数据

DBSIZE

返回当前数据库的 key 的数量

DEBUG OBJECT key

获取 key 的调试信息

DEBUG SEGFAULT

 Redis 服务崩溃

FLUSHALL

删除所有数据库的所有key

FLUSHDB

删除当前数据库的所有key

INFO [section]

获取 Redis 服务器的各种信息和统计数值

LASTSAVE

返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示

MONITOR

实时打印出 Redis 服务器接收到的命令,调试用

ROLE

返回主从实例所属的角色

SAVE

异步保存数据到硬盘

SHUTDOWN   [NOSAVE] [SAVE]

异步保存数据到硬盘,并关闭服务器

SLAVEOF host   port

将当前服务器转变为指定服务器的从属服务器(slave server)

SLOWLOG   subcommand [argument]

管理 redis 的慢日志

SYNC

用于复制功能(replication)的内部命令


以上是关于Redis之二的主要内容,如果未能解决你的问题,请参考以下文章

Redis事务系列之二Redis实现乐观锁

Redis事务系列之二Redis实现乐观锁

Redis学习笔记之二:redis安装windows/linux

Redis入门很简单之二常见操作命令

初识Redis系列之二:安装及简单使用

Redis 基础数据结构之二 list(列表)