一. 字符串对象编码

  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系列10:HyperLogLog实现海量数据基数统计

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

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

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

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

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

  4. redis 系列13 集合对象

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

  5. redis 系列11 列表对象

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

  6. 【目录】redis 系列篇

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

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

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

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

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

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

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

随机推荐

  1. Nastya Is Buying Lunch

    At the big break Nastya came to the school dining room. There are nn pupils in the school, numbered ...

  2. quartz之CronExpression表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(~).分钟(~).小时(~).天(月)(~,但是你需要考虑你月的天数).月(~).天(星期)(~ =SUN 或 SU ...

  3. Xcode 10.1 运行老版本工程遇到问题解决记录

    近来接手公司一个历史遗留项目进行修改.上线工作,想想我都近三年没敲过iOS代码了也是慌.. 项目大致情况: 18年年初应上线项目,各种情况下一直搁置,到18年底了要重启上线,原来开发人员离职了都,年底 ...

  4. Spark环境搭建(五)-----------Spark生态圈概述与Hadoop对比

    Spark:快速的通用的分布式计算框架 概述和特点: 1) Speed,(开发和执行)速度快.基于内存的计算:DAG(有向无环图)的计算引擎:基于线程模型: 2)Easy of use,易用 . 多语 ...

  5. [Tips]vim设置

    临时设置 在vim中输入 :set nu! 若显示行号时,它的功能时取消行号:若不显示行号时,它的功能是显示行号. 固定设置 在~/.vimrc中进行设置. 添加注释: 双引号是注释 ” this i ...

  6. 安装JAVA jdk

      下载软件包,jdk-10.0.1_windows-x64_bin 根据提示一步步安装.安装完成之后,配置环境. 控制面板——>系统——>编辑系统变量 ​ 4. 系统变量 增加path变 ...

  7. java 新手指南

    Java新手指南 不小心走上了一条不归路的我 因为对可视化感兴趣,然后学了MFC,发现MFC好麻烦啊,不如开发APP吧,刚学开发APP,艹,居然是用java做开发,那只好学java了,,呜呜,不知道什 ...

  8. 小程序重新封装打印函数console.log

    习惯性使用console.log打印获取到的数据,信息等,然后上星期大佬看见了说怎么那么多打印信息出来,线上那个也是吗?问我能不能线上的就不打印出来? 我就说那就封装一个打印函数呗. 重写一个没问题, ...

  9. 记一次Dynamic Batching不生效的爬坑实例分析[Unity]

    最近在项目开发过程中,无意发现游戏场景的绘制占用了大量的Batches,几乎一个模型显示就占用了一个Batch,而Saved by batching数量几乎为0,即没有任何合批渲染优化.这显然跟预期相 ...

  10. docker container(容器)

    docker 容器 Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用 容器是从镜像创建的应用运行实例.它可以启动,开始,停止,删除,而这些容器都是彼此相互隔离,互不可见的. ...