上周六通宵打牌周日白天只睡3小时累成狗,从今天起以后不能玩太大的了,小赌怡情大赌伤身,和同事朋友有空玩玩还是好的。今天公司外面马路上有人挂灯笼时死了一个人,哎,快过年了悲剧又发生了,真是生命是脆弱的。虽然这一两个月贪玩了点,但技术也不能落下,周一到周五下班没事的话有时候也会上网大致了解一些。今天就接着之前的博客继续开始redis之路。

至于什么是redis,它是用来做什么的?它的用处有好多,这里我也不一一列举,以后也会有说明,写redis主要是需求驱动,渐进式的学习,因为前面学习了nginx,导致会有多个地方部署程序,那这样如果用户在A登录了,可能再次访问时又会访问B,但这样B可能会判断同一个用户没有登录,既然对用户透明,这样多次登录也是不好的,而redis就可以解决这个问题。还有我们登录app或下单什么的,经常会收到验证码什么的,有效期有的是120s或60s,虽然用数据库也能实现这样的功能,这样的话就要连接数据库做一系列的逻辑验证,如果用redis就会很简单。这些都是redis的用处。redis有五大数据类型,从今天开始以此学习这几种数据类型。今天就先学习字符串类型。首先说明redis这一系列博客我也是参照别人的博客,然后自己动手敲的,地址http://www.cnblogs.com/stephen-liu74/archive/2012/04/16/2370212.html的内容是学习五大类型主要模仿的对象,大家可以看上面地址的博客。

一、前戏

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

二、理论

命令原型
时间复杂度 命令描述 返回值
APPEND key 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值。 
DECRBY key decrement   O(1)   将指定Key的Value原子性的减少decrement。如果该Key不存在,其初始值为0,在decrby之后其值为-decrement。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。  减少后的Value值。
INCRBY key 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"。
GETSET key value O(1)  原子性的设置该Key为指定的Value,同时返回该Key的原有值。和GET命令一样,该命令也只能处理string Value,否则Redis将给出相关的错误信息。 返回该Key的原有值,如果该Key之前并不存在,则返回nil。
STRLEN key O(1) 返回指定Key的字符值长度,如果Value不是string类型,Redis将执行失败并给出相关的错误信息。 返回指定Key的Value字符长度,如果该Key不存在,返回0。
SETEX key seconds value O(1) 原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。该命令主要应用于Redis被当做Cache服务器使用时。 #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期.在Redis 2.8以后,当key不存在时,返回-2。
SETNX key value  O(1)  如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。 1表示设置成功,否则0。
SETRANGE key 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长度。
GETRANGE key start end O(1)  如果截取的字符串长度很短,我们可以该命令的时间复杂度视为O(1),否则就是O(N),这里N表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。 子字符串 
SETBIT key 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原有值。
GETBIT key 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。  
MSETNX key value [key value ...]  O(N) N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SETNX命令。然而这里需要明确说明的是,如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。 1表示所有Keys都设置成功,0则表示没有任何Key被修改。

三、实操

127.0.0.1:> append mykey helloworld
(integer)
127.0.0.1:> get mykey
"helloworld"
127.0.0.1:> set mykey
OK
127.0.0.1:> decr mykey
(integer)
127.0.0.1:> incr mykey
(integer)
127.0.0.1:> decrby mykey -
(integer)
127.0.0.1:> incrby mykey -
(integer)
127.0.0.1:> strlen mykey
(integer)
127.0.0.1:> setex mykey ***
OK
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer) -
127.0.0.1:> setnx mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setnx mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
"1234\x00\x003"
127.0.0.1:> getrange mykey
"4\x00"
127.0.0.1:> getrange mykey
""
127.0.0.1:> del mykey
(integer)
127.0.0.1:> get mykey
(nil)
127.0.0.1:> setbit mykey
(integer)
127.0.0.1:> get mykey
"\x01"
127.0.0.1:> set mykey
(error) ERR syntax error
127.0.0.1:> setbit mykey
(integer)
127.0.0.1:> get mykey
"\x03"
127.0.0.1:> getbit mykey
(integer)
127.0.0.1:> getbit mykey
(integer)
127.0.0.1:> del mykey
(integer)
127.0.0.1:> get mykey
(nil)
127.0.0.1:> mset mykey a mykey1 b
OK
127.0.0.1:> mget mykey mykey1
) "a"
) "b"
127.0.0.1:> msetnx mykey2 c mykey3 d
(integer)
127.0.0.1:> mget mykey mykey1 mykey2 mykey3
) "a"
) "b"
) "c"
) "d"
127.0.0.1:> msetnx mykey e mykey4 f
(integer)
127.0.0.1:> mget mykey mykey4
) "a"
) (nil)
127.0.0.1:>

C#Redis字符串的更多相关文章

  1. redis字符串

    字符串类型是redis的基本类型 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:COMMAND KEY_NAME SET 和GET用于设置和读取key的值 1.SET key ...

  2. Redis 字符串(String)

      Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 12 ...

  3. 2016022608 - redis字符串命令集合

    redis字符串命令: Redis字符串命令用于在Redis管理字符串值.使用Redis字符串命令的语法如下所示: redis 127.0.0.1:6379> COMMAND KEY_NAME ...

  4. redis 字符串

    redis 字符串 概述 redis 没有使用 c 语言风格的字符串表示(以 "\0" 作为结尾), 而是使用自定义的 sds 结构 字符串结构 定义位置 (src/sds.h) ...

  5. redis 字符串的管理的一点理解

    redis字符串可以实现通过地址偏移找到所在结构体的首地址,struct sdshdr *sh = (void *)(s - (sizeof(struct sdshdr))) 也就是通过buf地址可以 ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. Redis 字符串(String)

    Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...

  8. redis字符串基本操作

    redis之字符串类型: 字符串类型是redis中最基本的数据类型,同时它也是memcached中仅有的数据类型.redis字符串类型的键能存储任何形式的字符串,包括二进制数据,例如,存储json化的 ...

  9. Redis字符串(STRING)中BIT相关命令

    上篇文章我们对STRING数据类型中一些基本的命令进行了介绍,但是没有涉及到BIT相关的命令,本文我们就来看看几个和BIT相关的命令. 本文是Redis系列的第四篇文章,了解前面的文章有助于更好的理解 ...

  10. Redis字符串键的底层原理

    before C语言基础 Redis基础 导入 redis的命令如下: set x "hello"; get x; hello Redis作为一种存储字符串的缓存结构,其具体实现是 ...

随机推荐

  1. 《STL源代码剖析》---stl_hash_set.h阅读笔记

    STL仅仅规定接口和复杂度,对于详细实现不作要求.set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现.hash_set的接口,hash_tabl ...

  2. J2EE总结(2)——Servlet/JSP

    Servlet/JSP Servlet定义:部署在java的Webserver上的组件.整个java服务端程序都构建在Servlet之上,以多线程方式提 供服务,具有效率高.可扩展,可移植的特点. J ...

  3. dos下的cd指令

    进入同根目录下的目录: 1.进入同根目录的下一级目录:cd 目录名 2.返回同根目录的上一级目录:cd .. 3.返回目录的根目录:cd \ 进入不同根目录下的目录: 1.进入另外一个根目录(的默认目 ...

  4. 【转】Android Application 对象介绍

    What is Application Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application ...

  5. [转]网上看到的关于C中内存分配的描述

    1栈   -   有编译器自动分配释放     2堆   -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收     3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始 ...

  6. poj3519 Lucky Coins Sequence矩阵快速幂

    Lucky Coins Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...

  7. android通过程序收起通知栏

    1.  添加权限 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> 2. ...

  8. PHP实现一个简单url路由功能

    如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的 ...

  9. mvc的验证

    mvc的验证锦上添点花(2) 上一篇文章我们演示了通过对jquery.validate.unobtrusive.js做点小修改,如何给MVC的验证添点花 主要还是修改了onError与onSucces ...

  10. 从MSSQL server 2005中移植数据到Oracle 10g

    body, p, th, td, li, ul, ol, h1, h2, h3, h4, h5, h6, pre { font-family: simsun; line-height: 1.4; } ...