前言
Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录。Redis还支持对这些数据类型做更多的服务端操作,从而也能减少网路的IO次数与数据体积,这里也比Memcached要方便与高效,只针对这一点。
Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set。
一、------------------数据类型-String--------------------------------------
string类型在redis中是最常见的类型,value存储最大数据量为512M,可以存放json数据,图像数据等等。
1.redis数据写命令Set,相当于数据插入
127.0.0.1:6379> set name zlh --返回值: ok,说明插入成功。如果当前name存在值则覆盖替换原有的value值。
2.redis数据读命令Get,获取数据
127.0.0.1:6379> get name --返回值: “zlh” ,如果当前key没有value值,则返回null
3.redis数据追加命令Append,追加数据
127.0.0.1:6379> append name ’ is my friend’ --返回值:“zlh is my friend” ,如果当前key的value有值则附加到原有string后面,如果没有则写入。
4.redis数据删除
127.0.0.1:6379>del name
5.redis数据读写操作命令GetSet,获取原有value值的同时写入新的value值
127.0.0.1:6379>getset name zlh --返回值:“zlh is my friend”,这里返回的是原有name的value值,同时又给name的value设置新值zlh。此时name的值真实值为zlh
127.0.0.1:6379>get name --返回值:zlh ,因为上面getset给name的value设置值为zlh。
6.redis数据加法计算命令incr,incrby,数据加法运算,incr为+1内置运算,incrby为+n自设n运算
127.0.0.1:6379>incr name —返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。
127.0.0.1:6379>incr age ----返回值:1,由于不存在age的key与value值,但是默认age为key值为0进行+1运算。
127.0.0.1:6379>incr age —返回值:2,由于上一行代码给age赋值为1,这里incr命令进行+1运算,故返回值为2。
127.0.0.1:6379>incrby age 10 —返回值:12 ,因为原有age是2,这里+10故为12。
7.redis数据减法计算命令decr,decrby, 数据减法运算,decr为-1内置运算,decrby为减n自设n运算
127.0.0.1:6379>decr name --返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。
127.0.0.1:6379>decr age --返回自:11,因为原有age的value值为12,这里decr是自减1的意思,故为11。
127.0.0.1:6379>decrby age 10 --返回值:1,因为原有age为11,这里-10,故为1。
8.redis获取string长度的命令strlen
127.0.0.1:6379>strlen name --返回值:3,因为name的value值为zlh,故长度为3,如果该key或者value不存在,则返回0。
9.redis设置value值并设置过期时间命令setex(单位秒)
127.0.0.1:6379>setex sex 20 male —返回值:ok,设置key为sex的value值为male,缓存的过期时间为20s。
127.0.0.1:6379>ddl sex —返回值: 剩余过期时间,0为已过期,-1为永不过期。
127.0.0.1:6379>get sex —返回值:male,说明此时为没有过期,当已经过期此处返回数据为null。
10.redis赋值判断原值是否存在,存在不赋值,返回0;不存在才赋值,返回1;命令setnx
127.0.0.1:6379>setnx name Tom —返回值:0,因为name的原有value为zlh,存在值则不赋值。
127.0.0.1:6379>gete name —返回值:zlh,因为有值,故上面赋值为tom失败,返回0。
127.0.0.1:6379>setnx phone 18501733702 —返回值:1,赋值成功,因为原来不存在phone的key与value。
127.0.0.1:6379>get phone —返回值:18501733702,说明上面的setnx赋值成功。
11.redis字符串替换赋值,从指定位置开始替换,命令setrange
127.0.0.1:6379>setrange phone 9 123 --返回值:12,12为字符串长度,11位号码变成了12位。因为从第9位开始替换,替换到原有字符串的最后一位还没有替换完毕,所以在最后面添加啦一位设置为3。
127.0.0.1:6379>get phone —返回值为:185017337123.
127.0.0.1:6379>set phone 1 —这里为了下面说下setrange的其他特性,把电话设置为1.
127.0.0.1:6379>setrange phone 3 aaa —返回值为:6,因为原有phone的value值为1,不到三位,用0*00替换2位,所以要添加2为才能替换第三位后面的值为aaa。
127.0.0.1:6379>get phone —返回值:1*00*00aaa。理解下上面的操作就知道这里为什么是这样的返回值了。
12.redis截取字符串,从下标为n开始截取到n或n+1,类似c#中的substring,命令getrange
127.0.0.1:6379>set phone 18501733701 ----方便下面操作
127.0.0.1:6379>getrange phone 1 5 —返回值:85017,因为getrange是从下标为1开始截取截取到下标为5,这里包含下标为5的值。
127.0.0.1:6379>getrange phone 0 0 —返回值:1,从下标为0开始截取,截取到下标为0,包含下标为0。故返回值为1。
127.0.0.1:6379>getrange phone 10 13 --返回值为:1,此号码下标直到10的11位号码,从10开始截取,截到第13位,后2位不存在忽略,只返回第10位。故返回干净的1。
13.redis批量操作修改及读取string数据,命令mget,批量读取,命令mset,批量赋值,命令msetnx,带事务性的赋值,发现有一个key已经存在,所有事务回归,不做赋值处理操作
127.0.0.1:6379>mset name zlh age 30 —返回值:ok,这里设置了 key为name和age的value分别为zlh,30
127.0.0.1:6379>mget name zlh —返回值:1>zlh 2>30 。
127.0.0.1:6379>msetnx name Jim address China —返回值为:0,没有做任何修改,因为key为那么已存在。
127.0.0.1:6379>mget name address —返回值:1>zlh 2>null
127.0.0.1:6379>msetnx address China,hobbies sports --返回值为:1,插入成功
127.0.0.1:6379>mget address hobbies —返回值:1>China 2>sports
二、------------------数据类型-List------------------------------------------
1、redis中的list的基本属性?
List数据结构是链表结构,这意味这无论数据量多大,头尾操作数据还是很快的,list的容量是2的32次方减1个元素,即4294967295个元素数量。
2、为什么使用redis中的list数据类型?
依靠redis内存中操作数据的优势,又提供一些列实用独特的Api操控数据,用着简便,速度又快,又能实现特有的数据特征排序读写,做时间轴数据,评论列表,消息传递等等,又提供简便的分页,读写操作。你用不用。
3、为什么使用消息队列?
举个简单的例子,功能是这样子的,你要呈现页面给用户看,在你呈现页面之前有一个很复杂耗时的运算要操作,但是这个操作不影响页面呈现的数据,也不作为页面呈现的数据。
方案一:运算完,呈现页面。
方案二:把要计算的数据,抛到持久化的消息队列中,不做耗时的运算,直接呈现页面。然后用另外一个程序来对消息队列中的数据单独做运算。
显而易见,方案二是最佳答案,你用不用消息队列。
4、为什么不使用成熟的rabbitmq而使用redis实现的消息队列?
Rabbitmq只关注数据的先进先出,没有数据优先级的概念,假如你想给那个数据来个先处理的特权,那么不好意思,我不支持,但是rabbitmq也可以变通着来处理,就是建立多个队列用程序路由来实现这个特权功能。那么redis实现的消息队列,是可以灵活掌控的,后面做示范。
1、redis中list列表的数据插入命令:lpush,rpush,linsert
127.0.0.1:6379>rpush mylist 1 —结果为:(integer) 1
127.0.0.1:6379>rpush mylist 2 —结果为:(integer) 2
127.0.0.1:6379>rpush mylist 3 —rpush命令:向mylist列表中,从右边插入3条数据,返回值为当前列表的容量。结果为:(integer) 3
127.0.0.1:6379>lrange mylist 0 -1 —lrange命令:查看mylist列表中的数据,0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。结果为:1> “1” 2> “2” 3> “3”
127.0.0.1:6379>lpush mylist 0 —lpush命令:向mylist列表中,从左边插入一条数据为0的数据
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“0” 2>“1” 3>“2” 4>“3”
127.0.0.1:6379>linsert mylist after 3 4 —linsert命令,表达式为linsert key before|after pivot value ;这句命令的意思是在key为mylist的列表中查找值为3的数据,在其后插入一条值为4的数据。
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“0” 2>“1” 3>“2” 4>“3” 5>“4”
127.0.0.1:6379>linsert mylist before 0 -1 —意思是:在key为mylist的列表中查找值为0的数据,在其前插入一条值为-1的数据。
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“-1” 2>“0” 3>“1” 4>“2” 5>“3” 6>“4”
127.0.0.1:6379>lisert mylist after 5 8 —结果为:-1,由于mylist列表不存在值为5的数据,所以不执行任何操作,返回状态值-1。如果key不存在时,返回错误提示。
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“-1” 2>“0” 3>“1” 4>“2” 5>“3” 6>“4”
2、redis中list列表的数据删除命令:lpop,rpop
127.0.0.1:6379>lpop mylist —lpop命令:从列表中的左边移除一条数据,同时输出被删除的数据,这里输出的结果为-1
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“0” 2>“1” 3>“2” 4>“3” 5>“4”
127.0.0.1:6379>rpop mylist —rpop命令:从列表的右边移除一条数据,同时输出被删除的数据,这里输出的结果为4
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“0” 2>“1” 3>“2” 4>“3”
127.0.0.1:6379>ltrim mylist 1 3 ----ltrim命令:保留设定的两个下标区间的值,删除不在其区间的所有值。1为开始保留的下标值,3为结束保留的下标值。
127.0.0.1:6379>lrange mylist 0 -1 —结果为:1>“1” 2>“2” 3>“3”
3、redis中list列表的数据查看命令:lrange,llen,lindex
127.0.0.1:6379>llen mylist —llen命令:返回列表的长度,这里mylist只剩下4条数据,故输出结果为4
127.0.0.1:6379>lindex mylist 3 —lindex命令:获取给定位置的数据,这里坐标为3的数据是"2",所以结果为2.
4、redis中list列表数据修改命令:lset
127.0.0.1:6379>lset mylist 2 zlh —lset命令:把下标为2的值设置为zlh,如果下标值超出范围或对一个空list列表进行lset,那么将返回一个错误提示
127.0.0.1:6379>lrange mylist 0 -1 —结果为: 1>“1” 2>“2” 3>“zlh”
5、redis中list列表,两个列表A,B,将A列表的尾元素添加到B列表的头元素中,命令:rpoplpush
这里我有连个列表A数据为{1,2,3} ,B列表数据为{4,5,6}
127.0.0.1:6379>rpoplpush A B
127.0.0.1:6379>lrange A —结果为:1>"1’ 2>“2”
127.0.0.1:6379>lrange B —结果为:1>"3’ 2>“4” 3>“5” 4>“6”
6、redis中的几个带阻塞的高级命令:blpop,brpop,brpoplpush
127.0.0.1:6379>blpop A 30 —意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
127.0.0.1:6379>blpop B30 —意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
127.0.0.1:6379>brpoplpush A B 30 —意思是:将A列表的尾元素添加到B列表的头元素中,如果A列表中有值则插入,如果没值,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
Redis实现消息队列,并自带优先级功能
1、首先redis中的list是链表结构,具备消息队列中的先进先出特征。
2、从上面的几个高级命令中可以看出,list有几个自带阻塞功能,时间设置为0,可以视为永不休息的监听进程
三、------------------数据类型-Set------------------------------------------
在Redis中,Set和list都是字符串序列,非常相似,不同之处在于Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据。但是set也有自己的相应处理命令来完成对自己的操作。下面我们来看下Set的命令怎么使用
####操作单个set的命令
######1.redis中set列表的新增命令Sadd,key值相同下的value值不能重复,返回插入的数据个数,key后面可跟多个value值
127.0.0.1:6379>sadd mySet 1 —添加key为mySet的set数据值为1,
127.0.0.1:6379>sadd mySet 2 4 5 —添加key为mySet的set数据值为2,
2.redis中查看set数据集合的命令:smembers,可以获取全部的元素,当set成员比较多时考虑其性能啊
127.0.0.1:6379>smembers mySet —获取key为mySet的说有set数据值集合
3.redis中set判断某个key的value中是否存在某个值的命令:sismember ,如果存在返回1,不存在返回0
127.0.0.1:6379>sismember mySet 3 —返回值为0,因为myset的set成员中只有1,2没有3
127.0.0.1:6379>sismember mySet 2 —返回值为1,因为myset的Set成员中存在2.
4.redis中set的删除数据命令srem,返回删除个数,key后面可跟多个value值
127.0.0.1:6379>srem mySet 1 —删除key为mySet,value为1的数据项。
127.0.0.1:6379>srem mySet 2 4 —删除key为mySet,value为2和4的2个数据项。
5.redis中查看set数据个数的命令scard,如果不存在返回0
127.0.0.1:6379>sadd mySet 1 2 3 4 5
127.0.0.1:6379>scrad mySet —查看mySet中存在多少个数据项,返回结果为5
6.redis中set随机查看元素命令srandmember
127.0.0.1:6379>srandmember mySet —输出key为mySet的数据项中的随机一个value,
7.redis中set随机删除一个元素的命令spop,并返回输出删除的数据
127.0.0.1:6379>spop mySet ----随机从key为mySet的数据集合中删除一条数据,并返回输出删除的数据
127.0.0.1:6379>scard mySet —key为mySet的数据集合中的数据个数为4
操作多个set的命令
set除了对一个set中的元素进行增删改查外,还可以对多个set进行操作,比如将一个set的元素移到另外一个set中,计算多个set的并集,交集,差集等操作。
1.redis中set将一个set中的元素移动到另外一个set中的命令smove
127.0.0.1:6379>sadd mySet 1 2 3 ----向mySet中添加3条数据 1 2 3
27.0.0.1:6379>sadd youSet 3 4 5 ----向youSet中添加3条数据 3 4 5
127.0.0.1:6379>smove youSet mySet 4 —将youSet中的数据4移除的同时将数据4添加到mySet中
127.0.0.1:6379>smembers mySet —结果为:1 2 3 4
127.0.0.1:6379>smembers youSet —结果为 3 5
2.redis中set求交集命令sinter
127.0.0.1:6379>sinter mySet youSet —输出结果为mySet和youSet的交集,输出结果为:3
3.redis中set求并集的命令sunion
127.0.0.1:6379>sunion mySet youSet —输出结果为mySet与youSet的并集,输出结果为:1 2 3 4 5
4.redis中set求差集的命令sdiff
127.0.0.1:6379>sdiff mySet youSet —输出结果为mySet中youSet不存在的数据,输出结果为:1 2 4
127.0.0.1:6379>sdiff youSet mySet —输出结果为youSet中mySet不存在的数据,输出结果为:5
四、------------------数据类型-Set------------------------------------------
Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zset怎么做到有序的呢?就是zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据也是非常高效的。
操作单个zset的redis命令
1、添加,如果值存在添加,将会重新排序。zadd
127.0.0.1:6379>zadd myZSet 1 zlh —添加分数为1,值为zlh的zset集合
127.0.0.1:6379>zadd mySet 2 Tom 3 Jim —添加2条zset集合,分别为分数为2、3,值为tom、jim的集合。
2、查看zset集合的成员个数。zcard
127.0.0.1:6379>zcard myZSet —输出zset的成员个数为3
3、查看Zset指定范围的成员,withscores为输出结果带分数。zrange
127.0.0.1:6379>zrange mZySet 0 -1 ----0为开始,-1为结束,输出顺序结果为: zlh tom jim
127.0.0.1:6379>zrange mZySet 0 -1 withscores —输出带分数的结果为:zlh 1 tom 2 jim 3
4、获取zset成员的下标位置,如果值不存在返回null。zrank
127.0.0.1:6379>zrank mZySet Jim —Jim的在zset集合中的下标为2
5、获取zset集合指定分数之间存在的成员个数。zcount
127.0.0.1:6379>zcount mySet 1 3 —输出分数>=1 and 分数 <=3的成员个数为3,因为分数是可以重复的,所以这个命令是有道理的。
6、删除指定的一个成员或多个成员。zrem
127.0.0.1:6379>zrem myZSet zlh --删除值为zlh的zset成员
127.0.0.1:6379>zrem myZSet Tom Jim —删除值为Tom和Jim的两个zset成员
7、获取指定值的分数。zscore
127.0.0.1:6379>zadd myZset 1 zlh 1 tom 2 jim 3 xdd 4 pmm —由于上面的数据被删除完了,这里添加5条示范数据再。
127.0.0.1:6379>zscore myZset zlh —输出值为zlh的分数为1
8、给指定元素的分数进行增减操作,负值为减,正值为加。zincrby
127.0.0.1:6379>zscore myZset tom ----输出tom的分数为1
127.0.0.1:6379>zincrby myZset 4 tom —tom的分数值加4,输入分数值为5
127.0.0.1:6379>zscore myZset tom —输出tom的分数值为5
9、根据指定分数的范围获取值。zrangebysocre
127.0.0.1:6379>zrangebyscore myZset 1 5 —输出分数>=1 and <=5的成员值为:zlh jim xdd pmm tom
127.0.0.1:6379>zrangebyscore myZset (1 5 ----输出分数>1 and <=5的成员值为:jim xdd pmm tom
127.0.0.1:6379>zrangebyscore myZset 2 5 limit 1 2 —检索分数为2到5之间的数据,然后从下标为1的数据开始往后输出2个数据,包含下标为1的数据。结果为:xdd pmm
127.0.0.1:6379>zrangebyscore myZset -inf +inf limit 2 3 ----+inf表示最后一个成员,-inf表示第一个成员,意思是:检索所有数据,然后从下标为2的数据开始再往后输出2个数据。结果为:xdd pmm tom
10、倒序,从高到底排序输出指定范围的数据。zrevrange,zrevrangebyscore
127.0.0.1:6379>zrevrange myZset 2 3 —先倒序排列数据,输出下标为>=2 and <=3的数据为xdd jim,这里注意的是倒序之后下标也反过来了。
127.0.0.1:6379>zrevrange myZset 2 4 withscores —输出结果为:xdd 3 jim 2 zlh 1
127.0.0.1:6379>zrevrangebyscore myZset 5 1 limit 3 2 ----输出结果为:jim zlh 。获取score <=5 and >=1,从下标为为3开始获取2条数据。
127.0.0.1:6379>zrevrangebyscore myZset 4 2 ----分数>=2 and <=4 的数据倒序输出:pmm xdd jim
11、根据坐标,分数范围删除数据。zremrangebyscore,zremrangebyrank
127.0.0.1:6379>zremrangebyscore myZset 1 2 —删除分数>=1 and <=2的数据
127.0.0.1:6379>zrange myZset 0 -1 ----输出结果为 xdd pmm tom
127.0.0.1:6379>zremrangebyrank myZset 0 2 —删除下标>=0 and <=2的zset元素
127.0.0.1:6379>zrange myZset 0 -1 --输出结果为:empty list or set 。没数据啦。
操作多个zset的redis命令
1、求多个zset的并集
127.0.0.1:6379>zadd myZset 1 zlh 2 jim 3 tom —添加3个数据
127.0.0.1:6379>zadd youZset 1 zlh 2 xdd 3 pmm —添加3个数据
127.0.0.1:6379>zunionzstore heZset 2 myZset youZset ----将myzset和youzset的并集添加到hezset中。
2、求多个zset的交集
127.0.0.1:6379>zinterstore sheZset 2 myZset youZset ----将myzset和youZset 的交集添加到sheZset中。
五、------------------数据类型-Hash------------------------------------------
Hash数据结构累似c#中的dictionary,大家对数组应该比较了解,数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引却没有实际意义,他只是一个位置而已。而我们在查找某个元素时,一般都会使用有意义的字段来做索引,这就产生啦dictionary。其实dictionary的实现,就是让key跟下标索引有一定的关系,所实现的,让他的查找算法复杂度变为常数O(1)。
redis中hash对单个key/value操作的命令演示
1.redis中hash的添加命令hset,如果key不存在,创建key,存在,则覆盖原有值
redis 127.0.0.1:6379>hset myhash name Jim ----给key为myset的键值设置键为name值为Jim
2.redis中hash的查看命令hget
127.0.0.1:6379>hget myhash name ----输出: “Jim”,获取key为myset,键为name的value
127.0.0.1:6379>hset myhash name zlh ----覆盖原有值,值改为zlh替换Jim
127.0.0.1:6379>hget myhash name —输出:“zlh”
3.redis中hash的获取key包含的field数量的命令hlen
127.0.0.1:6379>hset myhash age 31 — 设置key为myset键为age的value=31
127.0.0.1:6379>hlen myhash —输出为2,key为myset的field数量为2
4.redis中判断指定key中指定field是否存在的命令hexists,存在返回1,不存在返回0
127.0.0.1:6379>hexists myhash name —返回1,说明存在
127.0.0.1:6379>hexists myhash name1 —返回0,说明不存在
5.redis中hash删除命令hdel,删除一个或多个指定的字段
127.0.0.1:6379>hset myhash sex nan ----添加数据
127.0.0.1:6379>hset myhash issingle yes ----添加数据
127.0.0.1:6379>hset myhash hobby sports ----添加数据
127.0.0.1:6379>hdel myhash hobby ----删除单个数据,filed为hobby的数据
127.0.0.1:6379>hdel myhash issingle sex —删除多个数据,filed为issingle和sex的两条数据
6.redis中hash如果key或field不存在插入有效,否则不采取操作的命令hsetnx
127.0.0.1:6379>hsetnx myhash sex nan —设置myhash,field为sex的value为nan,成功返回1,因为原来不存在sex这个字段
127.0.0.1:6379>hsetnx myhash sex nv —设置myhash,field为sex的value为nv,不成功返回0,因为原来存在sex这个字段并且有值
127.0.0.1:6379>hget myhash sex --输出"nan"
7.redis中hash中的value为数值时操作增减的命令hincrby
127.0.0.1:6379>del myhash —删除该键
127.0.0.1:6379>hset myhash age 31 —设置key为myhash的键为age值为31
127.0.0.1:6379>hincrby myhash age 10 —给key为myhash,键为age的值加10,输出结果为41
127.0.0.1:6379>hincrby myhash age -10 —给key为myhash,键为age的值减去10,输出结果为31
redis中hash批量操作key/value的命令演示
1.批量添加key/value的命令hmset
127.0.0.1:6379>del myhash --删除该键
127.0.0.1:6379>hmset myhash name zlh age 31 issingle no ----给key为myhash的hash添加name=zlh,age=31,issingle=no的多个键值
2.批量获取key/value的命令hmget
127.0.0.1:6379>hmget myhash name age issingle ----输出结果为:zlh 31 no
3.根据myhash键获取所有的字段及value的命令hgetall
127.0.0.1:6379>hgetall myhash ----输出结果为:name age issingle zlh 31 no
4.获取所有的field的命令hkeys
127.0.0.1:6379>hkeys myhash —输出结果为:name age issingle
5.获取所有字段的值的命令hvals
127.0.0.1:6379>hvals myhash ----输出结果为:zlh 31 no
6.切换数据库127.0.0.1:6379> select 0
7.切换数据库 查找包含某个字符127.0.0.1:6379> keys “account_pools_PC200420000002_*”