一. 字符串对象编码

  Redis中字符串可以存储3种类型,分别是字节串(byte string)、整数、浮点数在上章节中讲到字符串对象的编码可以是int, raw,embstr。 如果一个字符串对象保存的是整数值,那么对象RedisObject结构的ptr 属性里面将void*转换成long,字符串对象的编码设置为int。

  例1: 使用set命令,创建一个int编码的字符串对象。

    127.0.0.1:> set num1
OK
127.0.0.1:> object encoding num1
"int"

  RedisObject结构中ptr指向一个long值,参考图如下所示:

  例2: 使用set命令,创建一个raw编码的字符串对象。这个字符串值的长度大于32字节。

    127.0.0.1:> set story3 "long long long long long long long long long ..."
OK
127.0.0.1:> strlen story3
(integer)
127.0.0.1:> object encoding story3
"raw"

    RedisObject结构中ptr指向SDS的sdshdr结构, 参考图如下所示:

  例3: 使用set命令,创建一个embstr编码的字符串对象, 这个字符串值的长度小于等于32字节。

    127.0.0.1:> set story4 "long long long long long lon"
OK
127.0.0.1:> strlen story4
(integer)
127.0.0.1:> object encoding story4
"embstr"

    embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用RedisObject结构和sdshdr结构来表示字符串对象。使用embstr编码的字符串对象来保存短字符串值有以下好处: 

(1) embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次。

(2) 释放embstr编码的字符串对象只需要调用一次内存释放函数。而raw编码的为二次。

(3) embstr编码的字符串对象的所有数据都保存在一块连续的内存中,能更好的带来缓存优势。

  例4: 使用set命令,创建一个浮点数,也是作为字符串保存,属于embstr编码的字符串对象。

    127.0.0.1:> set pi 3.14
OK
127.0.0.1:> object encoding pi
"embstr"

    最后:总结字符串对象保存各类型值的编码方式

字符串对象值 编码
可以用long类型保存的整数 int
可以用long double类型保存的浮点数 Embstr或者raw
值长度太长而没办法用long类型表示的整数,或者浮点数。 Embstr或者raw
值的长度大于32字节 raw
长度小于32字节 Embstr

二. key命令  

 -- del命令 删除存在的key, 如果没有存在的key返回0。
127.0.0.1:> del msg
(integer) 1
-- dump命令 序列化给定 key, 如果 key 不存在, 那么返回 nil,否则返回序列化之后的值。
127.0.0.1:> dump msg
"\x00\x05hello\b\x00\xda_3\xc9\xcc-\xaa2"
-- EXISTS命令 用于检查给定 key 是否存在, 若 key 存在返回 ,否则返回 。
127.0.0.1:> exists msg
(integer) 1
-- Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。设置成功返回1。下面设置了过期时间为 分钟,1分钟后该键会自动删除。
127.0.0.1:> expire msg
(integer) 1
-- pattern 命令用于查找所有符合给定模式,返回符合给定模式的 key 列表 (Array)。
127.0.0.1:> set msg1
OK
127.0.0.1:> set msg2
OK
127.0.0.1:> set msg3
OK
127.0.0.1:> keys msg*
) "msg2"
) "msg1"
) "msg3"
-- PERSIST 命令用于移除给定 key 的过期时间,使得 key 永不过期。
-- Pttl 命令以毫秒为单位返回 key 的剩余过期时间。
-- ttl 命令以秒为单位返回 key 的剩余过期时间。
127.0.0.1:> expire msg1
(integer)
127.0.0.1:> ttl msg1
(integer)
127.0.0.1:> persist msg1
(integer)
127.0.0.1:> ttl msg1
(integer) -1
-- RANDOMKEY 命令从当前数据库中随机返回一个 key
127.0.0.1:> RANDOMKEY
"fruit-price"
-- Rename 命令用于修改 key 的名称
127.0.0.1:> rename msg1 msg1new
OK
-- Renamenx 命令修改 key名称,新的key没有存已有数据库中时,修改成功.返回1.
127.0.0.1:> get msg2
""
127.0.0.1:> get msg3
""
127.0.0.1:> renamenx msg2 msg3
(integer)
127.0.0.1:> renamenx msg2 msg4
(integer)  

其它:
  MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
  -- type 命令用于返回 key 所储存的值的类型
  none (key不存在),string (字符串),list (列表),set (集合),zset (有序集),hash (哈希表)

 

三.字符串对象命令

 --  set命令指定 key 的值
-- get 命令获取指定 key 的值
-- GETRANGE返回 key 中字符串值的子字符
127.0.0.1:> set msg "hello"
OK
127.0.0.1:> getrange msg
"hel" -- getset 命令将给定 key 的值重新设置 value ,并返回 key 的旧值(old value)
127.0.0.1:> getset msg "hi"
"hello"
127.0.0.1:> get msg
"hi" -- MGET 命令获取所有(一个或多个)给定 key 的值
127.0.0.1:> mget msg msg3
) "hi"
) "" -- setex 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
127.0.0.1:> setex message "hello"
OK
127.0.0.1:> get message
"hello"
127.0.0.1:> get message
(nil) 10秒后 -- setnx命令 只有在 key 不存在时设置 key 的值, 下面msg键存在,设置失败返回0,msg1键不存在,设置成功,返回1
127.0.0.1:> setnx msg "hello"
(integer)
127.0.0.1:> setnx msg1 "hello"
(integer) -- setrange 命令用value参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
127.0.0.1:> set msg "hello"
OK
127.0.0.1:> setrange msg "i..."
(integer)
127.0.0.1:> get msg
"hi..." -- strlen 命令返回 key 所储存的字符串值的长度。
127.0.0.1:> strlen msg
(integer) -- mset 命令同时设置一个或多个 key-value 对。
127.0.0.1:> mset msg "hi" msg2 "hi"
OK
127.0.0.1:> mget msg msg2
) "hi"
) "hi" -- msetnx命令同时设置一个或多个 key-value 对,所有给定 key 都必须不存在, 只要存在一个已有的key,所有添加失败。
127.0.0.1:> msetnx msg6 "hello" msg5 "hello"
(integer)
127.0.0.1:> mget msg6 msg5
) "hello"
) "hello" -- psetex命令 它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
127.0.0.1:> psetex msg5 "hi"
OK
127.0.0.1:> get msg5
"hi"
127.0.0.1:> get msg5
(nil) 5秒后 -- Incr 命令将 key 中储存的数字值增一。
127.0.0.1:> set num
OK
127.0.0.1:> incr num
(integer)
127.0.0.1:> get num
"" -- Incrby 命令将 key 中储存的数字加上指定的增量值。在值为2是加10。
127.0.0.1:> incrby num
(integer)
127.0.0.1:> get num
"" -- Decrby 命令将 key 所储存的值减去指定的减量值。将值为12 减去10。
127.0.0.1:> decrby num
(integer)
127.0.0.1:> get num
"" -- Append 命令用于为指定的 key 追加值。
127.0.0.1:> set msg "hello"
OK
127.0.0.1:> append msg "world"
(integer)
127.0.0.1:> get msg
"helloworld"

redis 系列10 字符串对象的更多相关文章

  1. 关于Redis中的字符串对象

    一.SDS redis中定义Object types有5种 /* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define ...

  2. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

    一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...

  3. redis 系列13 集合对象

    一. 集合对象概述 这里的集合是string类型的无序集合,在集合对象中集合成员是唯一的,这就意味着集合中不能出现重复的数据.集合是通过哈希表实现的,集合中最大的成员数为 232-1 (4294967 ...

  4. redis 系列11 列表对象

    一. 列表对象概述 Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边).一个列表最多可以包含 232 - 1 个元素 (4294967295, ...

  5. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  6. Redis系列一之《Redis设计与实践》整体观感

    笔者别的Redis方面的书没有读过,读完这一本,力荐,作者黄建宏,对Redis不太熟悉的,但是对编程稍微有些基础的,全部 读下来应该无压力.作者的编写和讲解非常详细,覆盖的面基本上都讲到,之前一直都是 ...

  7. redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系

    一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...

  8. redis 系列14 有序集合对象

    一. 有序集合概述 Redis 有序集合对象和集合对象一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员 ...

  9. redis 系列3 数据结构之简单动态字符串 SDS

    一.  SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默 ...

随机推荐

  1. 【BZOJ2428】[HAOI2006]均分数据

    Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第 ...

  2. Android CTS測试Fail项改动总结(四)

    Android5.1上的測试 1.android.security.cts.SELinuxDomainTest# testInitDomain fail 打印的log junit.framework. ...

  3. Thinkphp 3.2中文章详情页的上一篇 下一篇文章功能

      额 简单2句话解释下 获取上一篇文章的原理,其实就是以当前文章的id为起点进行进行查询,例如id=5的文章 select * from article where (article_id<5 ...

  4. 用sklearn 实现linear regression

    基本的regression算法有四种方法可以实现,分别是下面四种 LinearRegressionRidge (L2 regularization)Lasso (L1 regularization)E ...

  5. 1.使用脚本控制模型的移动 --《Unity 3D 游戏开发》笔记

    由于最新版的unity已经不支持javascript语言啦,本人又是个C#小白,所以记录一下自己写的脚本. first 创建一个模型,放在平面上,调整下角度,就像这样: 然后写一个脚本来控制模型移动: ...

  6. POJ 1056 IMMEDIATE DECODABILITY 【Trie树】

    <题目链接> 题目大意:给你几段只包含0,1的序列,判断这几段序列中,是否存在至少一段序列是另一段序列的前缀. 解题分析: Trie树水题,只需要在每次插入字符串,并且在Trie树上创建节 ...

  7. Mac下RabbitMQ安装和在Java client端的使用

    安装: 1.使用homebrew下载rabbitMQ: brew install rabbitmq 执行结果如下: Updating Homebrew... ==> Auto-updated H ...

  8. MIT-6.824 MapReduce

    概述 MapReduce是由JeffreyDean提出的一种处理大数据的编程模型,用户定义map和reduce函数,map函数处理原始数据生成一系列键值对中间数据,reduce函数并合相同key的键值 ...

  9. tplink 703刷固件

    1.软件下载: ImageBuilder链接 如果是全新刷机的话,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/open ...

  10. Azure 11 月新公布

    Azure 11 月新发布:Apple FairPlay Streaming, 应用服务(App Service), 虚拟机规模集(VMSS) Azure 媒体服务的 Apple FairPlay S ...