目前在做自动化测试时,设计到需要获取存储在redis中的值,总结了 *** 作代码如下:
需要jar包:jedis-273jar、commons-pool2-241jar
code如下:
[java] view plain copy
package cnmiguutils;
import javautilIterator;
import javautilList;
import cnmigubaseGlobalSettings;
import redisclientsjedisJedis;
import redisclientsjedisJedisPool;
import redisclientsjedisJedisPoolConfig;
/
<Description>redis相关 *** 作类
@author YanLu
/
public class RedisUtil {
private JedisPool pool=null;
private Jedis redis = null;
Log4jUtil log = new Log4jUtil(thisgetClass()getName());
//构造函数,创建对象时进行初始化
public RedisUtil() {
if (pool == null) {
/
// 池基本配置
//JedisPoolConfig config = new JedisPoolConfig();
// 最大连接数, 默认8个
configsetMaxTotal(20);
// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
configsetMaxIdle(5);
// 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
configsetMaxWaitMillis(10000);
// 在borrow一个jedis实例时,是否提前进行validate *** 作;如果为true,则得到的jedis实例均是可用的;
configsetTestOnBorrow(false);
/
//创建redis连接池
//thispool = new JedisPool(config,"17218173188",6379);
thispool = new JedisPool(new JedisPoolConfig(), GlobalSettingsgetProperty("redismasterhost"), IntegerparseInt(GlobalSettingsgetProperty("redismasterport")));
//获取Jedis实例
thisredis = poolgetResource();
loginfo("Connection to redis server sucessfully");
}
}
/
关闭连接
@param pool
@param redis
/
public void quitConnection(Jedis redis) {
if (redis != null) {
redisquit();
//poolreturnResource(redis);
}
}
/
获取key对应的value
说明:方法中目前只针对key数据类型为String和hash的情况作了处理,其他数据类型可根据需要进行扩展即可
@param key
@return
/
public String getValue(String key){
String value = null;
try {
if(redis == null || !redisexists(key)){
loginfo("key:"+key+" is not found");
quitConnection(redis);
return value;
}
//获取key对应的数据类型
String type = redistype(key);
loginfo("key:" + key + " 的类型为:" + type);
if(typeequals("string")){
//get(key)方法返回key所关联的字符串值
value = redisget(key);
}
if(typeequals("hash")){
//一下方法仅适用于listsize=1时,否者value将取集合中最后一个元素的值
List<String> list = redishvals(key);//hvals(key)返回哈希表 key 中所有域的值
//Set<String> set = redishkeys(key);
Iterator<String> it=listiterator();
while(ithasNext()){
value = itnext();
loginfo("value:"+value);
}
}
if(typeequals("list")){
loginfo(key+"类型为list暂未处理");
}
if(typeequals("set")){
loginfo(key+"类型为list暂未处理");
}
} catch (Exception e) {
// TODO Auto-generated catch block
eprintStackTrace();
}finally{
//关闭连接
quitConnection(redis);
}
return value;
}
[java] view plain copy
</pre><p></p><p></p><p>测试代码如下:</p><p><pre name="code" class="java">package cnmigutest;
import orgtestngannotationsTest;
import cnmiguutilsLog4jUtil;
import cnmiguutilsRedisUtil;
/
<Description> 测试RedisUtil类
@author YanLu
/
public class TestRedis {
private Log4jUtil log = new Log4jUtil(thisgetClass()getName());
@Test
public void testRedisUtil(){
RedisUtil ru = new RedisUtil();
//获取redis中对应的value值
String value=rugetValue("SMS_NODE_TIMES_13814528620");
loginfo(value);
}
}
phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系很有用;
如果对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大数据和小数据,另一种是按数据的冷热程度划分,分成冷数据和热数据,热数据是指读或写比较频繁的数据,反之则是冷数据。
可以举一些具体的例子来说明数据的大小和冷热属性。比如网站总的注册用户数,这明显是一个小而热的数据,小是因为这个数据只有一个值,热是因为注册用户数随时间变化很频繁。再比如,用户最新访问时间数据,这是一个量比较大,冷热不均的数据,大是数据的粒度是用户级别,每一个用户都有数据,如果有一千万用户,就意味着有一千万的数据,冷热不均是因为活跃用户的最新访问时间变化很频繁,但是可能有很大一部非活跃用户访问时间长时间不会发生变化。
大体而言,Redis 最适合处理的是小而热,而且是写频繁,或者读写都比较频繁的热数据。对于大而热的数据,如果其它方式很难解决问题,也可以考虑使用 Redis 解决,但是一定要非常谨慎,防止数据无限膨胀。原因如下:
首先,对于冷数据,无论大小,都不建议放在 Redis 中。Redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种浪费,冷数据放在普通的存储比如关系数据库中就好了。
其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到 Redis 中的。比如上面提到的网站总的注册用户数,就是典型的 Redis 用做计数器的例子。再比如论坛最新发表列表,最新报名列表,可以控制数量在几百到一千的规模,也是典型的 redis 做最新列表的使用方式。
另外,对于量比较大的热数据(或者冷热不均数据),使用 Redis 时一定要比较谨慎。这种类型数据很容易引起数据膨胀,导致 Redis 消耗内存巨大,让系统难以承受。薄荷的一个惨痛教训是把用户关注(以及被关注)数据放在 Redis 中,这是一种数据量极大,冷热很不均衡的数据,在几百万的用户级别就占用了近 10 GB左右内存,让 Redis 变得难以应付。应对这种类型的数据,可以用普通存储 + 缓存的方式。
如果用对了地方,比如在小而热的数据情形,Redis 表现很棒,如果用错了地方,Redis 也会带来昂贵的代价,所以使用时务必谨慎。
先说redisredis是一个类似memcached的key/value存储系统,它支持存储的value类型相对较多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 *** 作写入追加的记录文件(这点儿个人觉得redis比memcache在数据保存上要安全一些),并且在此基础上实现了master-slave(主从)同步。redis的存取性能很高,SET *** 作每秒钟110000次,GET *** 作每秒钟81000次(速度很爽!)。Redis针对不同的存储类型对象提供了不同的命令。redis目前提供四种数据类型:string,list,set及zset(sortedset)。string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的 *** 作与Memcached的 *** 作类似。但它的功能更丰富。list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。 *** 作中key理解为链表的名字。set是集合,和我们数学中的集合概念相似,对集合的 *** 作有添加删除元素,有对多个集合求交并差等 *** 作。 *** 作中key理解为集合的名字。zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。 *** 作中key理解为zset的名字。下面提供redis命令:适合全体类型的命令EXISTSkey判断一个键是否存在;存在返回1;否则返回0;DELkey删除某个key,或是一系列key;DELkey1key2key3key4TYPEkey返回某个key元素的数据类型(none:不存在,string:字符,list,set,zset,hash)KEYSpattern返回匹配的key列表(KEYSfoo:查找foo开头的keys)RANDOMKEY随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串RENAMEoldnamenewname更改key的名字,新键如果存在将被覆盖RENAMENXoldnamenewname更改key的名字,如果名字存在则更改失败DBSIZE返回当前数据库的key的总数EXPIRE设置某个key的过期时间(秒),(EXPIREbruce1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。TTL查找某个key还有多长时间过期,返回时间秒SELECTindex选择数据库MOVEkeydbindex将指定键从当前数据库移到目标数据库dbindex。成功返回1;否则返回0(源数据库不存在key或目标数据库已存在同名key);FLUSHDB清空当前数据库中的所有键FLUSHALL清空所有数据库中的所有键处理字符串的命令SETkeyvalue给一个键设置字符串值。SETkeynamedatalengthdata(SETbruce10paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库),data最大不可超过1G。GETkey获取某个key的value值。如key不存在,则返回字符串“nil”;如key的值不为字符串类型,则返回一个错误。GETSETkeyvalue可以理解成获得的key的值然后SET这个值,更加方便的 *** 作(SETbruce10paitoubing,这个时候需要修改bruce变成1234567890并获取这个以前的数据paitoubing,GETSETbruce101234567890)MGETkey1key2…keyN一次性返回多个键的值SETNXkeyvalueSETNX与SET的区别是SET可以创建与更新key的value,而SETNX是如果key不存在,则创建key与value数据MSETkey1value1key2value2…keyNvalueN在一次原子 *** 作下一次性设置多个键和值MSETNXkey1value1key2value2…keyNvalueN在一次原子 *** 作下一次性设置多个键和值(目标键不存在情况下,如果有一个以上的key已存在,则失败)INCRkey自增键值INCRBYkeyinteger令键值自增指定数值DECRkey自减键值DECRBYkeyinteger令键值自减指定数值处理lists的命令RPUSHkeyvalue从List尾部添加一个元素(如序列不存在,则先创建,如已存在同名Key而非序列,则返回错误)LPUSHkeyvalue从List头部添加一个元素LLENkey返回一个List的长度LRANGEkeystartend从自定的范围内返回序列的元素(LRANGEtestlist02;返回序列testlist前012元素)LTRIMkeystartend修剪某个范围之外的数据(LTRIMtestlist02;保留012元素,其余的删除)LINDEXkeyindex返回某个位置的序列值(LINDEXtestlist0;返回序列testlist位置为0的元素)LSETkeyindexvalue更新某个位置元素的值LREMkeycountvalue从List的头部(count正数)或尾部(count负数)删除一定数量(count)匹配value的元素,返回删除的元素数量。LPOPkeyd出List的第一个元素RPOPkeyd出List的最后一个元素RPOPLPUSHsrckeydstkeyd出_srckey_中最后一个元素并将其压入_dstkey_头部,key不存在或序列为空则返回“nil”处理集合(sets)的命令(有索引无序序列)SADDkeymember增加元素到SETS序列,如果元素(membe)不存在则添加成功1,否则失败0;(SADDtestlist3/none)SREMkeymember删除SETS序列的某个元素,如果元素不存在则失败0,否则成功1(SREMtestlist3/None)SPOPkey从集合中随机d出一个成员SMOVEsrckeydstkeymember把一个SETS序列的某个元素移动到另外一个SETS序列(SMOVEtestlisttest3/ntwo;从序列testlist移动元素two到test中,testlist中将不存在two元素)SCARDkey统计某个SETS的序列的元素数量SISMEMBERkeymember获知指定成员是否存在于集合中SINTERkey1key2…keyN返回key1,key2,…,keyN中的交集SINTERSTOREdstkeykey1key2…keyN将key1,key2,…,keyN中的交集存入dstkeySUNIONkey1key2…keyN返回key1,key2,…,keyN的并集SUNIONSTOREdstkeykey1key2…keyN将key1,key2,…,keyN的并集存入dstkeySDIFFkey1key2…keyN依据key2,…,keyN求key1的差集。官方例子:key1=x,a,b,ckey2=ckey3=a,dSDIFFkey1,key2,key3=>x,bSDIFFSTOREdstkeykey1key2…keyN依据key2,…,keyN求key1的差集并存入dstkeySMEMBERSkey返回某个序列的所有元素SRANDMEMBERkey随机返回某个序列的元素处理有序集合(sortedsets)的命令(zsets)ZADDkeyscoremember添加指定成员到有序集合中,如果目标存在则更新score(分值,排序用)ZREMkeymember从有序集合删除指定成员ZINCRBYkeyincrementmember如果成员存在则将其增加_increment_,否则将设置一个score为_increment_的成员ZRANGEkeystartend返回升序排序后的指定范围的成员ZREVRANGEkeystartend返回降序排序后的指定范围的成员ZRANGEBYSCOREkeyminmax返回所有符合score>=min和score=min和score形式的数据,通过key进行任何 *** 作。ttserver可以将数据持久化保存,memcached全部是保存在内存中,memcached会自动删除过期数据,最长不超过30天。memcached在和一些api配合时,能自动进行数据的出入序列化,读取反序列化。ttserver有主从复制的功能, *** 作日志等,这完全是数据库才有的东西。据说memcached正在对整体架构做调整,到时候支持plugin机制会把网络,事件处理,内存存储剥离开来以后要做基于磁盘的key-value存储就可以写一个存储引擎就成了。memcached的二次开发又步入一个小高潮。
Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器,并将被执行的多个命令请求的结果在一个命令回复中全部返回 给客户端,使用这个功能可以有效地减少客 户端在执行多个命令时需要与服务器进行通信的次数,多个命令执行的数据会以列表的形式返回
redigo客户端使用Send和Do方法来实现流水线事务
1与M *** 作的对比
pipeline:多条命令发送到服务端多条命令在队列中排队不是原子 *** 作,返回的结果是顺序的
M *** 作:是原子 *** 作
2注释:
SUBSCRIBE channel [channel …] // 订阅频道
示例 :
SUBSCRIBE news::it
PSUBSCRIBE pattern [pattern] // 订阅一个或多个模式
订阅一个或多个模式, pattern 参数可以包含 glob 风格的匹配符,比如:
示例 :
PSUBSCRIBE news::[ie]t
UNSUBSCRIBE [channel [channel …]] // 退订指定频道
PUNSUBSCRIBE [pattern [pattern…]] // 退订指定模式
PUBLISH channel message
将消息发送至指定的频道,命令返回接收到消息的 订阅者数量。
PUBSUB CHANNELS [pattern]
PUBSUB NUMSUB [channel-1 channel-N]
PUBSUB NUMPAT
Redis 的事务功能允许用户将多个命令包裹起来,然后一次性地、按 顺序地执行被包裹的所有命令。在事务执行的过程中,服务器不会中断事务而改去执行其他命令请求,只有在事务包裹的所有命令都被执行完毕之后,服务器才会去处理其他命令请求
通过事务, 我们可以让 Redis 一次性地执行多个命令, 并且确保事务中的命令要么就全部都 执行,要么就一个都不执行
MULTI // 开始一个新的事务
DISCARD // 放弃事务
EXEC // 执行事务中的所有命令
按照命令被入队到事务队列中的顺序,执行事务队列中的所有命令。命令的复杂度为队列中所有命令的复杂度之和。命令的返回值是一个列表,列表里包含了事 务队列中所有被执行命令的返回值
与流水线对比:
使用 WATCH 来防止竞争条件:
位图可以直接 *** 作数据保存的二进制数据位的值
getbit key offset
注:对key所存储的字符串值,获取指定偏移量上的位
setbit key offset value
注:对key所存储的字符串值,设置或清除指定偏移量上的位(bit)返回值为该位在setbit之前的值,value只能取0或1,offset从0开始
bitcount key [start end]
注:获取位图指定范围中位值为1的个数,如果不指定start与end,则取所有
bitpos key tartget [start end]
注:计算位图指定范围第一个等于target值的偏移量(位置)
基于算法,使用极小空间完成独立数量统计的功能,本质还是一个字符串
pfadd key element1 [element2]
注:向HyperLogLog中添加元素
pfcount key1 [key2]
注:计算HyperLogLog的独立总数
pfmerge hyperloglogKey key1 [key2]
注:合并多个hyperLogLog到hyperloglogKey中
功能:存储经纬度、计算两地距离、范围计算等,基于ZSet实现
geoadd key longitude latitude elementName [lon lat elementName]
注:增加经纬度元素
geopos key element1 [element2]
注:获取经纬度元素
geodist key member1 member2 [unit]
注:获取两个经纬度元素的距离
unit取值范围
注:以给定的经纬度为中心,返回包含的位置元素当中,与中心距离不超过给定最大距离的所有位置元素。
georadiusbymember key member radius unit [withcoord][withdist][withhash][COUNT count][sort][store key][storedist key]
注:以给定的元素为中心,返回包含的位置元素当中,与中心距离不超过给定最大距离的所有位置元素。
慢查询相关配置:
它决定了慢查询日志最多能保存多少条日志,slow log本身是一个内存中的FIFO队列,当队列大小超过slowlog-max-len时,最旧的一条日志将被删除,而最新的一条日志加入到slow log中。
2slowlog-log-slower-than
它决定要对执行时间大于多少微妙(microsecond , 1秒=1,000,000 微妙)的查询进行记录
动态配置:
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
相关命令:
slowlog get [n]
注:获取慢查询列表中的慢查询信息
slowlog len
注:获取慢查询队列长度
slowlog reset
注:清空慢查询队列
1 设置一个string类型的key和value:(重复添加值会覆盖)命令:set 2 设置一个key的值string类型的value, key值不存在则添加,key值存在则返回0:命令:setnx 3 设置一个键值的有效期:命令:setex #nil 表示为空,没有的意思、不存在 4 设置指定key的value值的子字符串:命令:setrange 一次设置多个key的值、成功返回ok、失败返回0:命令:mset ------------------------------------------ 一次获取多个key的值、成功返回ok、失败返回0:命令:mget 设置多个value、不覆盖已存在的key:命令:msetnx 获取key对应的value值(nil) 命令:get --------------------------------- 设置key的值,并返回key的旧值 getset 获取key的value值的字符串:命令:getrange 对key的值做加加 *** 作,并返回新的值:命令:incr(类似于i++) 加指定值,key不存在设置key,并认为原来的值为0:命令:incrby 对key的值做减减 *** 作:命令:decr 同decr类似,减:命令:decrby 给指定的key的字符串追加value,返回新字符串值的长度:命令:append 取指定key的value值的长度:命令:strlen
我们知道Redis默认有16个数据库,默认是第0个数据库,那么如果在需要对数据库进行切换的时候,我们就可以使用下面这个命令:
使用如下命令进行切换
如果想要清除指定某一个数据库的数据
清除所有数据库的数据
接下来这个命令应该是最常用的了
平常在开发中,我们还需要经常对key进行判断,判断其是否存在
因为我们设置的缓存数据一般都不能是永久的,这个时候就需要我们在存储数据的时候,就为其设置过期时间。
string类型是Redis中五大基本数据类型之一,这也是最常使用到的一个数据类型,所有很多小伙伴们对Redis的认识和 *** 作就仅仅的停留在了对Redis的 *** 作层面,但是你是否知道string类型中的相关命令,还是有非常多实用的
接下来先看一下对string类型进行基本存储和获取的命令。
如果我们存储的string中的内容是数字的话,我们也可以对其进行增或减 *** 作,Redis可以自动的对字符串进行相关的 *** 作。实现的命令如下:
使用msetnx时,同时设置一个或多个 key-value 对,当且仅当所有给定 key都不存在时才成立。
getset命令从字面意思就可以看出来,他的作用是先get再set。
总结string类似的使用场景:
在使用list类型进行存取的时候,有两个命令需要进行区分:
注意:只有pop和push才分左右,其他的l都是list的意思
总结:
总结set集合一般用于元素的不重复的场景,比如抽奖系统,轮播等场景下
在使用hash集合的时候,要注意,hash其实就是一个Map集合,key-map的时候,值是一个map集合的形式进行存储的,也和Java中的hashmap有一个类似。
HVALS获取所有的value,HKEYS获取所有的key,HGETALL获取所有的键值
总结:
hash可以用于存储变更的数据,比如user,name,age等,尤其是用户信息之类的,hash更加适合用于对象的存储,string更加适合用于字符串的存储。
在set集合的基础上增加一个序列号,来进行排序
ZRANGEBYSCORE使用语法
总结
以上是在对五种数据类型进行存取时的一些常用命令 *** 作。关于其他的命令使用,小伙伴们在用到的时候可以直接入官网查看就可以了。
redis的值有5种类型,不同的类型有不同的命令来获取:字符直接getkey队列左端d出一个元素LPOPkey哈希HGETkeyfield集合SMEMBERSkey返回集合中的所有元素有序集合ZRANGEkeystartstop更详细的命令可以查看redis常用命令。
以上就是关于为什么用redismanager查看key中的value是0代码get出来是OK全部的内容,包括:为什么用redismanager查看key中的value是0代码get出来是OK、php redis Hash 怎么通过 一个指定的value 查找到对应的 key 值、redis field 是什么意思 跟key是什么关系,比如lpush(key,field,value)应该怎么设置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)