找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5315|回复: 0

Redis学习手册(String数据类型)

[复制链接]
发表于 2012-4-18 13:49:02 | 显示全部楼层 |阅读模式
一、概述:

      字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

二、相关命令列表:
命令原型
时间复杂度
命令描述
返回值
APPENDkey value
O(1)
如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。
追加后Value的长度。
DECR key
O(1)
将指定Key的Value原子性的递减1。如果该Key不存在,其初始值为0,在decr之后其值为-1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。
递减后的Value值。
INCR key
O(1)
将指定Key的Value原子性的递增1。如果该Key不存在,其初始值为0,在incr之后其值为1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。
递增后的Value值。
DECRBYkey decrement  
O(1)
将指定Key的Value原子性的减少decrement。如果该Key不存在,其初始值为0,在decrby之后其值为-decrement。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。
减少后的Value值。
INCRBYkey increment
O(1)
将指定Key的Value原子性的增加increment。如果该Key不存在,其初始值为0,在incrby之后其值为increment。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。
增加后的Value值。
GET key
O(1)
获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。
与该Key相关的Value,如果该Key不存在,返回nil。
SET key value
O(1)
设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值。
总是返回"OK"。
GETSETkey value
O(1)
原子性的设置该Key为指定的Value,同时返回该Key的原有值。和GET命令一样,该命令也只能处理string Value,否则Redis将给出相关的错误信息。
返回该Key的原有值,如果该Key之前并不存在,则返回nil。
STRLENkey
O(1)
返回指定Key的字符值长度,如果Value不是string类型,Redis将执行失败并给出相关的错误信息。
返回指定Key的Value字符长度,如果该Key不存在,返回0。
SETEX key seconds value
O(1)
原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。该命令主要应用于Redis被当做Cache服务器使用时。

SETNX key value
O(1)
如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。
1表示设置成功,否则0。
SETRANGEkey offset value
O(1)
替换指定Key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,其中如果offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量的0x00,之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。鉴于字符串Value的最大长度为512M,因此offset的最大值为536870911。最后需要注意的是,如果该命令在执行时致使指定Key的原有值长度增加,这将会导致Redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。
修改后的字符串Value长度。
GETRANGEkey start end
O(1)
如果截取的字符串长度很短,我们可以该命令的时间复杂度视为O(1),否则就是O(N),这里N表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。
子字符串
SETBITkey offset value
O(1)
设置在指定Offset上BIT的值,该值只能为1或0,在设定后该命令返回该Offset上原有的BIT值。如果指定Key不存在,该命令将创建一个新值,并在指定的Offset上设定参数中的BIT值。如果Offset大于Value的字符长度,Redis将拉长Value值并在指定Offset上设置参数中的BIT值,中间添加的BIT值为0。最后需要说明的是Offset值必须大于0。
在指定Offset上的BIT原有值。
GETBITkey offset
O(1)
返回在指定Offset上BIT的值,0或1。如果Offset超过string value的长度,该命令将返回0,所以对于空字符串始终返回0。
在指定Offset上的BIT值。
MGET key [key ...]
O(N)
N表示获取Key的数量。返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。
返回一组指定Keys的Values的列表。
MSET key value [key value ...]
O(N)
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。
该命令不会失败,始终返回OK。  
MSETNXkey value [key value ...]
O(N)
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SETNX命令。然而这里需要明确说明的是,如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。
1表示所有Keys都设置成功,0则表示没有任何Key被修改。
三、命令示例:
  1.    1. SET/GET/APPEND/STRLEN:
  2.     /> redis-cli   #执行Redis客户端工具。
  3.     redis 127.0.0.1:6379> exists mykey                   #判断该键是否存在,存在返回1,否则返回0。
  4.     (integer) 0
  5.     redis 127.0.0.1:6379> append mykey "hello"      #该键并不存在,因此append命令返回当前Value的长度。
  6.     (integer) 5
  7.     redis 127.0.0.1:6379> append mykey " world"    #该键已经存在,因此返回追加后Value的长度。
  8.     (integer) 11
  9.     redis 127.0.0.1:6379> get mykey                      #通过get命令获取该键,以判断append的结果。
  10.     "hello world"
  11.     redis 127.0.0.1:6379> set mykey "this is a test" #通过set命令为键设置新值,并覆盖原有值。
  12.     OK
  13.     redis 127.0.0.1:6379> get mykey
  14.     "this is a test"
  15.     redis 127.0.0.1:6379> strlen mykey                  #获取指定Key的字符长度,等效于C库中strlen函数。
  16.     (integer) 14
  17.     2. INCR/DECR/INCRBY/DECRBY:
  18.     redis 127.0.0.1:6379> set mykey 20     #设置Key的值为20
  19.     OK
  20.     redis 127.0.0.1:6379> incr mykey         #该Key的值递增1
  21.     (integer) 21
  22.     redis 127.0.0.1:6379> decr mykey        #该Key的值递减1
  23.     (integer) 20
  24.     redis 127.0.0.1:6379> del mykey          #删除已有键。
  25.     (integer) 1
  26.     redis 127.0.0.1:6379> decr mykey        #对空值执行递减操作,其原值被设定为0,递减后的值为-1
  27.     (integer) -1
  28.     redis 127.0.0.1:6379> del mykey   
  29.     (integer) 1
  30.     redis 127.0.0.1:6379> incr mykey        #对空值执行递增操作,其原值被设定为0,递增后的值为1
  31.     (integer) 1
  32.     redis 127.0.0.1:6379> set mykey hello #将该键的Value设置为不能转换为整型的普通字符串。
  33.     OK
  34.     redis 127.0.0.1:6379> incr mykey        #在该键上再次执行递增操作时,Redis将报告错误信息。
  35.     (error) ERR value is not an integer or out of range
  36.     redis 127.0.0.1:6379> set mykey 10
  37.     OK
  38.     redis 127.0.0.1:6379> decrby mykey 5
  39.     (integer) 5
  40.     redis 127.0.0.1:6379> incrby mykey 10
  41.     (integer) 15
  42.     3. GETSET:
  43.     redis 127.0.0.1:6379> incr mycounter      #将计数器的值原子性的递增1
  44.     (integer) 1
  45.     #在获取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成。
  46.     redis 127.0.0.1:6379> getset mycounter 0  
  47.     "1"
  48.     redis 127.0.0.1:6379> get mycounter       #查看设置后的结果。
  49.     "0"
  50.             
  51.     4. SETEX:
  52.     redis 127.0.0.1:6379> setex mykey 10 "hello"   #设置指定Key的过期时间为10秒。
  53.     OK   
  54.     #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期。
  55.     redis 127.0.0.1:6379> ttl mykey                       
  56.     (integer) 4
  57.     redis 127.0.0.1:6379> get mykey                      #在该键的存活期内我们仍然可以获取到它的Value。
  58.     "hello"
  59.     redis 127.0.0.1:6379> ttl mykey                        #该ttl命令的返回值显示,该Key已经过期。
  60.     (integer) 0
  61.     redis 127.0.0.1:6379> get mykey                      #获取已过期的Key将返回nil。
  62.     (nil)
  63.    5. SETNX:
  64.     redis 127.0.0.1:6379> del mykey                      #删除该键,以便于下面的测试验证。
  65.     (integer) 1
  66.     redis 127.0.0.1:6379> setnx mykey "hello"        #该键并不存在,因此该命令执行成功。
  67.     (integer) 1
  68.     redis 127.0.0.1:6379> setnx mykey "world"       #该键已经存在,因此本次设置没有产生任何效果。
  69.     (integer) 0
  70.     redis 127.0.0.1:6379> get mykey                      #从结果可以看出,返回的值仍为第一次设置的值。
  71.     "hello"
  72.     6. SETRANGE/GETRANGE:
  73.     redis 127.0.0.1:6379> set mykey "hello world"       #设定初始值。
  74.     OK
  75.     redis 127.0.0.1:6379> setrange mykey 6 dd          #从第六个字节开始替换2个字节(dd只有2个字节)
  76.     (integer) 11
  77.     redis 127.0.0.1:6379> get mykey                         #查看替换后的值。
  78.     "hello ddrld"
  79.     redis 127.0.0.1:6379> setrange mykey 20 dd        #offset已经超过该Key原有值的长度了,该命令将会在末尾补0。
  80.     (integer) 22
  81.     redis 127.0.0.1:6379> get mykey                           #查看补0后替换的结果。
  82.     "hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
  83.     redis 127.0.0.1:6379> del mykey                         #删除该Key。
  84.     (integer) 1
  85.     redis 127.0.0.1:6379> setrange mykey 2 dd         #替换空值。
  86.     (integer) 4
  87.     redis 127.0.0.1:6379> get mykey                        #查看替换空值后的结果。
  88.     "\x00\x00dd"   
  89.     redis 127.0.0.1:6379> set mykey "0123456789"   #设置新值。
  90.     OK
  91.     redis 127.0.0.1:6379> getrange mykey 1 2      #截取该键的Value,从第一个字节开始,到第二个字节结束。
  92.     "12"
  93.     redis 127.0.0.1:6379> getrange mykey 1 20   #20已经超过Value的总长度,因此将截取第一个字节后面的所有字节。
  94.     "123456789"
  95.     7. SETBIT/GETBIT:
  96.     redis 127.0.0.1:6379> del mykey
  97.     (integer) 1
  98.     redis 127.0.0.1:6379> setbit mykey 7 1       #设置从0开始计算的第七位BIT值为1,返回原有BIT值0
  99.     (integer) 0
  100.     redis 127.0.0.1:6379> get mykey                #获取设置的结果,二进制的0000 0001的十六进制值为0x01
  101.     "\x01"
  102.     redis 127.0.0.1:6379> setbit mykey 6 1       #设置从0开始计算的第六位BIT值为1,返回原有BIT值0
  103.     (integer) 0
  104.     redis 127.0.0.1:6379> get mykey                #获取设置的结果,二进制的0000 0011的十六进制值为0x03
  105.     "\x03"
  106.     redis 127.0.0.1:6379> getbit mykey 6          #返回了指定Offset的BIT值。
  107.     (integer) 1
  108.     redis 127.0.0.1:6379> getbit mykey 10        #Offset已经超出了value的长度,因此返回0。
  109.     (integer) 0
  110.    8. MSET/MGET/MSETNX:
  111.     redis 127.0.0.1:6379> mset key1 "hello" key2 "world"   #批量设置了key1和key2两个键。
  112.     OK
  113.     redis 127.0.0.1:6379> mget key1 key2                        #批量获取了key1和key2两个键的值。
  114.     1) "hello"
  115.     2) "world"
  116.     #批量设置了key3和key4两个键,因为之前他们并不存在,所以该命令执行成功并返回1。
  117.     redis 127.0.0.1:6379> msetnx key3 "stephen" key4 "liu"
  118.     (integer) 1
  119.     redis 127.0.0.1:6379> mget key3 key4                  
  120.     1) "stephen"
  121.     2) "liu"
  122.     #批量设置了key3和key5两个键,但是key3已经存在,所以该命令执行失败并返回0。
  123.     redis 127.0.0.1:6379> msetnx key3 "hello" key5 "world"
  124.     (integer) 0
  125.     #批量获取key3和key5,由于key5没有设置成功,所以返回nil。
  126.     redis 127.0.0.1:6379> mget key3 key5                  
  127.     1) "stephen"
  128.     2) (nil)
复制代码



目录:
Redis学习手册(开篇)
http://www.acejoy.com/ace/thread-4288-1-1.html
一、简介
二、Redis的优势
三、目前版本中Redis存在的主要问题
四、和关系型数据库的比较
五、如何持久化内存数据

Redis学习手册(String数据类型)
http://www.acejoy.com/ace/thread-4289-1-1.html
一、概述
二、相关命令列表
三、命令示例

Redis学习手册(List数据类型)
http://www.acejoy.com/ace/thread-4290-1-1.html
一、概述
二、相关命令列表
三、命令示例
四、链表结构的小技巧

Redis学习手册(Set数据类型)
http://www.acejoy.com/ace/thread-4291-1-1.html
一、概述
二、相关命令列表
三、命令示例
四、应用范围

Redis学习手册(Hashes数据类型)
http://www.acejoy.com/ace/thread-4292-1-1.html
一、概述
二、相关命令列表
三、命令示例

Redis学习手册(Sorted-Sets数据类型)
http://www.acejoy.com/ace/thread-4293-1-1.html
一、概述
二、相关命令列表
三、命令示例
四、应用范围

Redis学习手册(Key操作命令)
http://www.acejoy.com/ace/thread-4294-1-1.html
一、概述
二、相关命令列表
三、命令示例

Redis学习手册(事务)
http://www.acejoy.com/ace/thread-4295-1-1.html
一、概述
二、相关命令列表
三、命令示例
四、WATCH命令和基于CAS的乐观锁

Redis学习手册(主从复制)
http://www.acejoy.com/ace/thread-4296-1-1.html
一、Redis的Replication
二、Replication的工作原理
三、如何配置Replication
四、应用示例

Redis学习手册(持久化)
http://www.acejoy.com/ace/thread-4297-1-1.html
一、Redis提供了哪些持久化机制
二、RDB机制的优势和劣势
三、AOF机制的优势和劣势
四、其它

Redis学习手册(虚拟内存)
http://www.acejoy.com/ace/thread-4298-1-1.html
一、简介
二、应用场景
三、配置

Redis学习手册(管线)
http://www.acejoy.com/ace/thread-4299-1-1.html
一、请求应答协议和RTT
二、管线(pipelining)
三、Benchmark

Redis学习手册(服务器管理)
http://www.acejoy.com/ace/thread-4300-1-1.html
一、概述
二、相关命令列表
   
Redis学习手册(内存优化)
http://www.acejoy.com/ace/thread-4301-1-1.html
一、特殊编码
二、BIT和Byte级别的操作
三、尽可能使用Hash

Redis学习手册(实例代码)
http://www.acejoy.com/ace/thread-4302-1-1.html

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 19:18 , Processed in 0.017112 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表