答:
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 命令怎么使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)