redis获取获取key等待

redis获取获取key等待,第1张

答:

Redis的key的获取

redis的命令keys() 可以获取所有的key。但是此种方式当数据量大的时候,会产生阻塞的情况。 redis的key还可以通过scan命令获取key。

相信各位在使用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算法计算](>

[Redis] redis-cli 命令总结

Redis提供丰富命令(command)数据库各种数据类型进行 *** 作些commandLinux终端使用

编程比使用Redis Java语言包些命令都应面Redis提供命令做总结

官网命令列表: (英文)

1、连接 *** 作相关命令

quit:关闭连接(connection)

auth:简单密码认证

2、value *** 作命令

exists(key):确认key否存

del(key):删除key

type(key):返值类型

keys(pattern):返满足给定pattern所key

randomkey:随机返key空间key

rename(oldname, newname):key由oldname重命名newname若newname存则删除newname表示key

dbsize:返前数据库key数目

expire:设定key间(s)

ttl:获key间

select(index):按索引查询

move(key, dbindex):前数据库key转移dbindex索引数据库

flushdb:删除前选择数据库所key

flushall:删除所数据库所key

3、String *** 作命令

set(key, value):给数据库名称keystring赋予值value

get(key):返数据库名称keystringvalue

getset(key, value):给名称keystring赋予value

mget(key1, key2,…, key N):返库string(名称key1key2…)value

setnx(key, value):存名称keystring则向库添加string名称key值value

setex(key, time, value):向库添加string(名称key值value)同设定期间time

mset(key1, value1, key2, value2,…key N, value N):同给string赋值名称key istring赋值value i

msetnx(key1, value1, key2, value2,…key N, value N):所名称key istring都存则向库添加string

名称key i赋值value i

incr(key):名称keystring增1 *** 作

incrby(key, integer):名称keystring增加integer

decr(key):名称keystring减1 *** 作

decrby(key, integer):名称keystring减少integer

append(key, value):名称keystring值附加value

substr(key, start, end):返名称keystringvalue串

4、List *** 作命令

rpush(key, value):名称keylist尾添加值value元素

lpush(key, value):名称keylist添加值value 元素

llen(key):返名称keylist度

lrange(key, start, end):返名称keyliststart至end间元素(标0始同)

ltrim(key, start, end):截取名称keylist保留start至end间元素

lindex(key, index):返名称keylistindex位置元素

lset(key, index, value):给名称keylistindex位置元素赋值value

lrem(key, count, value):删除count名称keylist值value元素

count0删除所值value元素count>0至尾删除count值value元素count<0尾删除|count|值value元素

lpop(key):返并删除名称keylist首元素 rpop(key):返并删除名称keylist尾元素

blpop(key1, key2,… key N, timeout):lpop命令block版本

即timeout0若遇名称key ilist存或该list空则命令结束

timeout>0则遇述情况等待timeout秒问题没解决则keyi+1始list执行pop *** 作

brpop(key1, key2,… key N, timeout):rpopblock版本参考命令

rpoplpush(srckey, dstkey):返并删除名称srckeylist尾元素并该元素添加名称dstkeylist部

5、Set *** 作命令

sadd(key, member):向名称keyset添加元素member

srem(key, member) :删除名称keyset元素member

spop(key) :随机返并删除名称keyset元素

smove(srckey, dstkey, member) :member元素名称srckey集合移名称dstkey集合

scard(key) :返名称keyset基数

sismember(key, member) :测试member否名称keyset元素

sinter(key1, key2,…key N) :求交集

sinterstore(dstkey, key1, key2,…key N) :求交集并交集保存dstkey集合

sunion(key1, key2,…key N) :求并集

sunionstore(dstkey, key1, key2,…key N) :求并集并并集保存dstkey集合

sdiff(key1, key2,…key N) :求差集

sdiffstore(dstkey, key1, key2,…key N) :求差集并差集保存dstkey集合

smembers(key) :返名称keyset所元素

srandmember(key) :随机返名称keyset元素

6、zset(sorted set) *** 作命令

zadd(key, score, member):向名称keyzset添加元素memberscore用于排序该元素已经存则根据score更新该元素顺序

zrem(key, member) :删除名称keyzset元素member

zincrby(key, increment, member) :名称keyzset已经存元素member则该元素score增加increment;

否则向集合添加该元素其score值increment

zrank(key, member) :返名称keyzset(元素已按score排序)member元素rank(即index0始)

若没member元素返nil

zrevrank(key, member) :返名称keyzset(元素已按score排序)member元素rank(即index0始)

若没member元素返nil

zrange(key, start, end):返名称keyzset(元素已按score排序)indexstartend所元素

zrevrange(key, start, end):返名称keyzset(元素已按score排序)indexstartend所元素

zrangebyscore(key, min, max):返名称keyzsetscore >= min且score <= max所元素

zcard(key):返名称keyzset基数 zscore(key, element):返名称keyzset元素element

score zremrangebyrank(key, min, max):删除名称keyzsetrank >= min且rank <= max所元素

zremrangebyscore(key, min, max) :删除名称keyzsetscore >= min且score <= max所元素

zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):Nzset求并集交集

并集合保存dstkeyN于集合每元素score进行AGGREGATE运算前都要乘于WEIGHT参数

没提供WEIGHT默认1默认AGGREGATESUM即结集合元素score所集合应元素进行SUM运算值MINMAX指

结集合元素score所集合应元素值值

7、Hash *** 作命令

hset(key, field, value):向名称keyhash添加元素fieldvalue

hget(key, field):返名称keyhashfield应value

hmget(key, field1, …,field N):返名称keyhashfield i应value

hmset(key, field1, value1,…,field N, value N):向名称keyhash添加元素field ivalue i

hincrby(key, field, integer):名称keyhashfieldvalue增加integer

hexists(key, field):名称keyhash否存键field域

hdel(key, field):删除名称keyhash键field域

hlen(key):返名称keyhash元素数

hkeys(key):返名称keyhash所键

hvals(key):返名称keyhash所键应value

hgetall(key):返名称keyhash所键(field)及其应value

8、持久化

save:数据同步保存磁盘

bgsave:数据异步保存磁盘

lastsave:返功数据保存磁盘Unix戳

shundown:数据同步保存磁盘关闭服务

9、远程服务控制

info:提供服务器信息统计

monitor:实转储收请求

slaveof:改变复制策略设置

config:运行配置Redis服务器

Redis是建立在TCP协议上的CS架构,客户端client对redis server采取请求响应的方式交互每次交互会有网络延迟,大约30ms

假设有这样一个场景,redis中存储上千个key值,获取每个key对应field的value,那么要向redis请求上千次 hget(key, field),获取响应也是对应的次数如果能一次性将所有请求提交给server端,执行完成后批量获取响应,只需向redis请求1次,性能获大幅提升

没有用pipeline之前,基本上获取所有数据需要90多s,现在只需03s,性能提升清晰可见

实现以下场景:定时任务每隔1s执行任务函数,但是任务函数执行完成的时间比1s要长,此时启动定时任务要加上两个参数,否则会报错

可允许的实例个数,如果没有设置,则默认为1,表示id相同的任务实例数

像上面的例子中,会报skipped: maximum number of running instances reached (1)的错误,意思APScheduler试图重新执行作业,但前一个仍在运行。

这个参数可以理解为任务的超时容错配置,给executor 一个超时时间,这个时间范围内要是该跑的还没跑完,就别再跑了

像上面的例子中,会报Run time of job …… next run at: ……)” was missed by的错误

Redis的服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。服务器每次结束一个事件循环的之前,会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件里面。

1、config get requirepass 获取当前Redis的连接密码

2、CONFIG GET dir 启动的redis路径

3、config set requirepass "123123"  设置当前Redis的连接密码

4、auth 123123 密码验证

5、save 立刻持久化数据到dumprdb文件中 只管保存,其它不管,全部阻塞

6、bgsave Redis会在后台异步进行快照 *** 作 可以通过lastsave 命令获取最后一次成功执行快照的时间

7、flushall 也会产生dumprdb文件,但是里面是空的,无意义。

8、AOF  是以日志的形式记录每个 写 *** 作,AOF和RDB同时存在时,先使用AOF

9、redid-check-aof --fix append onlyaof 修复AOF文件

第一,大量的数据是不会考虑放在JVM内存中;

第二,如果需要缓存大量的dto,动态数据(又称过程数据)一般用的是redis;如果是静态,系统启动时就加载的大量配置,一般考虑放ehcache。

第三,由于redis用的是物理内存,不是JVM内存,一般情况下往redis里丢千万级别的记录数基本不影响性能,

以上就是关于redis获取获取key等待全部的内容,包括:redis获取获取key等待、我是如何解决redis集群批量获取的效率问题的、redis getset 命令怎么使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9334319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存