getset中的setfieldsvaluee值的类型能不能和原值不一样

Redis 2.8 数据类型
时间: 01:38:20
&&&& 阅读:70
&&&& 评论:
&&&& 收藏:0
标签:1Redis数据类型1.1StringKey‘[{"CityId":18,"CityName":"xian","ProvinceId":27,"CityOrder":1},{"CityId":53,"CityName":"guangzhou","ProvinceId":27,"CityOrder":1}]‘最为基础的数据存储类型。可以存储字符串和二进制数据,在Redis中字符串类型的Value最多可以容纳的数据长度是512M。命令描述例子Set赋值SET key valueGet获取值GET keyAPPEND追加字符串APPEND key valueDECR减少值DECR keyINCR增加值INCR keyDECRBY设置减少数值的步长DECRBY key decrementINCRBY设置增加数值的步长INCRBY key incrementGETSET先获取值再赋值,原子性操作GETSET key valueSTRLEN返回key的长度STRLEN keySETEX设置key在服务器中存在的时间SETEX key seconds valueSETNXKey不存在设置值,否则不做操作SETNX key valueSETRANGE字符串替换SETRANGE key start &"value"GETRANGE截取字符串GETRANGE key start endSETBIT设置二进制的值SETBIT key offset valueGETBIT获取二进制的值GETBIT key offsetMGET返回多个key的值MGET key [key ...]MSET设置多个key、valueMSET key value [key &value ...]MSETNXKey不存在设置多个key、value值,否则不做操作MSETNX key value& [key value ...]&1.2ListList类型是按照插入顺序排序的字符串链表(相当于java的linkedlist)。可以在链表的两头插入或删除元素,List中可以包含的最大元素数量是。命令描述例子LPUSH在list头部添加多个值LPUSH key value [value &...]LPUSHXKey存在则添加值,否则不做操作LPUSHX key valueLRANGE遍历list中key数据LRANGE key start stopLPOP从头部弹出key中的值LPOP keyLLEN返回key的长度LLEN keyLREM删除前面几个值等于某值得元素LREM key count valueLSET给下标赋值LSET key index valueLINDEX返回下标中的值LINDEX key indexLTRIM截取list中的值LTRIM key start stopLINSERT在某个值的前面或者后面插入值LINSERT key BEFORE|AFTER pivot valueRPUSH在list尾部添加多个值RPUSH key value [value &...]RPUSHX在list尾部添加单个值RPUSHX key valueRPOP从尾部弹出值RPOP keyRPOPLPUSH从一个集合尾部弹出值插入到里一个集合的头部RPOPLPUSH source &destination&1.3HashHashes类型可以看成具有String Key和String Value的map容器(就相当于java中的hashmap类型)。非常适合于存储值对象的信息。如Username、Password和Age等。命令描述例子HSET给key中filed字段赋值HSET key field valueHGET获取key中filed的值HGET key fieldHEXISTS判断filed是否存在 0 、1HEXISTS key fieldHLEN获取key 的长度HLEN keyHDEL删除file字段HDEL key field [field &...]HSETNX如果filed不存赋值否则不做操作HSETNX key field valueHINCRBY给filed增加步长HINCRBY key field incrementHGETALL获取所有的filed和valueHGETALL keyHKEYS获取keyHKEYS keyHVALS获取valueHVALS keyHMGET获取所有filed字段的值HMGET key field [field &...]HMSET设置多个filed字段valueHMSET key field value &[field value ...]&1.4SetSet类型看作为没有排序的字符集合,Set集合中不允许出现重复的元素,redis可以在服务器端完成多个Sets之间的计算操作,如unions、intersections和differences。这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销命令描述例子SADD添加值SADD key member [member &...]SMEMBERS遍历集合SMEMBERS keySCARD获取key的成员数量SCARD keySISMEMBER判断成员是否存在SISMEMBER key memberSpop随机弹出值Spop keySREM删除指定的成员SREM key member [member &...]SRANDMEMBER随机返回成员,不删除原值SRANDMEMBER keySMOVE移动一个集合的成员到另一个集合SMOVE source destination memberSDIFF求集合差集SDIFF key [key ...]SDIFFSTORE集合中的差集存储到新集合中SDIFFSTORE destination key [key ...]SINTER求集合交集SINTER key [key ...]SINTERSTORE将集合交集存储到新集合SINTERSTORE destination key [key ...]SUNION求集合并集SUNION key [key ...]SUNIONSTORE将集合的并集存储到新集合SUNIONSTORE destination key [key ...]&&1.5Sortedset不允许出现重复的元素,每一个成员都会有一个分数(score)与之关联,用分数来进行排序,分数是可以重复的命令描述例子ZADD添加排序成员ZADD key score member &[score] [member]ZCARD获取成员数量ZCARD keyZCOUNT获取分数在min和max之间成员有多少个ZCOUNT key min maxZINCRBY增加指定成员的分数ZINCRBY key increment memberZRANGE遍历成员以及分数ZRANGE key start stop &[WITHSCORES]ZRANGEBYSCORE返回分数在min和max之间的成员和分数ZRANGEBYSCORE key min &max [WITHSCORES]ZRANK返回成员的下标ZRANK key memberZREM删除指定成员ZREM key member [member ...]ZREVRANGE遍历成员以及分数从大到小ZREVRANGE key start stop [WITHSCORES]ZREVRANK返回成员下标顺序从大到小ZREVRANK key memberZSCORE获取指定成员的分数ZSCORE key memberZREVRANGEBYSCORE获取成员以及分数按照从高到低ZREVRANGEBYSCORE key max min [WITHSCORES]ZREMRANGEBYRANK删除下标之间的数据ZREMRANGEBYRANK key start stopZREMRANGEBYSCORE删除分数在min和max中的成员ZREMRANGEBYSCORE key min max&&1.6对于key的应用命令用对key的操作,通常可以用来维护数据命令描述例子KEYS 获取所有的keyKEYS patternDel删除指定的keyDEL key [key ...]EXISTS判断key是否存在EXISTS keyMOVE移动一个key到另一个库中MOVE key dbRENAME给key从新命名RENAME key newkeyRENAMENX修改key的名字RENAMENX key newkeyPERSIST持久化keyPERSIST keyEXPIRE设置key存活时间EXPIRE key secondsEXPIREAT设置key存活时间(年月日)EXPIREAT key timestampTTL实时查看key存活时间TTL keyRANDOMKEY随机返回一个keyRANDOMKEYTYPE查看key的中value数据类型TYPE keySELECT进入指定库SELECT NUM1.7消息发布、订阅什么是消息:qq聊天、发个邮件、手机短信都可以称为消息什么是发布:A发一个消息给B,A就是在发布消什么是订阅:B要想接收到A的消息需要添加A为好友,添加好友就是订阅场景:常用于构建类似在线聊天应用,网站内部消息系统命令:发布频道消息:publish news ‘today issunshine‘订阅频道:subscribenews批量订阅:psubscribenew*标签:原文:http://liuzedong./3719
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Redis学习手册(String数据类型)
Redis学习手册(String数据类型)
发布时间: 14:30:49
编辑:www.fx114.net
本篇文章主要介绍了"Redis学习手册(String数据类型)",主要涉及到Redis学习手册(String数据类型)方面的内容,对于Redis学习手册(String数据类型)感兴趣的同学可以参考一下。
一、概述:
&& && 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
二、相关命令列表:
时间复杂度
返回值
APPENDkey&value
如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。
追加后Value的长度。
将指定Key的Value原子性的递减1。如果该Key不存在,其初始值为0,在decr之后其值为-1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。
递减后的Value值。
将指定Key的Value原子性的递增1。如果该Key不存在,其初始值为0,在incr之后其值为1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。&
递增后的Value值。&
DECRBYkey decrement &
将指定Key的Value原子性的减少decrement。如果该Key不存在,其初始值为0,在decrby之后其值为-decrement。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。&
减少后的Value值。
INCRBYkey increment&&
将指定Key的Value原子性的增加increment。如果该Key不存在,其初始值为0,在incrby之后其值为increment。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。&
增加后的Value值。
获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。&
与该Key相关的Value,如果该Key不存在,返回nil。
SET&key value&
设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值。
总是返回&OK&。
GETSETkey value
原子性的设置该Key为指定的Value,同时返回该Key的原有值。和GET命令一样,该命令也只能处理string Value,否则Redis将给出相关的错误信息。
返回该Key的原有值,如果该Key之前并不存在,则返回nil。
返回指定Key的字符值长度,如果Value不是string类型,Redis将执行失败并给出相关的错误信息。
返回指定Key的Value字符长度,如果该Key不存在,返回0。
SETEX&key seconds value
原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。该命令主要应用于Redis被当做Cache服务器使用时。
SETNX&key value&
如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。
1表示设置成功,否则0。
SETRANGEkey offset value&
替换指定Key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,其中如果offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量的0x00,之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。鉴于字符串Value的最大长度为512M,因此offset的最大值为。最后需要注意的是,如果该命令在执行时致使指定Key的原有值长度增加,这将会导致Redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。&
修改后的字符串Value长度。
GETRANGEkey start end
如果截取的字符串长度很短,我们可以该命令的时间复杂度视为O(1),否则就是O(N),这里N表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。
SETBITkey offset value&
设置在指定Offset上BIT的值,该值只能为1或0,在设定后该命令返回该Offset上原有的BIT值。如果指定Key不存在,该命令将创建一个新值,并在指定的Offset上设定参数中的BIT值。如果Offset大于Value的字符长度,Redis将拉长Value值并在指定Offset上设置参数中的BIT值,中间添加的BIT值为0。最后需要说明的是Offset值必须大于0。&
在指定Offset上的BIT原有值。
GETBITkey offset&
返回在指定Offset上BIT的值,0或1。如果Offset超过string value的长度,该命令将返回0,所以对于空字符串始终返回0。
在指定Offset上的BIT值。&
MGET&key [key ...]&
N表示获取Key的数量。返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。
返回一组指定Keys的Values的列表。
MSET&key value [key value ...]&
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。&
该命令不会失败,始终返回OK。 &
MSETNXkey value [key value ...]&
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SETNX命令。然而这里需要明确说明的是,如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。
1表示所有Keys都设置成功,0则表示没有任何Key被修改。
三、命令示例:
&& 1. SET/GET/APPEND/STRLEN:
&&&&/& redis-cli&&&#执行Redis客户端工具。
&& &redis 127.0.0.1:6379&&exists mykey&&&&&&&&&&&&&&&&&&&#判断该键是否存在,存在返回1,否则返回0。
&& &(integer) 0
&& &redis 127.0.0.1:6379&&append mykey &hello&& & &&#该键并不存在,因此append命令返回当前Value的长度。
&& &(integer) 5
&& &redis 127.0.0.1:6379&&append mykey & world&&&&&#该键已经存在,因此返回追加后Value的长度。
&& &(integer) 11
&& &redis 127.0.0.1:6379&&get mykey & & & & & & & & &&&&&#通过get命令获取该键,以判断append的结果。
&& &&hello world&
&&& redis 127.0.0.1:6379&&set mykey &this is a test&&#通过set命令为键设置新值,并覆盖原有值。
&&& redis 127.0.0.1:6379&&get mykey
&&& &this is a test&
&&& redis 127.0.0.1:6379&&strlen mykey&&&&&&&&&&&&&&&&& #获取指定Key的字符长度,等效于C库中strlen函数。
&&& (integer) 14
&& &2. INCR/DECR/INCRBY/DECRBY:
&&& redis 127.0.0.1:6379&&set mykey 20&&&&&#设置Key的值为20
&& &redis 127.0.0.1:6379&&incr mykey&& &&&&& #该Key的值递增1
&& &(integer) 21
&& &redis 127.0.0.1:6379&&decr mykey&&&&&&& #该Key的值递减1
&& &(integer) 20
&& &redis 127.0.0.1:6379&&del mykey&&& & & &&#删除已有键。
&& &(integer) 1
&& &redis 127.0.0.1:6379&&decr mykey&&&&&&& #对空值执行递减操作,其原值被设定为0,递减后的值为-1
&& &(integer) -1
&& &redis 127.0.0.1:6379&&del mykey&&&
&& &(integer) 1
&& &redis 127.0.0.1:6379&&incr mykey&&&&&&&&#对空值执行递增操作,其原值被设定为0,递增后的值为1
&& &(integer) 1
&& &redis 127.0.0.1:6379&&set mykey hello&#将该键的Value设置为不能转换为整型的普通字符串。
&& &redis 127.0.0.1:6379&&incr mykey&&&&&&&&#在该键上再次执行递增操作时,Redis将报告错误信息。
&&&&(error) ERR value is not an integer or out of range
&&& redis 127.0.0.1:6379&&set mykey 10
&& &redis 127.0.0.1:6379&&decrby mykey 5&
&& &(integer) 5
&& &redis 127.0.0.1:6379&&incrby mykey 10
&& &(integer) 15
&&&&3. GETSET:
&& &redis 127.0.0.1:6379&&incr mycounter&&&&&&#将计数器的值原子性的递增1
&& &(integer) 1
&&& #在获取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成。
&& &redis 127.0.0.1:6379&&getset mycounter 0&&
&& &redis 127.0.0.1:6379&&get mycounter&&&&&&&#查看设置后的结果。
&& &&& &&&&&
&&&&4. SETEX:
&&& redis 127.0.0.1:6379&&setex mykey 10 &hello&&&&#设置指定Key的过期时间为10秒。
&&& OK&&&&
& &&#通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期。
&&& redis 127.0.0.1:6379&&ttl mykey&&&&&&&&&&&&&&&&&&&&&&&
&&& (integer) 4
&&& redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&&&&&&&#在该键的存活期内我们仍然可以获取到它的Value。
&&& &hello&
&&& redis 127.0.0.1:6379&&ttl mykey&&&&&&&&&&&&&&&&&&&&&&&&#该ttl命令的返回值显示,该Key已经过期。
&&& (integer) 0
&&& redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&&&&&&&#获取已过期的Key将返回nil。
&& 5. SETNX:
&& &redis 127.0.0.1:6379&&del mykey&&&&&&&&&&&& & & & &&&#删除该键,以便于下面的测试验证。
&& &(integer) 1
&& &redis 127.0.0.1:6379&&setnx mykey &hello&&&&&&&&&#该键并不存在,因此该命令执行成功。
&& &(integer) 1
&& &redis 127.0.0.1:6379&&setnx mykey &world&&&&&&&&#该键已经存在,因此本次设置没有产生任何效果。
&& &(integer) 0
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&& & & & &&&#从结果可以看出,返回的值仍为第一次设置的值。
&& &&hello&
&&&&6. SETRANGE/GETRANGE:
&& &redis 127.0.0.1:6379&&set mykey &hello world&&&&&&&&#设定初始值。
&& &redis 127.0.0.1:6379&&setrange mykey 6 dd&&&&&&&&&&#从第六个字节开始替换2个字节(dd只有2个字节)
&& &(integer) 11
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&&&&&&&&&&#查看替换后的值。
&& &&hello ddrld&
&& &redis 127.0.0.1:6379&&setrange mykey 20 dd&&&&&&&&#offset已经超过该Key原有值的长度了,该命令将会在末尾补0。
&& &(integer) 22
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&&&&& & & &&#查看补0后替换的结果。
&& &&hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd&
&& &redis 127.0.0.1:6379&&del mykey&&&&&&&&&&&&&&&&&&&&&&&&&#删除该Key。
&& &(integer) 1
&& &redis 127.0.0.1:6379&&setrange mykey 2 dd&&&&&&&&&#替换空值。
&& &(integer) 4
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&&&&&&&&&#查看替换空值后的结果。
&& &&\x00\x00dd&&&&
&& &redis 127.0.0.1:6379&&set mykey &&&&&#设置新值。
&& &redis 127.0.0.1:6379&&getrange mykey 1 2&&&&&&#截取该键的Value,从第一个字节开始,到第二个字节结束。
&& &redis 127.0.0.1:6379&&getrange mykey 1 20&&&#20已经超过Value的总长度,因此将截取第一个字节后面的所有字节。
&&&&7. SETBIT/GETBIT:
&& &redis 127.0.0.1:6379&&del mykey
&& &(integer) 1
&& &redis 127.0.0.1:6379&&setbit mykey 7 1&&&&&&&#设置从0开始计算的第七位BIT值为1,返回原有BIT值0
&& &(integer) 0
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&#获取设置的结果,二进制的的十六进制值为0x01
&& &&\x01&
&& &redis 127.0.0.1:6379&&setbit mykey 6 1&&&&&&&#设置从0开始计算的第六位BIT值为1,返回原有BIT值0
&& &(integer) 0
&& &redis 127.0.0.1:6379&&get mykey&&&&&&&&&&&&&&&&#获取设置的结果,二进制的的十六进制值为0x03
&& &&\x03&
&&& redis 127.0.0.1:6379&&getbit mykey 6&&&&&&&&&&#返回了指定Offset的BIT值。
&& &(integer) 1
&& &redis 127.0.0.1:6379&&getbit mykey 10&&&&&&&&#Offset已经超出了value的长度,因此返回0。
&& &(integer) 0
&& 8. MSET/MGET/MSETNX:
&& &redis 127.0.0.1:6379&&mset key1 &hello& key2 &world&&&&#批量设置了key1和key2两个键。
&& &redis 127.0.0.1:6379&&mget key1 key2&&&&&&&&&&&&&&&&&&&&&&&&#批量获取了key1和key2两个键的值。
&& &1) &hello&
&& &2) &world&
&& &#批量设置了key3和key4两个键,因为之前他们并不存在,所以该命令执行成功并返回1。
&& &redis 127.0.0.1:6379&&msetnx key3 &stephen& key4 &liu&&
&& &(integer) 1
&& &redis 127.0.0.1:6379&&mget key3 key4&&&&&&&&&&&&&&&&& &
&& &1) &stephen&
&& &2) &liu&
&& &#批量设置了key3和key5两个键,但是key3已经存在,所以该命令执行失败并返回0。
&& &redis 127.0.0.1:6379&&msetnx key3 &hello& key5 &world&&
&& &(integer) 0
&& &#批量获取key3和key5,由于key5没有设置成功,所以返回nil。
&& &redis 127.0.0.1:6379&&mget key3 key5&&&&&&&&&&&&&&&&& &
&& &1) &stephen&
&& &2) (nil)
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:下面是一个对官方文档《》一文的翻译,如其题目所言,此文目的在于让一个初学者能通过15分钟的简单学习对Redis的有一个了解。Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。它起步较晚,发展迅速,目前已被许多大型机构采用,比如Github,。本文翻译自Redis的一篇官方文档:方便感兴趣的朋友,快速介绍Redis的数据类型。中英文对照,如有疏漏敬请留言,某些关键词不译,便于阅读。—————————————————————————————————————你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。也就是说,你不必仅仅把字符串当作键所指向的值。下列这些数据类型都可作为值类型。二进制安全的 字符串&string二进制安全的 字符串列表&&of string二进制安全的 字符串集合&&of string,换言之:它是一组无重复未排序的element。可以把它看成Ruby中的&–其key等于element,value都等于’true‘。有序集合sorted set&of string,类似于集合set,但其中每个元素都和一个浮点数score(评分)关联。element根据score排序。可以把它看成Ruby中的 hash–其key等于element,value等于score,但元素总是按score的顺序排列,无需额外的排序操作。Redis 键Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。关于key的几条规则:太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。最好坚持一种模式。例如:”object-type:id:field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。字符串类型这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。我们来玩儿一下字符串类型:$&redis-cli&set&mykey&&my&binary&safe&value&
$&redis-cli&get&mykey
my&binary&safe&value正如你所见到的,通常用&和&来设置和获取字符串值。值可以是任何种类的字符串(包括二进制数据),例如你可以在一个键下保存一副jpeg图片。值的长度不能超过1GB。虽然字符串是Redis的基本值类型,但你仍然能通过它完成一些有趣的操作。例如:原子递增:$&redis-cli&set&counter&100
OK&$&redis-cli&incr&counter
(integer)&101
$&redis-cli&incr&counter
(integer)&102
$&redis-cli&incrby&counter&10
(integer)&112&命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有,&&and&。实际上他们在内部就是同一个命令,只是看上去有点儿不同。INCR是原子操作意味着什么呢?就是说即使多个客户端对同一个key发出INCR命令,也决不会导致竞争的情况。例如如下情况永远不可能发生:『客户端1和客户端2同时读出“10”,他们俩都对其加到11,然后将新值设置为11』。最终的值一定是12,read-increment-set操作完成时,其他客户端不会在同一时间执行任何命令。对字符串,另一个的令人感兴趣的操作是命令,行如其名:他为key设置新值并且返回原值。这有什么用处呢?例如:你的系统每当有新用户访问时就用命令操作一个Redis key。你希望每小时对这个信息收集一次。你就可以GETSET这个key并给其赋值0并读取原值。列表类型要说清楚列表数据类型,最好先讲一点儿理论背景,在信息技术界List这个词常常被使用不当。例如”Python Lists”就名不副实(名为Linked Lists),但他们实际上是数组(同样的数据类型在Ruby中叫数组)一般意义上讲,列表就是有序元素的序列:10,20,1,2,3就是一个列表。但用数组实现的List和用Linked List实现的List,在属性方面大不相同。Redis lists基于Linked Lists实现。这意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。用&命令在十个元素的list头部添加新元素,和在千万元素list头部添加新元素的速度相同。那么,坏消息是什么?在数组实现的list中利用索引访问元素的速度极快,而同样的操作在linked list实现的list上没有那么快。Redis Lists are implemented with linked lists because for a database system it is crucial to be able to add elements to a very long list in a very fast way. Another strong advantage is, as you’ll see in a moment, that Redis Lists can be taken at constant length in constant time.Redis Lists用linked list实现的原因是:对于数据库系统来说,至关重要的特性是:能非常快的在很大的列表上添加元素。另一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。Redis lists 入门&命令可向list的左边(头部)添加一个新元素,而命令可向list的右边(尾部)添加一个新元素。最后&命令可从list中取出一定范围的元素$&redis-cli&rpush&messages&&Hello&how&are&you?&
$&redis-cli&rpush&messages&&Fine&thanks.&I‘m&having&fun&with&Redis&
$&redis-cli&rpush&messages&&I&should&look&into&this&NOSQL&thing&ASAP&
$&redis-cli&lrange&messages&0&2
1.&Hello&how&are&you?
2.&Fine&thanks.&I‘m&having&fun&with&Redis
3.&I&should&look&into&this&NOSQL&thing&ASAP注意&带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。As you can guess from the example above, lists can be used, for instance, in order to implement a chat system. Another use is as queues in order to route messages between different processes. But the key point is that you can use Redis lists every time you require to access data in the same order they are added. This will not require any SQL ORDER BY operation, will be very fast, and will scale to millions of elements even with a toy Linux box.正如你可以从上面的例子中猜到的,list可被用来实现聊天系统。还可以作为不同进程间传递消息的队列。关键是,你可以每次都以原先添加的顺序访问数据。这不需要任何SQL ORDER BY 操作,将会非常快,也会很容易扩展到百万级别元素的规模。例如在评级系统中,比如社会化新闻网站 ,你可以把每个新提交的链接添加到一个list,用可简单的对结果分页。在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入进博客评论,等等。向Redis list压入ID而不是实际的数据在上面的例子里 ,我们将“对象”(此例中是简单消息)直接压入Redis list,但通常不应这么做,由于对象可能被多次引用:例如在一个list中维护其时间顺序,在一个集合中保存它的类别,只要有必要,它还会出现在其他list中,等等。让我们回到的例子,将用户提交的链接(新闻)添加到list中,有更可靠的方法如下所示:$&redis-cli&incr&next.news.id
(integer)&1
$&redis-cli&set&news:1:title&&Redis&is&simple&
$&redis-cli&set&news:1:url&&/p/redis&
$&redis-cli&lpush&submitted.news&1
OK我们自增一个key,很容易得到一个独一无二的自增ID,然后通过此ID创建对象–为对象的每个字段设置一个key。最后将新对象的ID压入submitted.news&list。这只是牛刀小试。在文档中可以读到所有和list有关的命令。你可以删除元素,旋转list,根据索引获取和设置元素,当然也可以用得到list的长度。Redis 集合Redis集合是未排序的集合,其元素是二进制安全的字符串。命令可以向集合添加一个新元素。和sets相关的操作也有许多,比如检测某个元素是否存在,以及实现交集,并集,差集等等。一例胜千言:$&redis-cli&sadd&myset&1
(integer)&1
$&redis-cli&sadd&myset&2
(integer)&1
$&redis-cli&sadd&myset&3
(integer)&1
$&redis-cli&smembers&myset
3.&2我向集合中添加了三个元素,并让Redis返回所有元素。如你所见它们是无序的。现在让我们检查某个元素是否存在:$&redis-cli&sismember&myset&3
(integer)&1
$&redis-cli&sismember&myset&30
(integer)&0“3″是这个集合的成员,而“30”不是。集合特别适合表现对象之间的关系。例如用Redis集合可以很容易实现标签功能。下面是一个简单的方案:对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联。例如假设我们的新闻ID 1000被加了三个标签tag 1,2,5和77,就可以设置下面两个集合:$&redis-cli&sadd&news:1000:tags&1
(integer)&1
$&redis-cli&sadd&news:1000:tags&2
(integer)&1
$&redis-cli&sadd&news:1000:tags&5
(integer)&1
$&redis-cli&sadd&news:1000:tags&77
(integer)&1
$&redis-cli&sadd&tag:1:objects&1000
(integer)&1
$&redis-cli&sadd&tag:2:objects&1000
(integer)&1
$&redis-cli&sadd&tag:5:objects&1000
(integer)&1
$&redis-cli&sadd&tag:77:objects&1000
(integer)&1要获取一个对象的所有标签,如此简单:$&redis-cli&smembers&news:1000:tags
4.&2而有些看上去并不简单的操作仍然能使用相应的Redis命令轻松实现。例如我们也许想获得一份同时拥有标签1, 2, 10和27的对象列表。这可以用命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:$&redis-cli&sinter&tag:1:objects&tag:2:objects&tag:10:objects&tag:27:objects
...&no&result&in&our&dataset&composed&of&just&one&object&&&...在文档中可以找到和集合相关的其他命令,令人感兴趣的一抓一大把。一定要留意命令,Redis集合和list都是可排序的。题外话:如何为字符串获取唯一标识在标签的例子里,我们用到了标签ID,却没有提到ID从何而来。基本上你得为每个加入系统的标签分配一个唯一标识。你也希望在多个客户端同时试着添加同样的标签时不要出现竞争的情况。此外,如果标签已存在,你希望返回他的ID,否则创建一个新的唯一标识并将其与此标签关联。Redis 1.4将增加Hash类型。有了它,字符串和唯一ID关联的事儿将不值一提,但如今我们如何用现有Redis命令可靠的解决它呢?我们首先的尝试(以失败告终)可能如下。假设我们想为标签“redis”获取一个唯一ID:为了让算法是二进制安全的(只是标签而不考虑utf8,空格等等)我们对标签做SHA1签名。SHA1(redis)=b840fc02dcc15f59e41cb7be6c52。检查这个标签是否已与一个唯一ID关联,用命令GET tag:b840fc02dcc15f59e41cb7be6c52:id如果上面的GET操作返回一个ID,则将其返回给用户。标签已经存在了。否则… 用INCR next.tag.id命令生成一个新的唯一ID(假定它返回123456)。最后关联标签和新的ID,SET tag:b840fc02dcc15f59e41cb7be6c52:id 123456并将新ID返回给调用者。多美妙,或许更好…等等!当两个客户端同时使用这组指令尝试为标签“redis”获取唯一ID时会发生什么呢?如果时间凑巧,他们俩都会从GET操作获得nil,都将对next.tag.id key做自增操作,这个key会被自增两次。其中一个客户端会将错误的ID返回给调用者。幸运的是修复这个算法并不难,这是明智的版本:为了让算法是二进制安全的(只是标签而不考虑utf8,空格等等)我们对标签做SHA1签名。SHA1(redis)=b840fc02dcc15f59e41cb7be6c52。检查这个标签是否已与一个唯一ID关联,用命令GET tag:b840fc02dcc15f59e41cb7be6c52:id如果上面的GET操作返回一个ID,则将其返回给用户。标签已经存在了。否则… 用INCR next.tag.id命令生成一个新的唯一ID(假定它返回123456)。下面关联标签和新的ID,(注意用到一个新的命令)SETNX tag:b840fc02dcc15f59e41cb7be6c52:id 123456。如果另一个客户端比当前客户端更快,SETNX将不会设置key。而且,当key被成功设置时SETNX返回1,否则返回0。那么…让我们再做最后一步运算。如果SETNX返回1(key设置成功)则将123456返回给调用者,这就是我们的标签ID,否则执行GET tag:b840fc02dcc15f59e41cb7be6c52:id&并将其结果返回给调用者。有序集合集合是使用频率很高的数据类型,但是…对许多问题来说他们也有点儿太不讲顺序了;)因此Redis1.2引入了有序集合。他和集合非常相似,也是二进制安全的字符串集合,但是这次带有关联的score,以及一个类似LRANGE的操作可以返回有序元素,此操作只能作用于有序集合,它就是,&命令。基本上有序集合从某种程度上说是SQL世界的索引在Redis中的等价物。例如在上面提到的例子中,并没有提到如何根据用户投票和时间因素将新闻组合生成首页。我们将看到有序集合如何解决这个问题,但最好先从更简单的事情开始,阐明这个高级数据类型是如何工作的。让我们添加几个黑客,并将他们的生日作为“score”。$&redis-cli&zadd&hackers&1940&&Alan&Kay&
(integer)&1
$&redis-cli&zadd&hackers&1953&&Richard&Stallman&
(integer)&1
$&redis-cli&zadd&hackers&1965&&Yukihiro&Matsumoto&
(integer)&1
$&redis-cli&zadd&hackers&1916&&Claude&Shannon&
(integer)&1
$&redis-cli&zadd&hackers&1969&&Linus&Torvalds&
(integer)&1
$&redis-cli&zadd&hackers&1912&&Alan&Turing&
(integer)&1对有序集合来说,按生日排序返回这些黑客易如反掌,因为他们已经是有序的。有序集合是通过一个dual-ported 数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N))。这还行,但当我们需要访问有序的元素时,Redis不必再做任何事情,它已经是有序的了:$&redis-cli&zrange&hackers&0&-1
1.&Alan&Turing
2.&Claude&Shannon
3.&Alan&Kay
4.&Richard&Stallman
5.&Yukihiro&Matsumoto
6.&Linus&Torvalds你知道Linus比Yukihiro年轻吗无论如何,我想反向对这些元素排序,这次就用&&代替&&吧:$&redis-cli&zrevrange&hackers&0&-1
1.&Linus&Torvalds
2.&Yukihiro&Matsumoto
3.&Richard&Stallman
4.&Alan&Kay
5.&Claude&Shannon
6.&Alan&Turing一个非常重要的小贴士,ZSets只是有一个“默认的”顺序,但你仍然可以用&&命令对有序集合做不同的排序(但这次服务器要耗费CPU了)。要想得到多种排序,一种可选方案是同时将每个元素加入多个有序集合。区间操作有序集合之能不止于此,他能在区间上操作。例如获取所有1950年之前出生的人。我们用&&命令来做:$&redis-cli&zrangebyscore&hackers&-inf&1950
1.&Alan&Turing
2.&Claude&Shannon
3.&Alan&Kay我们请求Redis返回score介于负无穷到1950年之间的元素(两个极值也包含了)。也可以删除区间内的元素。例如从有序集合中删除生日介于年之间的黑客。$&redis-cli&zremrangebyscore&hackers&
(integer)&2&这个名字虽然不算好,但他却非常有用,还会返回已删除的元素数量。回到Reddit的例子最后,回到 Reddit的例子。现在我们有个基于有序集合的像样方案来生成首页。用一个有序集合来包含最近几天的新闻(用 ZREMRANGEBYSCORE 不时的删除旧新闻)。用一个后台任务从有序集合中获取所有元素,根据用户投票和新闻时间计算score,然后用新闻IDs和scores关联生成&reddit.home.page&有序集合。要显示首页,我们只需闪电般的调用&ZRANGE。不时的从&reddit.home.page&有序集合中删除过旧的新闻也是为了让我们的系统总是工作在有限的新闻集合之上。更新有序集合的scores结束这篇指南之前还有最后一个小贴士。有序集合scores可以在任何时候更新。只要用 ZADD 对有序集合内的元素操作就会更新它的score(和位置),时间复杂度是O(log(N)),因此即使大量更新,有序集合也是合适的。这篇指南远未尽言,这只是从Redis开始的基础,欲深入之请读文档。谢谢阅读。Salvatore。来源:本文转自:/html/3202.html?ref=rediszt
关键词阅读:&&

我要回帖

更多关于 jquery setvalue 的文章

 

随机推荐