荣耀中最好看的皮肤是哪个 盘点王者荣耀好看皮肤的皮肤

> 博客详情
获取Redis所有Key的方法:
获取所有Key命令:redis-cli -a 密码 keys ‘*’ &;
获取指定前缀的key:redis-cli &-a 密码&&KEYS “edu:*”
如果需要导出,可以redis-cli keys ‘*’ & /data/redis_key.txt
删除指定前缀的Key &&&redis-cli &-a 密码 &KEYS “edu:*” | xargs redis-cli &-a 密码&&DEL
关命令参考
Redis &KEYS &&
人打赏支持
码字总数 86363
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥Redis中有删除单条数据的命令DEL但是他没有批量删除多条数据的方法,那我们怎么去批量删除多条数据呢!
第一种方式
/work/app/redis/bin/redis-cli -a youpassword keys 'Volume:*' | xargs
/work/app/redis/bin/redis-cli -a youpassword del
通过:keys 'Volume'去匹配你要删除的Key:Value条目,然后把结果传给xargs然后删除数据
如果要删除指定的Redis库加个参数即可:(-n)一般不建议在Redis中使用多库存储数据!
/work/app/redis/bin/redis-cli -a youpassword -n 0 keys 'Volume:*' | xargs
/work/app/redis/bin/redis-cli -a youpassword -n 0 del
这样一个坏处每次都要建立一个连接,量小的话还可以接受,量大的话,效率不行。
第二种方式
/work/app/redis/bin/redis-cli -a youpassword EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 'Volume:*'
这样的方式,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本但这种处理方式,量大的情况下,lua函数unpack会出现问题,会报错误
(error) ERR Error running script (call to f_e177aaf3b388ee986dbe): @user_script:1: user_script:1: too many results to unpack
优化后的第二种方式
/work/app/redis/bin/redis-cli -a youpassword EVAL "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 'Volume:*'
实际上是对第二种方式的改进,一次性unpack太多会出问题,那就干脆一次5000吧,这样就不会有问题了!
这段脚本的意思,首先定义一个数组 keys,里面存储了模式匹配的所有的以 &Volume:&的key,然后for循环,每次处理5000个key,也就是说每次del 5000个key。
相关脚本:/luotianshuai/
KEYS操作在线上是禁止使用的!
Redis是单线程的,如果量很大的话,keys是遍历key的,会导致阻塞,这样其他的客户端就没法连接了!
第三种方式
自从redis2.8以后就开始支持scan命令,模式匹配可以采取下面的形式来批删除大量的key
/work/app/redis/bin/redis-cli -a youpassowrd -n 0 -p 6379 --scan --pattern "Volume:*" | xargs -L 5000 /work/app/redis/bin/redis-cli -a youpassword -n 0 -p 6379 DEL
/work/app/redis/bin/redis-cli -a youpassword -n 0 -p 6379 --scan --pattern "Volume:*" | xargs -L 5000 /work/app/redis/bin/redis-cli -a youpassword -n 0 -p 6379 DEL
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 207
参考晓兄博客:https://www.18188.org/articles//0.html
阅读(...) 评论()一次使用 Redis 优化查询性能的实践 - 推酷
一次使用 Redis 优化查询性能的实践
有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别。
以前的解决方案
数据存储在Oracle中,为ID建立了索引;
查询时,先将这些上传的ID数据存储到临时表中,然后用表关联的方法来查询。
这样做的优点是减少了查询次数(不用每个ID都查询一次),减少了解析SQL的时间(只需要执行1次查询SQL,但是多了插入数据的SQL处理时间)。
但是这样的设计仍然存在巨大的提升空间,当并发查询的数量增加时,数据库的响应就会很久。虽然建立了索引,但是每个ID查询的时间复杂度仍是O(logn)级别的,那么总的查询时间复杂度就应该是m*O(logn)。不知道Oracle对表关联查询有做了哪些优化,但应该也是改变不了时间复杂度的级别。
一遇到读数据库存在瓶颈的问题,首先想到的就是要用内存数据库,用缓存来解决。首选 Redis,因为Redis是一种提供了丰富数据结构的key-value数据库,value可以存储STRING(字符串)、HASH(哈希),LIST(列表),ZSET(有序集)。
首先需要将数据的存储改成 key-value 架构。简单的做法就是一个ID对应一个字符串的 Value。但是一个 ID 可以对应多条数据,而且一条数据内又可以包含多个字段。这时候就需要将这些数据重新组合一下,拼在一起,或者是采用列表、哈希或集合来存储 Value。
Redis内部采用 HashTable(哈希表)来实现key-value的数据结构,是一种空间占用较高的数据结构。而我的应用场景又是ID有几千万规模的,如果按上述方法,使用每个ID作为key,那么内存的消耗将是巨大的。每个key-vaulue结构,
,即便value存储的是纯数字(会使用long类型,占用4个字节),也依然很大,1000万的数据,就要占用快1G内存。
使用两级Hash优化内存
依据官方文档的
,以及这篇文章
,建议对ID分段作为key,并使用 hash 来存储第一级 key 的 value,第二级存储较少的数据量(推荐1000),因此第二级的key使用ID的后3位。
为了节约内存,Redis默认使用ziplist(压缩列表)来存储HASH(哈希),LIST(列表),ZSET(有序集)这些数据结构。当某些条件被满足时,自动转换成 hash table(哈希表),linkedlist(双端列表),skiplist(跳表)。
ziplist是用一个数组来实现的双向链表结构,顾名思义,使用ziplist可以减少双向链表的存储空间,主要是节省了链表指针的存储,如果存储指向上一个链表结点和指向下一个链表结点的指针需要8个字节,而转化成存储上一个结点长度和当前结点长度在大多数情况下可以节省很多空间(最好的情况下只需2个字节)。但是每次向链表增加元素都需要重新分配内存。——
ziplist的详细信息请看
查看 Redis 的 .conf 文件,可以查看到转换条件的设置信息。
# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# Similarly to hashes, small lists are also encoded in a special way in order
# to save a lot of space. The special representation is only used when
# you are under the following limits:
list-max-ziplist-entries 512
list-max-ziplist-value 64
# Similarly to hashes and lists, sorted sets are also specially encoded in
# order to save a lot of space. This encoding is only used when the length and
# elements of a sorted set are below the following limits:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
ziplist 查找的时间复杂度是 O(N),但是数据量较少,第二级Hash的查询速度依然在O(1)级别。
对第二级Hash存储的数据再编码
在我的应用场景中每个ID对应的数据可以有很多个字段,这些字段有很多实际上是类型数据,存储的也是ID。为了进一步节约内存,对这些使用数字作为ID的字段,采用base62编码(0-9,A-Z,a-z),这样可以使这些ID的字符长度变短,进一步减少在Redis中第二级hash需要存储的数据量,从而减少Redis占用的内存。
使用Lua脚本来处理批量操作
由于每次查询都上传几百上千个ID,如果对这些ID,都单独调用一次HGET命令,那么一次查询就需要上千次TCP通信,速度很慢。这个时候最好的方法就是一次性将所有的查询都发送到 Redis Server,然后在 Redis Server 处再依次执行HGET命令,这个时候就要用到 Redis 的
(需要 Redis 2.6以上版本)。这两项功能可以用来处理批量操作。由于Lua脚本更简单好用,因此我就直接选用Lua脚本。
Redis Lua 脚本具有原子性,执行过程会锁住 Redis Server,因此 Redis Server 会全部执行完 Lua 脚本里面的所有命令,才会去处理其他命令请求,不用担心并发带来的共享资源读写需要加锁问题。实际上所有的 Redis 命令都是原子的,执行任何 Redis 命令,包括 info,都会锁住 Redis Server。
不过需要注意的是:
为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟(见.conf配置文件)。当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回&BUSY&错误——
遇到这种情况,就需要使用 SCRIPT KILL 命令来终止 Lua 脚本的执行。因此,千万要注意 Lua 脚本不能出现死循环,也不要用来执行费时的操作。
实验基本设置:
将7000万数据按照上面描述的方法,使用两级Hash以及对数据再编码,存储到Redis中。
模拟数据请求(没有通过HTTP请求,直接函数调用),查询数据,生成响应的JSON数据。
(数据仅供参考,因为未真正结合Web服务器进行测试)
使用上述方法,对Redis的内存优化效果非常好。
实验设置:
模拟每次查询500个ID,分批次连续查询。用于模拟测试并发情况下的查询性能。
响应速度与查询的数据量,几乎是线性相关。30s 的时间就可以处理2000次请求,100W个ID的查询。由于Oracle速度实在太慢,就不做测试了。
实验设置:
连续查询1W个ID,每次500个,分20次。用于测试Redis中存储的数据量对查询性能的影响。
查询速度受存储数据量的影响较小。当存储的数据量较多时,第二级hash存储的数据量就会更多,因此查询时间会有略微的上升,但依然很快。
Redis book(Redis设计与实现)
Redis 官网
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致5123人阅读
redis(2)
redis本身不支持批量删除key.可以借助jedis客户端,shell和lua脚本来实现
下面将逐一介绍这三种方式
比如删除前缀为 “mykey” 的所有key
1. &shell脚本&
redis-cli KEYS &mykey*& | xargs redis-cli DEL
2. lua 脚本 windows客户端下可以使用这种
redis-cli eval &redis.call('del', unpack(redis.call('keys','mykey*')))& 0
3.jedis 客户端批量删除key ,java客户端适用这种
& & jedis客户端并没有提供批量删除key的方法,但是可以通过另外一种思路来实现
用Jedis.keys(String&pattern) 方法来匹配要删除的所有key,&
然后循环返回来的Set&String& 组装成数组&
然后再用 del(String ... key)方法将key全部删掉
具体实现方法如下:
* 删除key,可以是一个,也可以是多个key
* @param keys
public synchronized static void deleteKey(String ... keys ){
getJedis().del(keys);
* 删除匹配的key&br&
* 如以my为前缀的则 参数为&my*&
* @param key
public synchronized static void deleteKeys(String pattern){
//列出所有匹配的key
Set&String& keySet = getJedis().keys(pattern);
if(keySet == null || keySet.size()&=0){
String keyArr[] = new String[keySet.size()];
for (String keys : keySet) {
keyArr[i] =
deleteKey(keyArr);
* 删除前缀为{参数}的所有key&br&
* @param prefix
public synchronized static void deleteKeyByPrefix(String prefix){
deleteKeys(prefix+&*&);
* 删除包含{参数}的所有key&br&
* @param contain
public synchronized static void deleteKeyByContain(String contain){
deleteKeys(&*&+contain+&*&);
* 删除当前中所有key
public synchronized static void flushdb(){
getJedis().flushDB();
删除所有的数据&
当前数据库:flushdb
所有:flushall
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:92641次
积分:1141
积分:1141
排名:千里之外
原创:25篇
评论:32条
阅读:36748
(1)(1)(4)(1)(4)(1)(5)(10)}

我要回帖

更多关于 王者荣耀皮肤那个好看 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信