redismget(redis mget pipeline 区别)

本篇文章给大家谈谈redismget,以及redis mget pipeline 区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Redis | Redis 字符串相关命令

Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 字符串 相关的命令,也就是关于 Strings 相关的命令,如下图。

上图中用红色圈中的部分,就是关于 字符串 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。

在按下回车后,可以看到相应分类命令的说明,如下图。

图中就是部分关于 Strings 相关的部分命令。

常用 Strings 相关命令

为了大家能够直接复制命令进行测试,下面我就不截图了。

1、set 命令

set 命令的作用是 设置一个 key 的 value 值

设置 key 对应的字符串类型

上面的命令分别对 key1 设置为 value1,对 key2 设置为 value2。

set 命令除了基本的用法外,还有几个参数,先来说一下 nx 和 xx 两个参数。

nx 表示 key 不存在时,执行操作

xx 表示 Key 存在时,执行操作

命令 set k1 v1 nx 表示,当 k1 不存在时,给 k1 设置字符串值为 v1,此时 k1 并不存卜衡在,因此该命令被执行;

命令 set k2 v2 xx 表示,当 k2 存在时,给 k2 设置谨尺字符串值为 v2,此时 k2 并不存在,因此该命令没有被执行

再介绍另外两个参数,分别是 ex 和 px,ex 和 px 是在进行 set 命令时可以设置过期时间的命令

ex 表示 设置的过期时间以秒为单位

px 表示 设置的过期时间以毫秒为单位

2、setnx 命令

setnx 命令的作用是 当指定的键不存在时给该键设置一个值

该命令类似 set 命令附带了 nx 参数

在上面的命令中,setnx k1 value1,由于 k1 存在,因此命令没有被执行,setnx k2 value2,由于 k2 不存在,因此命令被执行。

当命令执行成功,返回值为 1

当命令执行不成功,返回值为 0

3、get 命令

get 命令的作用是 获取指定 key 的值

该命令已经被多次使用了,演示如下:

4、getset 命令

getset 命令的作用是 设置一个 key 的 value,并获取设置前的值

该命令相当于 先对指定的 key 进行一次 get 操作,再执行一次 set 操作,两个命令合并,可以保证原子性。

5、mget 命令

mget 命令的作用是 一次获取多个 key 的值,如果 key 不存在则返回 nil

可以看到,key3 是不存在型晌做的,因此 key3 返回的值是 nil

6、mset 命令

mset 命令的作用是 设置多个key value

7、msetnx 命令

msetnx 命令的作用是 设置多个key value,仅当key不存在时

可以看出,msetnx k4 vv4 k5 vv5 时,此时不存在 k4 和 k5 因此该命令执行成功,在执行 msetnx k4 v4 k5 v5 k6 v6 时,由于 k4 和 k5 已经存在,则使得这条命令执行失败,因此 k4 和 k5 的值仍然是 vv4 和 vv5,并且没有 k6 这个 key。

8、incr 命令

incr 命令的作用是 执行原子加1操作

9、decr 命令

decr 命令的作用是 整数原子减1

10、incrby 命令

incrby 命令的作用是 执行原子增加一个整数

11、decrby 命令

decrby 命令的作用是 原子减指定的整数

12、incrbyfloat 命令

incrbyfloat 命令的作用是 执行原子增加一个浮点数

13、setrange 命令

setrange 命令的作用是 修改字符串指定偏移的值

字符串的偏移从 0 开始,hello 的长度为 5,最后 1 个下标为 4,当我们 setrange kstr 6 x 时,我们将 kstr 下标 6 的位置设置为了 x,因此在下标 5 的位置处给了一个 \x00,即 ASCII 码的 0。

14、getrange 命令

getrange 命令的作用是 获取存储在key上的值的一个子字符串

下标 -1 为最后一个下标,下标 -2 为倒数第二个下标

15、append 命令

append 命令的作用是 追加一个值到key上

总结

这些基础的命令当中,除了可以当作基础的操作 字符串 的命令来用,也有其他方面的用处,比如在高并发当中可以用来设置锁等。把今天整理的命令完善了一个思维导图,图片如下。

[img]

redis mget比get快吗

Redis 的mget 比get 的性能者槐要高出很多,所以应该多首闹友使用mget

[java] view plain copy

ListString弯猜 mobileList = callTestingOrderService.queryCallTestingReadyTest("2014-11-27");

ListString tt = jdies.mget(mobileList.toArray(new String[mobileList.size()]));

...

redis mget命令原理浅析

Mget 命令将n个get请求汇聚成一条命令,n个get请求需要和服务器交互n次,也就意味着n次网络trip,以及n次请求协议解析,将n个get请求汇聚成一个mget请求,与服务器只交互一次,大大降低网络、协议解析的开销,从而大幅提升缓存访问效率。

由于在集群模式下,mget获取的多个key,可能存在于多个分片,所以集群下的mget需要和多个分片做交互,衍生出多种方案

2.1. 传统的串行IO操作,也就说n个key,分n次串行操作来获取key,复杂度是o(n)。

2.2. 将Mget操作(n个key),利用已知的hash函数算出key对应的分片,这样就可以得到一个这样的关系:Mapnode, somekeys,也就是每个分片对应的一些keys,这样将之前的o(n)的效率降低到o(node.size())。

2.3. 在2.2方案的基础上将串行取数据改为并行取数据,进一步提高效率。

其中2.3方案效率最高,各类开源框架以及自研系禅备歼统大多选用该方案。

3.1. 客户端分片集群模式,由客户端决定key写入或者读取的分片,jimdb实现了客户端分片机制,客户端存储集群分片信息,mget采用2.3方案拆分请求,客户端与集群分片直接并行交互,性能非常高,拆分请求、并行请求、聚合结果三个阶段都在客户端进行,所以集群服务端相对压力并不大,所以性能平稳,但客户端集群分片信息的管理以及同步复杂,开发难度大滚袜。

3.2. 基于代理的分片集群模式,客户端发送请求到一个代理,代理解析客户端的数据,将请求转发至正确的分片,然后将结果回复给客户端;客户端发送mget到proxy,由proxy进行mget请求的拆分、请求以及结果聚合,proxy资源充足情况下,表现良好,资源不足,性能会大大折扣,由于proxy多一次转发,性能也有所损耗,但对集群分片的管理,对客户端透明,也更加友好。

3.3. 路由查询集群模式,将请求发送到任意分片,接收到请求的分片会将查询请求发送到正确的分片上执行,Redis-cluster使用该模式,很遗憾,4.0 仅支持相同slot,key不能保证在相同slot还是没贺冲用。

l

我是如何解决redis集群批量获取的效率问题的

相信各位在使用redis集群的时候,对于redis集群中的批量操作都会有一个现象:使用redis集群进行批量获取数据的时候,效神袜率总是不高,取一次数据要达到几百毫秒,当你操作的数据是百万级别的时袭瞎昌候,你就会发现redis的读取效率压根就不能接受。接下来告诉大家如何进行了解

### redis集群的哈希槽

redis集群中内置了16384个哈希槽,当一个key值准备存储的时候,是先通过将key进行 crc16 校验,校验后的值对16384取值,得到的值就是该key所在的槽(slot);redis集群中,节点上的槽是连续的一段,拍扒因此通过我们计算key得到的slot,就能判断该key是在存储在哪个节点上的。

#### 如何判断redis集群中各个节点上的slot分布?

  使用命令 : cluster nodes  或者  cluster slots

#### 如何知道一个key值对应的槽

使用命令: cluster keyslots {key}

#### 提高效率的解决方案

因此,通过上面我们就可以知道key值存储对应的reids集群的节点,因此我们可以做以下处理:将你所需要的key按照槽的值进行分批,用单点连接的形式连接到某个redis节点上,批量取处于同一个节点上的key。

注意:

- 一定要用单点的形式进行连接,还是使用集群方式连接的话,就算是处于一个节点,效率也是没有提高的;

- redis集群单点连接的话,不能使用mget,因此mget只能取位于同一个 slot 上的,你可以使用pipeline进行事务处理;

### 一次具体的实现

目前我使用的语言的php,借鉴了

[crc16算法计算]()

这个方式得到的结果再进行 mod 16384(固定值),从而得到hash槽。

### 后记

  因为知道了我的这些key的hash值,同时我也需要知道这些key值对应的节点,因此可以通过redis的命令(cluster slots)从而可以动态的得到相应的节点以及节点的hash值;

关于redismget和redis mget pipeline 区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表